diff --git a/package-lock.json b/package-lock.json index d07935a..5c0117b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@aws-sdk/s3-request-presigner": "^3.1073.0", "@clerk/nextjs": "^7.5.7", "@prisma/client": "^5.22.0", + "bcryptjs": "^3.0.3", "next": "^15.5.19", "qrcode": "^1.5.4", "react": "19.2.4", @@ -20,6 +21,7 @@ }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@types/bcryptjs": "^2.4.6", "@types/node": "^20", "@types/qrcode": "^1.5.6", "@types/react": "^19", @@ -2062,6 +2064,13 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.9", "dev": true, @@ -3038,6 +3047,15 @@ "dev": true, "license": "MIT" }, + "node_modules/bcryptjs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, "node_modules/bowser": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", diff --git a/package.json b/package.json index 6671070..795c8b4 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@aws-sdk/s3-request-presigner": "^3.1073.0", "@clerk/nextjs": "^7.5.7", "@prisma/client": "^5.22.0", + "bcryptjs": "^3.0.3", "next": "^15.5.19", "qrcode": "^1.5.4", "react": "19.2.4", @@ -25,6 +26,7 @@ }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@types/bcryptjs": "^2.4.6", "@types/node": "^20", "@types/qrcode": "^1.5.6", "@types/react": "^19", diff --git a/prisma/migrations/20260729165425_add_admin_and_code/migration.sql b/prisma/migrations/20260729165425_add_admin_and_code/migration.sql new file mode 100644 index 0000000..9e78a62 --- /dev/null +++ b/prisma/migrations/20260729165425_add_admin_and_code/migration.sql @@ -0,0 +1,40 @@ +-- CreateEnum +CREATE TYPE "Role" AS ENUM ('SUPER_ADMIN', 'ADMIN'); + +-- CreateTable +CREATE TABLE "AdminUser" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "passwordHash" TEXT NOT NULL, + "role" "Role" NOT NULL DEFAULT 'ADMIN', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AdminUser_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Code" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "createdById" TEXT NOT NULL, + "usedByUserId" TEXT, + "usedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Code_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "AdminUser_username_key" ON "AdminUser"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "Code_code_key" ON "Code"("code"); + +-- CreateIndex +CREATE INDEX "Code_code_idx" ON "Code"("code"); + +-- CreateIndex +CREATE INDEX "Code_usedByUserId_idx" ON "Code"("usedByUserId"); + +-- AddForeignKey +ALTER TABLE "Code" ADD CONSTRAINT "Code_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "AdminUser"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index bcc8fb0..6504a95 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -35,4 +35,31 @@ model Image { createdAt DateTime @default(now()) @@index([userId]) +} + +enum Role { + SUPER_ADMIN + ADMIN +} + +model AdminUser { + id String @id @default(cuid()) + username String @unique + passwordHash String + role Role @default(ADMIN) + createdAt DateTime @default(now()) + createdCodes Code[] +} + +model Code { + id String @id @default(cuid()) + code String @unique + createdById String + createdBy AdminUser @relation(fields: [createdById], references: [id]) + usedByUserId String? + usedAt DateTime? + createdAt DateTime @default(now()) + + @@index([code]) + @@index([usedByUserId]) } \ No newline at end of file