From 1609422ff00f1c7d67d8f1fffbf0bbdc702f8140 Mon Sep 17 00:00:00 2001 From: Tanner Shaw Date: Tue, 5 Sep 2023 16:25:57 -0500 Subject: [PATCH] feature(claimcodes) claimcodes now have a UNIX time to be claimed and an amount of time they can be used --- package-lock.json | 32 ++++++++++++++++---------------- package.json | 4 ++-- prisma/schema.prisma | 2 ++ src/data/db.ts | 3 +-- src/endpoints/index.ts | 21 +++++++++++++++++---- 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index e30a621..1424ae1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@ethersproject/keccak256": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@faker-js/faker": "^8.0.2", - "@prisma/client": "^5.0.0", + "@prisma/client": "^5.2.0", "body-parser": "^1.20.2", "cors": "^2.8.5", "discreetly-claimcodes": "^1.1.5", @@ -44,7 +44,7 @@ "eslint": "^8.46.0", "jest": "^29.6.2", "nodemon": "^3.0.1", - "prisma": "^5.1.1", + "prisma": "^5.2.0", "rollup": "^3.26.2", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-include-sourcemaps": "^0.7.0", @@ -1670,12 +1670,12 @@ } }, "node_modules/@prisma/client": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.0.0.tgz", - "integrity": "sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.2.0.tgz", + "integrity": "sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584" + "@prisma/engines-version": "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f" }, "engines": { "node": ">=16.13" @@ -1690,16 +1690,16 @@ } }, "node_modules/@prisma/engines": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.1.1.tgz", - "integrity": "sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.2.0.tgz", + "integrity": "sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==", "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz", - "integrity": "sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==" + "version": "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f.tgz", + "integrity": "sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==" }, "node_modules/@rollup/plugin-commonjs": { "version": "25.0.2", @@ -6463,13 +6463,13 @@ } }, "node_modules/prisma": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.1.1.tgz", - "integrity": "sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.2.0.tgz", + "integrity": "sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "5.1.1" + "@prisma/engines": "5.2.0" }, "bin": { "prisma": "build/index.js" diff --git a/package.json b/package.json index f85abac..22df0bc 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@ethersproject/keccak256": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@faker-js/faker": "^8.0.2", - "@prisma/client": "^5.0.0", + "@prisma/client": "^5.2.0", "body-parser": "^1.20.2", "cors": "^2.8.5", "discreetly-claimcodes": "^1.1.5", @@ -58,7 +58,7 @@ "eslint": "^8.46.0", "jest": "^29.6.2", "nodemon": "^3.0.1", - "prisma": "^5.1.1", + "prisma": "^5.2.0", "rollup": "^3.26.2", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-include-sourcemaps": "^0.7.0", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 962bd17..a495d75 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -36,6 +36,8 @@ model ClaimCodes { claimcode String @unique claimed Boolean @default(false) roomIds String[] @default([]) @db.ObjectId + expiresAt Int + usesLeft Int @default(-1) rooms Rooms[] @relation(fields: [roomIds], references: [id]) } diff --git a/src/data/db.ts b/src/data/db.ts index 07fdbe1..5cd5e0b 100644 --- a/src/data/db.ts +++ b/src/data/db.ts @@ -13,6 +13,7 @@ const prisma = new PrismaClient(); interface CodeStatus { claimed: boolean; roomIds: string[]; + expiresAt: number; } interface RoomsFromClaimCode { @@ -358,7 +359,6 @@ export function createSystemMessages( }); } - export interface BandadaRoom extends RoomI { bandadaAPIKey: string; } @@ -390,7 +390,6 @@ export function removeIdentityFromRoom( limiter == rateCommitmentsToUpdate ? '0' : (limiter as string) ) ?? []; - return prisma.rooms .update({ where: { id: room.id }, diff --git a/src/endpoints/index.ts b/src/endpoints/index.ts index e241248..a6580ca 100644 --- a/src/endpoints/index.ts +++ b/src/endpoints/index.ts @@ -143,7 +143,7 @@ export function initEndpoints(app: Express, adminAuth: RequestHandler) { console.debug('Invite Code:', code); const codeStatus = await findClaimCode(code); - if (!codeStatus || codeStatus.claimed) { + if (!codeStatus || codeStatus.expiresAt < Date.now()) { res.status(400).json({ message: 'Claim code already used' }); return; } @@ -309,13 +309,19 @@ export function initEndpoints(app: Express, adminAuth: RequestHandler) { ['/addcode', '/api/addcode'], adminAuth, asyncHandler(async (req: Request, res: Response) => { - const { numCodes, rooms, all } = req.body as { + const { numCodes, rooms, all, expires } = req.body as { numCodes: number; rooms: string[]; all: boolean; + expires: number; }; + const currentDate = new Date(); + const threeMonthsLater = new Date(currentDate).setMonth(currentDate.getMonth() + 3); + + const codeExpires = expires ? expires : threeMonthsLater const query = all ? undefined : { where: { roomId: { in: rooms } } }; + const codes = genClaimCodeArray(numCodes); return await prisma.rooms.findMany(query).then((rooms) => { const roomIds = rooms.map((room) => room.id); @@ -324,7 +330,8 @@ export function initEndpoints(app: Express, adminAuth: RequestHandler) { data: { claimcode: code.claimcode, claimed: false, - roomIds: roomIds + roomIds: roomIds, + expiresAt: codeExpires } }).then((newCode) => { const updatePromises = rooms.map((room) => { @@ -373,9 +380,14 @@ export function initEndpoints(app: Express, adminAuth: RequestHandler) { adminAuth, (req, res) => { const { roomId } = req.params; - const { numCodes } = req.body as { numCodes: number }; + const { numCodes, expires } = req.body as { numCodes: number, expires: number }; const codes = genClaimCodeArray(numCodes); + const currentDate = new Date(); + const threeMonthsLater = new Date(currentDate).setMonth(currentDate.getMonth() + 3); + + const codeExpires = expires ? expires : threeMonthsLater + prisma.rooms .findUnique({ where: { roomId: roomId }, @@ -392,6 +404,7 @@ export function initEndpoints(app: Express, adminAuth: RequestHandler) { data: { claimcode: code.claimcode, claimed: false, + expiresAt: codeExpires, rooms: { connect: { roomId: roomId