Skip to content
Merged

Dev #55

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
2 changes: 0 additions & 2 deletions backend/.env
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
//.env file for the backend service

DATABASE_URL="postgresql://postgres:password@localhost:5432/time_booking?schema=public"
3 changes: 3 additions & 0 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
"prisma:migrate": "prisma migrate dev",
"prisma:studio": "prisma studio",
"seed": "ts-node prisma/seed.ts",
"seed:dev": "NODE_ENV=development ts-node prisma/seed.ts",
"seed:test": "NODE_ENV=test ts-node prisma/seed.ts",
"db:reset": "prisma migrate reset --force && npm run seed",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\"",
"lint:fix": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"format": "prettier --write \"src/**/*.ts\"",
Expand Down
140 changes: 69 additions & 71 deletions backend/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -7,56 +7,22 @@ datasource db {
url = env("DATABASE_URL")
}

enum UserRole {
USER
ADMIN
SUPER_ADMIN
}

enum BookingStatus {
PENDING
CONFIRMED
CANCELLED
COMPLETED
}

enum WaitlistStatus {
ACTIVE
FULFILLED
CANCELLED
}

enum LabStatus {
ACTIVE
MAINTENANCE
INACTIVE
}

enum NotificationType {
BOOKING_CONFIRMATION
BOOKING_CANCELLATION
WAITLIST_NOTIFICATION
GENERAL_ANNOUNCEMENT
SLOT_AVAILABLE
SYSTEM_NOTIFICATION
}

model User {
id String @id @default(uuid())
user_name String
user_email String @unique
user_password String
user_role UserRole @default(USER)
validation_key String? @unique // SAMAGRA ID for alternative authentication
validation_key String? @unique
resetToken String? @unique
resetTokenExpiry DateTime?
organizationId String? // Optional as users can book from multiple organizations
organization Organization? @relation(fields: [organizationId], references: [id])
bookings Booking[]
waitlists Waitlist[]
notifications Notification[]
organizationId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
bookings Booking[]
notifications Notification[]
organization Organization? @relation(fields: [organizationId], references: [id])
waitlists Waitlist[]

@@index([user_email])
@@index([validation_key])
Expand All @@ -70,25 +36,25 @@ model Admin {
admin_email String @unique
admin_password String
organizationId String
organization Organization @relation(fields: [organizationId], references: [id])
labs Lab[] // Labs managed by this admin
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
organization Organization @relation(fields: [organizationId], references: [id])
labs Lab[]

@@index([admin_email])
@@index([organizationId]) // Added index for foreign key
@@index([organizationId])
}

model SuperAdmin {
id String @id @default(uuid())
super_admin_name String
super_admin_email String @unique
super_admin_password String
validation_key String? @unique // For system authentication if needed
organizations Organization[]
managedBookings Booking[] // Direct relation to bookings managed by this SuperAdmin
validation_key String? @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
managedBookings Booking[]
organizations Organization[]

@@index([super_admin_email])
}
Expand All @@ -98,30 +64,29 @@ model Organization {
org_name String
org_type String
org_location String
users User[]
admins Admin[]
labs Lab[]
notifications OrganizationNotification[]
superAdminId String?
superAdmin SuperAdmin? @relation(fields: [superAdminId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
admins Admin[]
labs Lab[]
superAdmin SuperAdmin? @relation(fields: [superAdminId], references: [id])
notifications OrganizationNotification[]
users User[]

@@index([org_name])
@@index([superAdminId])
}

// Added to match ERD relationship: Organization can receive Notification
model OrganizationNotification {
id String @id @default(uuid())
organizationId String
organization Organization @relation(fields: [organizationId], references: [id])
notification_type NotificationType
notification_message String
notification_timestamp DateTime @default(now())
read Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
organization Organization @relation(fields: [organizationId], references: [id])

@@index([organizationId])
}
Expand All @@ -133,49 +98,48 @@ model Lab {
status LabStatus @default(ACTIVE)
location String?
description String?
timeSlots TimeSlot[]
organizationId String
organization Organization @relation(fields: [organizationId], references: [id])
adminId String
admin Admin @relation(fields: [adminId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
admin Admin @relation(fields: [adminId], references: [id])
organization Organization @relation(fields: [organizationId], references: [id])
timeSlots TimeSlot[]

@@index([organizationId])
@@index([adminId]) // Added index for foreign key
@@index([adminId])
}

model TimeSlot {
id String @id @default(uuid())
lab_id String
lab Lab @relation(fields: [lab_id], references: [id])
date DateTime
start_time DateTime
end_time DateTime
status String @default("AVAILABLE")
bookings Booking[]
waitlists Waitlist[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
bookings Booking[]
lab Lab @relation(fields: [lab_id], references: [id])
waitlists Waitlist[]

@@index([lab_id])
@@index([date])
@@index([lab_id, date]) // Added composite index for common queries
@@index([lab_id, date])
}

model Booking {
id String @id @default(uuid())
user_id String
user User @relation(fields: [user_id], references: [id])
slot_id String
timeSlot TimeSlot @relation(fields: [slot_id], references: [id])
booking_status BookingStatus @default(PENDING)
booking_timestamp DateTime @default(now())
// Direct relation to SuperAdmin who manages this booking
managedBy String?
superAdmin SuperAdmin? @relation(fields: [managedBy], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
superAdmin SuperAdmin? @relation(fields: [managedBy], references: [id])
timeSlot TimeSlot @relation(fields: [slot_id], references: [id])
user User @relation(fields: [user_id], references: [id])

@@index([user_id])
@@index([slot_id])
Expand All @@ -186,31 +150,65 @@ model Booking {
model Waitlist {
id String @id @default(uuid())
user_id String
user User @relation(fields: [user_id], references: [id])
slot_id String
timeSlot TimeSlot @relation(fields: [slot_id], references: [id])
waitlist_position Int
waitlist_status WaitlistStatus @default(ACTIVE)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
timeSlot TimeSlot @relation(fields: [slot_id], references: [id])
user User @relation(fields: [user_id], references: [id])

@@index([user_id])
@@index([slot_id])
@@index([waitlist_status]) // Added index for status queries
@@index([slot_id, waitlist_position]) // Added composite index for position queries
@@index([waitlist_status])
@@index([slot_id, waitlist_position])
}

model Notification {
id String @id @default(uuid())
user_id String
user User @relation(fields: [user_id], references: [id])
notification_type NotificationType
notification_message String
notification_timestamp DateTime @default(now())
read Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [user_id], references: [id])

@@index([user_id])
@@index([read]) // Added index for unread notification queries
@@index([read])
}

enum UserRole {
USER
ADMIN
SUPER_ADMIN
}

enum BookingStatus {
PENDING
CONFIRMED
CANCELLED
COMPLETED
}

enum WaitlistStatus {
ACTIVE
FULFILLED
CANCELLED
}

enum LabStatus {
ACTIVE
MAINTENANCE
INACTIVE
}

enum NotificationType {
BOOKING_CONFIRMATION
BOOKING_CANCELLATION
WAITLIST_NOTIFICATION
GENERAL_ANNOUNCEMENT
SLOT_AVAILABLE
SYSTEM_NOTIFICATION
}
Loading