diff --git a/package.json b/package.json index fdfff8c..4a368e5 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@mantine/nprogress": "^7.11.0", "@mantine/spotlight": "^7.11.0", "@mantine/tiptap": "^7.11.0", + "@prisma/client": "5.16.1", "@tabler/icons-react": "^3.7.0", "@tiptap/extension-link": "^2.4.0", "@tiptap/react": "^2.4.0", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index ee282c7..aaf45b0 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -12,3 +12,353 @@ datasource db { provider = "postgresql" url = env("DATABASE_URL") } + +model UserRole { + id String @id @default(cuid()) + name String + desc String @db.Text + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + User User[] +} + +model Village { + id String @id @default(cuid()) + name String + desc String @db.Text + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + Group Group[] + User User[] + Annoucement Annoucement[] + Project Project[] + Division Division[] +} + +model Group { + id String @id @default(cuid()) + Village Village @relation(fields: [idVillage], references: [id]) + idVillage String + name String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + Position Position[] + User User[] + Project Project[] + Division Division[] + AnnoucementMember AnnoucementMember[] +} + +model Position { + id String @id @default(cuid()) + Group Group @relation(fields: [idGroup], references: [id]) + idGroup String + name String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + User User[] +} + +model User { + id String @id @default(cuid()) + UserRole UserRole @relation(fields: [idUserRole], references: [id]) + idUserRole String + Village Village? @relation(fields: [idVillage], references: [id]) + idVillage String? + Group Group? @relation(fields: [idGroup], references: [id]) + idGroup String? + Position Position? @relation(fields: [idPosition], references: [id]) + idPosition String? + nik String @unique + name String + phone String @unique + email String @unique + gender String @default("M") //M= Male, F= Female + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + Annoucement Annoucement[] + Project Project[] + ProjectMember ProjectMember[] + ProjectComment ProjectComment[] + UserLog UserLog[] + Division Division[] + DivisionMember DivisionMember[] + DivisionProjectMember DivisionProjectMember[] + DivisionProjectFile DivisionProjectFile[] + DivisionDisscussion DivisionDisscussion[] + DivisionDisscussionComment DivisionDisscussionComment[] + DivisionDocumentFolderFile DivisionDocumentFolderFile[] + DivisionCalendar DivisionCalendar[] +} + +model UserLog { + id String @id @default(cuid()) + User User @relation(fields: [idUser], references: [id]) + idUser String + action String + desc String @db.Text + idContent String + tbContent String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Annoucement { + id String @id @default(cuid()) + Village Village @relation(fields: [idVillage], references: [id]) + idVillage String + title String + desc String @db.Text + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + AnnoucementMember AnnoucementMember[] +} + +model AnnoucementMember { + id String @id @default(cuid()) + Annoucement Annoucement @relation(fields: [idAnnoucement], references: [id]) + idAnnoucement String + Group Group @relation(fields: [idGroup], references: [id]) + idGroup String + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Project { + id String @id @default(cuid()) + Village Village @relation(fields: [idVillage], references: [id]) + idVillage String + Group Group @relation(fields: [idGroup], references: [id]) + idGroup String + name String + desc String @db.Text + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + ProjectMember ProjectMember[] + ProjectFile ProjectFile[] + ProjectComment ProjectComment[] +} + +model ProjectMember { + id String @id @default(cuid()) + Project Project @relation(fields: [idProject], references: [id]) + idProject String + User User @relation(fields: [idUser], references: [id]) + idUser String + isLeader Boolean @default(false) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model ProjectFile { + id String @id @default(cuid()) + Project Project @relation(fields: [idProject], references: [id]) + idProject String + name String + extension String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model ProjectComment { + id String @id @default(cuid()) + Project Project @relation(fields: [idProject], references: [id]) + idProject String + User User @relation(fields: [createdBy], references: [id]) + createdBy String + comment String @db.Text + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Division { + id String @id @default(cuid()) + Village Village @relation(fields: [idVillage], references: [id]) + idVillage String + Group Group @relation(fields: [idGroup], references: [id]) + idGroup String + name String + desc String @db.Text + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + DivisionMember DivisionMember[] + AnnoucementMember AnnoucementMember[] + DivisionProject DivisionProject[] + DivisionProjectTask DivisionProjectTask[] + DivisionProjectMember DivisionProjectMember[] + DivisionProjectFile DivisionProjectFile[] + DivisionDisscussion DivisionDisscussion[] + DivisionDocumentFolderFile DivisionDocumentFolderFile[] + DivisionDocumentShare DivisionDocumentShare[] + DivisionCalendar DivisionCalendar[] + DivisionCalendarReminder DivisionCalendarReminder[] +} + +model DivisionMember { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + User User @relation(fields: [idUser], references: [id]) + idUser String + isAdmin Boolean @default(false) + isLeader Boolean @default(false) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model DivisionProject { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + title String + desc String @db.Text + status Int @default(0) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model DivisionProjectTask { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + title String + desc String @db.Text + status Int @default(0) + dateStart DateTime @db.Date + dateEnd DateTime @db.Date + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model DivisionProjectMember { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + User User @relation(fields: [idUser], references: [id]) + idUser String + isLeader Boolean @default(false) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model DivisionProjectFile { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + name String + extension String + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model DivisionDisscussion { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + title String + desc String @db.Text + status Int @default(1) // 1 = open, 2 = close + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model DivisionDisscussionComment { + id String @id @default(cuid()) + idDisscussion String + comment String @db.Text + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model DivisionDocumentFolderFile { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + category String @default("FOLDER") // FOLDER OR FILE + name String + extension String + path String + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + DivisionDocumentShare DivisionDocumentShare[] +} + +model DivisionDocumentShare { + id String @id @default(cuid()) + DivisionDocumentFolderFile DivisionDocumentFolderFile @relation(fields: [idDocument], references: [id]) + idDocument String + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model DivisionCalendar { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + title String + desc String @db.Text + dateStart DateTime @db.Date + dateEnd DateTime @db.Date + repeatEventTyper String + reminderInterval String + status Int @default(0) + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + DivisionCalendarReminder DivisionCalendarReminder[] +} + +model DivisionCalendarReminder { + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + DivisionCalendar DivisionCalendar @relation(fields: [idCalendar], references: [id]) + idCalendar String + dateStart DateTime @db.Date + dateEnd DateTime @db.Date + status Int @default(0) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/src/module/division/discuss/index.ts b/src/module/division/discussion/index.ts similarity index 100% rename from src/module/division/discuss/index.ts rename to src/module/division/discussion/index.ts diff --git a/src/module/village/index.ts b/src/module/village/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/yarn.lock b/yarn.lock index 3856779..9fe85cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -342,6 +342,11 @@ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@prisma/client@5.16.1": + version "5.16.1" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.16.1.tgz#65c5649b4701c097e7fa943c91a3140ce8bf053d" + integrity sha512-wM9SKQjF0qLxdnOZIVAIMKiz6Hu7vDt4FFAih85K1dk/Rr2mdahy6d3QP41K62N9O0DJJA//gUDA3Mp49xsKIg== + "@prisma/debug@5.16.1": version "5.16.1" resolved "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.1.tgz" @@ -3098,6 +3103,7 @@ streamsearch@^1.1.0: integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + name string-width-cjs version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==