File size: 5,058 Bytes
ad79323
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

enum CustomerGender {
  MALE
  FEMALE
}

enum CaseType {
  CIVIL
  CRIMINAL
  PERSONAL_STATUS
}

enum CaseStatus {
  OPEN
  CLOSED
}

enum CaseFileRagStatus {
  PENDING
  PROCESSING
  READY
  FAILED
  SKIPPED
}

model User {
  id           String     @id @default(cuid())
  firstName    String
  lastName     String
  email        String     @unique
  passwordHash String
  sessions     Session[]
  customers    Customer[] @relation("UserCustomers")
  cases        Case[]
  caseFiles    CaseFile[]
  courtSessions CourtSession[]
  chatTurns     CaseChatTurn[]
  createdAt    DateTime   @default(now())
  updatedAt    DateTime   @updatedAt

  @@index([createdAt])
}

model Session {
  id        String   @id @default(cuid())
  userId    String
  tokenHash String   @unique
  expiresAt DateTime
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@index([userId])
  @@index([expiresAt])
}

model Customer {
  id         String         @id @default(cuid())
  ownerId    String
  firstName  String
  middleName String?
  lastName   String
  gender     CustomerGender
  phone      String
  owner      User           @relation("UserCustomers", fields: [ownerId], references: [id], onDelete: Cascade)
  cases      Case[]
  caseFiles  CaseFile[]
  chatTurns  CaseChatTurn[]
  courtSessions CourtSession[]
  createdAt  DateTime       @default(now())
  updatedAt  DateTime       @updatedAt

  @@index([ownerId, updatedAt])
  @@index([ownerId, createdAt])
  @@index([ownerId, phone])
}

model Case {
  id               String      @id @default(cuid())
  customerId       String
  ownerId          String
  caseName         String
  publicId         String
  type             CaseType
  subType          String?
  opponentFullName String
  description      String?
  status           CaseStatus  @default(OPEN)
  closedAt         DateTime?
  customer         Customer    @relation(fields: [customerId], references: [id], onDelete: Cascade)
  owner            User        @relation(fields: [ownerId], references: [id], onDelete: Cascade)
  files            CaseFile[]
  courtSessions    CourtSession[]
  chatTurns        CaseChatTurn[]
  createdAt        DateTime    @default(now())
  updatedAt        DateTime    @updatedAt

  @@unique([ownerId, publicId])
  @@index([ownerId, status, updatedAt])
  @@index([ownerId, customerId, type])
  @@index([customerId, updatedAt])
  @@index([ownerId, opponentFullName])
  @@index([ownerId, caseName])
}

model CaseFile {
  id               String   @id @default(cuid())
  ownerId          String
  customerId       String
  caseId           String
  displayName      String
  description      String?
  originalFileName String
  mimeType         String
  sizeBytes        Int
  storageBucket    String
  storageKey       String   @unique
  ragStatus        CaseFileRagStatus @default(PENDING)
  ragError         String?
  ragSyncedAt      DateTime?
  customer         Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)
  case             Case     @relation(fields: [caseId], references: [id], onDelete: Cascade)
  owner            User     @relation(fields: [ownerId], references: [id], onDelete: Cascade)
  createdAt        DateTime @default(now())
  updatedAt        DateTime @updatedAt

  @@index([ownerId, caseId, createdAt])
  @@index([ownerId, caseId, displayName])
  @@index([customerId, caseId])
  @@index([ownerId, caseId, ragStatus])
}

model CourtSession {
  id              String   @id @default(cuid())
  ownerId         String
  customerId      String
  caseId          String
  governorate     String
  courtName       String
  courtLocation   String
  locationDetails String?
  scheduledAt     DateTime
  owner           User     @relation(fields: [ownerId], references: [id], onDelete: Cascade)
  customer        Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)
  case            Case     @relation(fields: [caseId], references: [id], onDelete: Cascade)
  createdAt       DateTime @default(now())
  updatedAt       DateTime @updatedAt

  @@index([ownerId, scheduledAt])
  @@index([ownerId, customerId, scheduledAt])
  @@index([ownerId, caseId, scheduledAt])
  @@index([customerId, scheduledAt])
  @@index([caseId, scheduledAt])
}

model CaseChatTurn {
  id        String   @id @default(cuid())
  ownerId   String
  customerId String
  caseId    String
  question  String
  answer    String
  sources   Json?
  owner     User     @relation(fields: [ownerId], references: [id], onDelete: Cascade)
  customer  Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)
  case      Case     @relation(fields: [caseId], references: [id], onDelete: Cascade)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@index([ownerId, caseId, createdAt])
  @@index([customerId, createdAt])
}