Files
mwitnessing/prisma/schema.prisma
Dobromir Popov 8becbfc926 env and database access overhaul;
new dev scripts
2024-04-05 19:58:07 +03:00

308 lines
10 KiB
Plaintext

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// // https://dev.to/connelevalsam/a-simple-crud-app-with-nextjs-prisma-sqlite-and-flutter-3oe1
// > npx prisma
// // to update prisma DB/generate migration
// >npx prisma migrate dev
// //to generate schema
// > npx prisma
// This is a Prisma database schema definition, which describes the structure and relationships between various entities in the database. Here's a brief overview of the different models:
// Publisher: Represents a publisher, with attributes such as first name, last name, email, phone, age, and availability. A publisher can have many availabilities and assignments, and can also have multiple user accounts and sessions.
// Availability: Represents the availability of a publisher on a specific day and time range. An availability belongs to a publisher and can have a name, day of the week, day of the month, start time, and end time.
// CartEvent: Represents a cart event, which is an event that requires a certain number of publishers to work. A cart event has a start and end time, a duration, and can have multiple shifts. It also has a location and an event type.
// Shift: Represents a shift, which is a specific time period during a cart event where one or more publishers are required to work. A shift belongs to a cart event and can have a name, start and end time, and can require transport.
// Assignment: Represents an assignment of a publisher to a specific shift. An assignment belongs to a shift and a publisher and can be tentative or final.
// Location: Represents a location where a cart event can take place. A location can have a name, address, and multiple cart events.
// Overall, this schema seems to represent a system for managing publishers and their assignments to cart events, including their availabilities and locations.
//$env:DATABASE="{connection string}"; npx prisma migrate deploy
datasource db {
provider = "mysql"
url = env("DATABASE")
}
generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "debian-openssl-3.0.x"]
}
// graphql schema generator
// https://github.com/prisma-korea/graphql-schema-generator
// generator graphql {
// provider = "graphql-schema-generator"
// createCRUD = "true"
// // # output = "./generated" This is default path.
// }
enum UserRole {
ADMIN
POWERUSER
USER
EXTERNAL
}
enum EventType {
PW_Cart
KH_Cleaning
}
//prisma type for day of week for sqlite db
enum DayOfWeek {
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
}
enum AvailabilityType {
Weekly
Monthly
OneTime
PreviousAssignment
ReplacementOnly
}
// Вестител
// Бетелит
// Редовен Пионер
// Специален Пионер/Мисионер
enum PublisherType {
Publisher
Bethelite
RegularPioneer
SpecialPioneer_Missionary
}
enum ReportType {
ServiceReport
Experience
Feedback_Problem
Feedback_Suggestion
Feedback
}
model Publisher {
id String @id @default(cuid())
firstName String
lastName String
email String @unique
phone String?
isActive Boolean @default(true)
isImported Boolean @default(false)
isTrained Boolean @default(false)
age Int?
availabilities Availability[]
assignments Assignment[]
// Optional relation to User
userId String? @unique
user User? @relation(fields: [userId], references: [id])
role UserRole @default(USER)
desiredShiftsPerMonth Int @default(4)
isMale Boolean @default(true)
isNameForeign Boolean @default(false)
isSubscribedToCoverMe Boolean @default(false)
isSubscribedToReminders Boolean @default(false)
familyHeadId String? // Optional familyHeadId for each family member
familyHead Publisher? @relation("FamilyMember", fields: [familyHeadId], references: [id])
familyMembers Publisher[] @relation("FamilyMember")
alwaysAsFamily Boolean? @default(false) //NEW v1.0.1 // New field to indicate if the publisher always wants to be assigned with the family
type PublisherType @default(Publisher)
town String?
comments String?
reports Report[]
Message Message[]
}
model Availability {
id Int @id @default(autoincrement())
publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade)
publisherId String
name String
dayofweek DayOfWeek
dayOfMonth Int?
weekOfMonth Int?
startTime DateTime
endTime DateTime
isActive Boolean @default(true)
type AvailabilityType @default(Weekly)
isWithTransportIn Boolean @default(false)
isWithTransportOut Boolean @default(false)
isFromPreviousAssignment Boolean @default(false)
isFromPreviousMonth Boolean @default(false)
repeatWeekly Boolean? // New field to indicate weekly repetition // until now dayofweek was used for repetition when dayOfMonth is null
repeatFrequency Int? // New field to indicate repetition frequency
endDate DateTime? // New field for the end date of repetition
dateOfEntry DateTime? //NEW v1.0.1
parentAvailabilityId Int?
parentAvailability Availability? @relation("ParentAvailability", fields: [parentAvailabilityId], references: [id])
ChildAvailabilities Availability[] @relation("ParentAvailability")
}
model CartEvent {
id Int @id @default(autoincrement())
startTime DateTime
endTime DateTime
shiftDuration Int
shifts Shift[]
dayofweek DayOfWeek
isActive Boolean @default(true)
location Location @relation(fields: [locationId], references: [id])
locationId Int
eventType EventType @default(PW_Cart)
numberOfPublishers Int @default(3)
@@map("CartEvent")
}
model Shift {
id Int @id @default(autoincrement())
cartEvent CartEvent @relation(fields: [cartEventId], references: [id], onDelete: Cascade)
cartEventId Int
assignments Assignment[]
name String
startTime DateTime
endTime DateTime
isActive Boolean @default(true)
requiresTransport Boolean @default(false)
notes String?
//date DateTime
reportId Int? @unique
Report Report? @relation(fields: [reportId], references: [id])
isPublished Boolean @default(false) //NEW v1.0.1
@@map("Shift")
}
model Assignment {
id Int @id @default(autoincrement())
shift Shift @relation(fields: [shiftId], references: [id], onDelete: Cascade)
shiftId Int
publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade)
publisherId String
isBySystem Boolean @default(false) // if no availability for it, when importing previous schedules
isConfirmed Boolean @default(false)
isWithTransport Boolean @default(false)
isMailSent Boolean @default(false)
publicGuid String? @unique
@@map("Assignment")
}
model Location {
id Int @id @default(autoincrement())
name String
address String
isActive Boolean @default(true)
content String? @db.LongText
cartEvents CartEvent[]
reports Report[]
picture1 String?
picture2 String?
picture3 String?
backupLocationId Int?
backupLocation Location? @relation("BackupLocation", fields: [backupLocationId], references: [id])
BackupForLocations Location[] @relation("BackupLocation")
@@map("Location")
}
model Report {
id Int @id @default(autoincrement())
date DateTime
publisherId String
publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade)
locationId Int?
location Location? @relation(fields: [locationId], references: [id])
shift Shift?
placementCount Int?
videoCount Int?
returnVisitInfoCount Int?
conversationCount Int?
experienceInfo String? @db.LongText
type ReportType @default(ServiceReport)
@@map("Report")
}
//message types
enum MessageType {
Email
SMS
Push
InApp
}
model Message {
id Int @id @default(autoincrement())
publisher Publisher @relation(fields: [publisherId], references: [id])
publisherId String
date DateTime
content String
isRead Boolean @default(false)
isPublic Boolean @default(false)
type MessageType @default(Email)
}
//user auth and session management
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime?
image String?
accounts Account[]
sessions Session[]
// Optional relation to Publisher
publisherId String? @unique
publisher Publisher? @relation
}
model Account {
id String @id @default(cuid())
userId String
type String
provider String
providerAccountId String
refresh_token String?
access_token String?
expires_at Int?
token_type String?
scope String?
id_token String?
session_state String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
}
model Session {
id String @id @default(cuid())
sessionToken String @unique
userId String
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model VerificationToken {
identifier String
token String @unique
expires DateTime
@@unique([identifier, token])
}