Skip to content
Merged

Dev #47

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .env
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,7 @@ PRISMA_STUDIO_PORT=5555

# MailHog Configuration
MAILHOG_SMTP_PORT=1025
MAILHOG_UI_PORT=8025
MAILHOG_UI_PORT=8025

# Database Connection String for Prisma
DATABASE_URL="postgresql://postgres:password@localhost:5432/time_booking?schema=public"
3 changes: 3 additions & 0 deletions backend/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
//.env file for the backend service

DATABASE_URL="postgresql://postgres:password@localhost:5432/time_booking?schema=public"
5 changes: 3 additions & 2 deletions backend/Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ FROM node:20-alpine AS builder
WORKDIR /app

# Install dependencies first (taking advantage of Docker caching)
COPY package.json package-lock.json ./
COPY package.json ./
COPY tsconfig.json ./
COPY prisma ./prisma/
COPY .env* ./
RUN npm ci
RUN npm install

# Copy Prisma schema to generate client
COPY prisma ./prisma/
COPY .env* ./
RUN npx prisma generate

# Copy the rest of the application
Expand Down
6 changes: 3 additions & 3 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"test": "jest --config jest.config.js"
},
"dependencies": {
"@prisma/client": "^5.15.0",
"@prisma/client": "^6.8.2",
"@types/ioredis": "^4.28.10",
"@types/uuid": "^10.0.0",
"bcrypt": "^5.1.1",
Expand Down Expand Up @@ -49,10 +49,10 @@
"eslint-plugin-prettier": "^5.1.3",
"jest": "^29.7.0",
"prettier": "^3.2.5",
"prisma": "^5.15.0",
"prisma": "^6.8.2",
"ts-jest": "^29.1.4",
"ts-node": "^10.9.1",
"ts-node-dev": "^2.0.0",
"typescript": "^5.4.5"
}
}
}
287 changes: 287 additions & 0 deletions backend/prisma/migrations/20250517195018_init/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,287 @@
-- CreateEnum
CREATE TYPE "UserRole" AS ENUM ('USER', 'ADMIN', 'SUPER_ADMIN');

-- CreateEnum
CREATE TYPE "BookingStatus" AS ENUM ('PENDING', 'CONFIRMED', 'CANCELLED', 'COMPLETED');

-- CreateEnum
CREATE TYPE "WaitlistStatus" AS ENUM ('ACTIVE', 'FULFILLED', 'CANCELLED');

-- CreateEnum
CREATE TYPE "LabStatus" AS ENUM ('ACTIVE', 'MAINTENANCE', 'INACTIVE');

-- CreateEnum
CREATE TYPE "NotificationType" AS ENUM ('BOOKING_CONFIRMATION', 'BOOKING_CANCELLATION', 'WAITLIST_NOTIFICATION', 'GENERAL_ANNOUNCEMENT', 'SLOT_AVAILABLE', 'SYSTEM_NOTIFICATION');

-- CreateTable
CREATE TABLE "User" (
"id" TEXT NOT NULL,
"user_name" TEXT NOT NULL,
"user_email" TEXT NOT NULL,
"user_password" TEXT NOT NULL,
"user_role" "UserRole" NOT NULL DEFAULT 'USER',
"validation_key" TEXT,
"resetToken" TEXT,
"resetTokenExpiry" TIMESTAMP(3),
"organizationId" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Admin" (
"id" TEXT NOT NULL,
"admin_name" TEXT NOT NULL,
"admin_email" TEXT NOT NULL,
"admin_password" TEXT NOT NULL,
"organizationId" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Admin_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "SuperAdmin" (
"id" TEXT NOT NULL,
"super_admin_name" TEXT NOT NULL,
"super_admin_email" TEXT NOT NULL,
"super_admin_password" TEXT NOT NULL,
"validation_key" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "SuperAdmin_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Organization" (
"org_id" TEXT NOT NULL,
"org_name" TEXT NOT NULL,
"org_type" TEXT NOT NULL,
"org_location" TEXT NOT NULL,
"superAdminId" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Organization_pkey" PRIMARY KEY ("org_id")
);

-- CreateTable
CREATE TABLE "OrganizationNotification" (
"id" TEXT NOT NULL,
"organizationId" TEXT NOT NULL,
"notification_type" "NotificationType" NOT NULL,
"notification_message" TEXT NOT NULL,
"notification_timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"read" BOOLEAN NOT NULL DEFAULT false,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "OrganizationNotification_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Lab" (
"id" TEXT NOT NULL,
"lab_name" TEXT NOT NULL,
"lab_capacity" INTEGER NOT NULL,
"status" "LabStatus" NOT NULL DEFAULT 'ACTIVE',
"location" TEXT,
"description" TEXT,
"organizationId" TEXT NOT NULL,
"adminId" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Lab_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "TimeSlot" (
"id" TEXT NOT NULL,
"lab_id" TEXT NOT NULL,
"date" TIMESTAMP(3) NOT NULL,
"start_time" TIMESTAMP(3) NOT NULL,
"end_time" TIMESTAMP(3) NOT NULL,
"status" TEXT NOT NULL DEFAULT 'AVAILABLE',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "TimeSlot_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Booking" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"slot_id" TEXT NOT NULL,
"booking_status" "BookingStatus" NOT NULL DEFAULT 'PENDING',
"booking_timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"managedBy" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Booking_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Waitlist" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"slot_id" TEXT NOT NULL,
"waitlist_position" INTEGER NOT NULL,
"waitlist_status" "WaitlistStatus" NOT NULL DEFAULT 'ACTIVE',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Waitlist_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Notification" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"notification_type" "NotificationType" NOT NULL,
"notification_message" TEXT NOT NULL,
"notification_timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"read" BOOLEAN NOT NULL DEFAULT false,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Notification_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "User_user_email_key" ON "User"("user_email");

-- CreateIndex
CREATE UNIQUE INDEX "User_validation_key_key" ON "User"("validation_key");

-- CreateIndex
CREATE UNIQUE INDEX "User_resetToken_key" ON "User"("resetToken");

-- CreateIndex
CREATE INDEX "User_user_email_idx" ON "User"("user_email");

-- CreateIndex
CREATE INDEX "User_validation_key_idx" ON "User"("validation_key");

-- CreateIndex
CREATE INDEX "User_resetToken_idx" ON "User"("resetToken");

-- CreateIndex
CREATE INDEX "User_organizationId_idx" ON "User"("organizationId");

-- CreateIndex
CREATE UNIQUE INDEX "Admin_admin_email_key" ON "Admin"("admin_email");

-- CreateIndex
CREATE INDEX "Admin_admin_email_idx" ON "Admin"("admin_email");

-- CreateIndex
CREATE INDEX "Admin_organizationId_idx" ON "Admin"("organizationId");

-- CreateIndex
CREATE UNIQUE INDEX "SuperAdmin_super_admin_email_key" ON "SuperAdmin"("super_admin_email");

-- CreateIndex
CREATE UNIQUE INDEX "SuperAdmin_validation_key_key" ON "SuperAdmin"("validation_key");

-- CreateIndex
CREATE INDEX "SuperAdmin_super_admin_email_idx" ON "SuperAdmin"("super_admin_email");

-- CreateIndex
CREATE INDEX "Organization_org_name_idx" ON "Organization"("org_name");

-- CreateIndex
CREATE INDEX "Organization_superAdminId_idx" ON "Organization"("superAdminId");

-- CreateIndex
CREATE INDEX "OrganizationNotification_organizationId_idx" ON "OrganizationNotification"("organizationId");

-- CreateIndex
CREATE INDEX "Lab_organizationId_idx" ON "Lab"("organizationId");

-- CreateIndex
CREATE INDEX "Lab_adminId_idx" ON "Lab"("adminId");

-- CreateIndex
CREATE INDEX "TimeSlot_lab_id_idx" ON "TimeSlot"("lab_id");

-- CreateIndex
CREATE INDEX "TimeSlot_date_idx" ON "TimeSlot"("date");

-- CreateIndex
CREATE INDEX "TimeSlot_lab_id_date_idx" ON "TimeSlot"("lab_id", "date");

-- CreateIndex
CREATE INDEX "Booking_user_id_idx" ON "Booking"("user_id");

-- CreateIndex
CREATE INDEX "Booking_slot_id_idx" ON "Booking"("slot_id");

-- CreateIndex
CREATE INDEX "Booking_booking_status_idx" ON "Booking"("booking_status");

-- CreateIndex
CREATE INDEX "Booking_managedBy_idx" ON "Booking"("managedBy");

-- CreateIndex
CREATE INDEX "Waitlist_user_id_idx" ON "Waitlist"("user_id");

-- CreateIndex
CREATE INDEX "Waitlist_slot_id_idx" ON "Waitlist"("slot_id");

-- CreateIndex
CREATE INDEX "Waitlist_waitlist_status_idx" ON "Waitlist"("waitlist_status");

-- CreateIndex
CREATE INDEX "Waitlist_slot_id_waitlist_position_idx" ON "Waitlist"("slot_id", "waitlist_position");

-- CreateIndex
CREATE INDEX "Notification_user_id_idx" ON "Notification"("user_id");

-- CreateIndex
CREATE INDEX "Notification_read_idx" ON "Notification"("read");

-- AddForeignKey
ALTER TABLE "User" ADD CONSTRAINT "User_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("org_id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Admin" ADD CONSTRAINT "Admin_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("org_id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Organization" ADD CONSTRAINT "Organization_superAdminId_fkey" FOREIGN KEY ("superAdminId") REFERENCES "SuperAdmin"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "OrganizationNotification" ADD CONSTRAINT "OrganizationNotification_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("org_id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Lab" ADD CONSTRAINT "Lab_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("org_id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Lab" ADD CONSTRAINT "Lab_adminId_fkey" FOREIGN KEY ("adminId") REFERENCES "Admin"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "TimeSlot" ADD CONSTRAINT "TimeSlot_lab_id_fkey" FOREIGN KEY ("lab_id") REFERENCES "Lab"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Booking" ADD CONSTRAINT "Booking_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Booking" ADD CONSTRAINT "Booking_slot_id_fkey" FOREIGN KEY ("slot_id") REFERENCES "TimeSlot"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Booking" ADD CONSTRAINT "Booking_managedBy_fkey" FOREIGN KEY ("managedBy") REFERENCES "SuperAdmin"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Waitlist" ADD CONSTRAINT "Waitlist_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Waitlist" ADD CONSTRAINT "Waitlist_slot_id_fkey" FOREIGN KEY ("slot_id") REFERENCES "TimeSlot"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Notification" ADD CONSTRAINT "Notification_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
3 changes: 3 additions & 0 deletions backend/prisma/migrations/migration_lock.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "postgresql"
Loading
Loading