From 4e5c27d9209241f100263621615ce8fffe84d115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Kr=C5=A1ka?= Date: Tue, 3 Sep 2024 15:52:42 +0200 Subject: [PATCH] db points --- .gitignore | 177 +-------------------------------------- bun.lockb | Bin 44387 -> 71764 bytes docker-compose.yml | 22 +++++ drizzle.config.ts | 18 ++++ package.json | 8 +- src/database/db.ts | 7 ++ src/database/schema.ts | 25 ++++++ src/index.ts | 91 +++++++++++++++++--- src/templates/gamble.ejs | 10 +-- src/templates/index.ejs | 4 +- src/templates/person.ejs | 7 +- 11 files changed, 170 insertions(+), 199 deletions(-) create mode 100644 docker-compose.yml create mode 100644 drizzle.config.ts create mode 100644 src/database/db.ts create mode 100644 src/database/schema.ts diff --git a/.gitignore b/.gitignore index 9b1ee42..d6da680 100644 --- a/.gitignore +++ b/.gitignore @@ -1,175 +1,2 @@ -# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore - -# Logs - -logs -_.log -npm-debug.log_ -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Caches - -.cache - -# Diagnostic reports (https://nodejs.org/api/report.html) - -report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json - -# Runtime data - -pids -_.pid -_.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover - -lib-cov - -# Coverage directory used by tools like istanbul - -coverage -*.lcov - -# nyc test coverage - -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) - -.grunt - -# Bower dependency directory (https://bower.io/) - -bower_components - -# node-waf configuration - -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) - -build/Release - -# Dependency directories - -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) - -web_modules/ - -# TypeScript cache - -*.tsbuildinfo - -# Optional npm cache directory - -.npm - -# Optional eslint cache - -.eslintcache - -# Optional stylelint cache - -.stylelintcache - -# Microbundle cache - -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history - -.node_repl_history - -# Output of 'npm pack' - -*.tgz - -# Yarn Integrity file - -.yarn-integrity - -# dotenv environment variable files - -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) - -.parcel-cache - -# Next.js build output - -.next -out - -# Nuxt.js build / generate output - -.nuxt -dist - -# Gatsby files - -# Comment in the public line in if your project uses Gatsby and not Next.js - -# https://nextjs.org/blog/next-9-1#public-directory-support - -# public - -# vuepress build output - -.vuepress/dist - -# vuepress v2.x temp and cache directory - -.temp - -# Docusaurus cache and generated files - -.docusaurus - -# Serverless directories - -.serverless/ - -# FuseBox cache - -.fusebox/ - -# DynamoDB Local files - -.dynamodb/ - -# TernJS port file - -.tern-port - -# Stores VSCode versions used for testing VSCode extensions - -.vscode-test - -# yarn v2 - -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -# IntelliJ based IDEs -.idea - -# Finder (MacOS) folder config -.DS_Store +node_modules +.mysql diff --git a/bun.lockb b/bun.lockb index c3c9d12261ebd982589d897475cb1dc6348cf325..84c9b1c62c782b93ea491faf4e9740cc83a7a114 100755 GIT binary patch delta 25398 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 ({ + points: many(pointsTable) +})); + +export const pointsTable = mysqlTable('points', { + pointsId: int('pointsId').primaryKey().autoincrement(), + personId: int('personId').notNull().references(() => personTable.personId), + points: int('points'), +}); + +export const pointsRelations = relations(pointsTable, ({ one }) => ({ + person: one(personTable, { + fields: [pointsTable.personId], + references: [personTable.personId], + }) +})); diff --git a/src/index.ts b/src/index.ts index c904e62..3e9431f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,9 @@ import express from "express"; import ejs from "ejs"; import multer from "multer"; +import { db } from "./database/db"; +import { eq, sql, sum } from "drizzle-orm"; +import { personTable, pointsTable } from "./database/schema"; const app = express(); const port = 8080; @@ -10,19 +13,29 @@ let people = [ { id: 1, name: "Adam", - secret: "adam" + secret: "adam", + points: [] }, { id: 2, name: "Vojta", - secret: "vojta" + secret: "vojta", + points: [] }, ] //app.use(express.urlencoded); app.use(express.static('www')); -app.get("/", (req, res) => { +app.get("/", async (req, res) => { + const people = await db.select({ + personId: personTable.personId, + name: personTable.name, + pointsTotal: sql`coalesce(sum(${pointsTable.points}), 0)` + }).from(personTable) + .leftJoin(pointsTable, eq(personTable.personId, pointsTable.personId)) + .groupBy(personTable.personId) + ejs.renderFile('src/templates/index.ejs', { people: people }, function (err, str) { if (err) { res.status(500).send(err); @@ -32,8 +45,23 @@ app.get("/", (req, res) => { }); }); -app.get("/gamble", (req, res) => { - ejs.renderFile('src/templates/gamble.ejs', { people: people }, function (err, str) { +app.get("/gamble/:id", async (req, res) => { + let id = parseInt(req.params.id); + if (id == undefined) { + res.status(404).send("Invalid person id"); + return; + } + + let person = await db.query.personTable.findFirst({ + where: eq(personTable.personId, id) + }) + + if (!person) { + res.status(404).send("Invalid person id"); + return; + } + + ejs.renderFile('src/templates/gamble.ejs', { person: person }, function (err, str) { if (err) { res.status(500).send(err); } @@ -42,13 +70,56 @@ app.get("/gamble", (req, res) => { }); }); -app.post("/gamble", upload.none(), (req, res) => { - console.log(req.body); - res.redirect('/'); +app.post("/gamble/:id", upload.none(), async (req, res) => { + let id = parseInt(req.params.id); + if (id == undefined) { + res.status(404).send("Invalid person id"); + return; + } + + let person = await db.query.personTable.findFirst({ + where: eq(personTable.personId, id) + }) + + if (!person) { + res.status(404).send("Invalid person id"); + return; + } + + if (person.secret != req.body['secret']) { + res.sendStatus(403); + return; + } + + await db.insert(pointsTable).values({ + personId: id, + points: req.body['points'] + }) + + res.redirect('/person/' + id); }); -app.get("/person/:id", (req, res) => { - let person = people.find((elem) => elem.id == req.params.id); +app.get("/person/:id", async (req, res) => { + let id = parseInt(req.params.id); + if (id == undefined) { + res.status(404).send("Invalid person id"); + return; + } + + let person = (await db.select({ + personId: personTable.personId, + name: personTable.name, + pointsTotal: sql`coalesce(sum(${pointsTable.points}), 0)` + }).from(personTable) + .leftJoin(pointsTable, eq(personTable.personId, pointsTable.personId)) + .where(eq(personTable.personId, id)) + .groupBy(personTable.personId))[0]; + + if (!person) { + res.status(404).send("Invalid person id"); + return; + } + ejs.renderFile('src/templates/person.ejs', { person: person }, function (err, str) { if (err) { res.status(500).send(err); diff --git a/src/templates/gamble.ejs b/src/templates/gamble.ejs index 6fabde3..a74bab8 100644 --- a/src/templates/gamble.ejs +++ b/src/templates/gamble.ejs @@ -10,11 +10,11 @@ -
-
-
-
-

+ +
+
+
+
diff --git a/src/templates/index.ejs b/src/templates/index.ejs index e3d999c..f1f313a 100644 --- a/src/templates/index.ejs +++ b/src/templates/index.ejs @@ -15,11 +15,11 @@
<% people.forEach((person) => {%> -
<%= person.name %> - <%= person.id %> + <%= person.pointsTotal %>
<% }); %> diff --git a/src/templates/person.ejs b/src/templates/person.ejs index 6a63d0d..0d6f880 100644 --- a/src/templates/person.ejs +++ b/src/templates/person.ejs @@ -11,15 +11,12 @@ Index - gamble + gamble

Name: <%= person.name %>

- Id: <%= person.id %> -

-

- secret: <%= person.secret %> + Points: <%= person.pointsTotal %>