@danielcok17/prisma-db 1.9.0 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/package.json +3 -2
  2. package/prisma/law.prisma +45 -47
  3. package/prisma/generated/app/client.d.ts +0 -1
  4. package/prisma/generated/app/client.js +0 -4
  5. package/prisma/generated/app/default.d.ts +0 -1
  6. package/prisma/generated/app/default.js +0 -4
  7. package/prisma/generated/app/edge.d.ts +0 -1
  8. package/prisma/generated/app/edge.js +0 -768
  9. package/prisma/generated/app/index-browser.js +0 -750
  10. package/prisma/generated/app/index.d.ts +0 -63852
  11. package/prisma/generated/app/index.js +0 -793
  12. package/prisma/generated/app/libquery_engine-darwin-arm64.dylib.node +0 -0
  13. package/prisma/generated/app/libquery_engine-linux-musl-openssl-3.0.x.so.node +0 -0
  14. package/prisma/generated/app/package.json +0 -183
  15. package/prisma/generated/app/query_engine_bg.js +0 -2
  16. package/prisma/generated/app/query_engine_bg.wasm +0 -0
  17. package/prisma/generated/app/runtime/edge-esm.js +0 -34
  18. package/prisma/generated/app/runtime/edge.js +0 -34
  19. package/prisma/generated/app/runtime/index-browser.d.ts +0 -370
  20. package/prisma/generated/app/runtime/index-browser.js +0 -16
  21. package/prisma/generated/app/runtime/library.d.ts +0 -3977
  22. package/prisma/generated/app/runtime/library.js +0 -146
  23. package/prisma/generated/app/runtime/react-native.js +0 -83
  24. package/prisma/generated/app/runtime/wasm-compiler-edge.js +0 -84
  25. package/prisma/generated/app/runtime/wasm-engine-edge.js +0 -36
  26. package/prisma/generated/app/schema.prisma +0 -941
  27. package/prisma/generated/app/wasm-edge-light-loader.mjs +0 -4
  28. package/prisma/generated/app/wasm-worker-loader.mjs +0 -4
  29. package/prisma/generated/app/wasm.d.ts +0 -1
  30. package/prisma/generated/app/wasm.js +0 -775
  31. package/prisma/generated/law/client.d.ts +0 -1
  32. package/prisma/generated/law/client.js +0 -4
  33. package/prisma/generated/law/default.d.ts +0 -1
  34. package/prisma/generated/law/default.js +0 -4
  35. package/prisma/generated/law/edge.d.ts +0 -1
  36. package/prisma/generated/law/edge.js +0 -256
  37. package/prisma/generated/law/index-browser.js +0 -238
  38. package/prisma/generated/law/index.d.ts +0 -6868
  39. package/prisma/generated/law/index.js +0 -281
  40. package/prisma/generated/law/libquery_engine-darwin-arm64.dylib.node +0 -0
  41. package/prisma/generated/law/libquery_engine-linux-musl-openssl-3.0.x.so.node +0 -0
  42. package/prisma/generated/law/package.json +0 -183
  43. package/prisma/generated/law/query_engine_bg.js +0 -2
  44. package/prisma/generated/law/query_engine_bg.wasm +0 -0
  45. package/prisma/generated/law/runtime/edge-esm.js +0 -34
  46. package/prisma/generated/law/runtime/edge.js +0 -34
  47. package/prisma/generated/law/runtime/index-browser.d.ts +0 -370
  48. package/prisma/generated/law/runtime/index-browser.js +0 -16
  49. package/prisma/generated/law/runtime/library.d.ts +0 -3977
  50. package/prisma/generated/law/runtime/library.js +0 -146
  51. package/prisma/generated/law/runtime/react-native.js +0 -83
  52. package/prisma/generated/law/runtime/wasm-compiler-edge.js +0 -84
  53. package/prisma/generated/law/runtime/wasm-engine-edge.js +0 -36
  54. package/prisma/generated/law/schema.prisma +0 -82
  55. package/prisma/generated/law/wasm-edge-light-loader.mjs +0 -4
  56. package/prisma/generated/law/wasm-worker-loader.mjs +0 -4
  57. package/prisma/generated/law/wasm.d.ts +0 -1
  58. package/prisma/generated/law/wasm.js +0 -263
@@ -1,941 +0,0 @@
1
- generator client {
2
- provider = "prisma-client-js"
3
- output = "./generated/app"
4
- binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
5
- }
6
-
7
- datasource db {
8
- provider = "postgresql"
9
- url = env("POSTGRES_PRISMA_URL")
10
- directUrl = env("POSTGRES_URL_NON_POOLING")
11
- }
12
-
13
- model Account {
14
- id String @id @default(cuid())
15
- userId String
16
- type String
17
- provider String
18
- providerAccountId String
19
- refresh_token String?
20
- access_token String?
21
- expires_at Int?
22
- token_type String?
23
- scope String?
24
- id_token String?
25
- session_state String?
26
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
27
-
28
- @@unique([provider, providerAccountId])
29
- }
30
-
31
- model User {
32
- id String @id @default(cuid())
33
- name String?
34
- email String? @unique
35
- emailVerified DateTime?
36
- image String?
37
- // Credentials authentication fields
38
- password String? // Hashed password pre credentials login
39
- createdAt DateTime @default(now())
40
- agreedToTerms Boolean @default(false)
41
- practiceArea String[]
42
- lawFirm String?
43
- yearsOfExperience Int?
44
- // Nové polia pre schvalovanie používateľov
45
- isApproved Boolean @default(false) // Či je používateľ schválený
46
- isRejected Boolean @default(false) // Či je používateľ zamietnutý
47
- approvedAt DateTime? // Kedy bol schválený
48
- rejectedAt DateTime? // Kedy bol zamietnutý
49
- approvedBy String? // ID admina, ktorý schválil
50
- rejectedBy String? // ID admina, ktorý zamietol
51
- rejectionReason String? // Dôvod zamietnutia
52
- // Nové polia pre tracking a žiadosť
53
- referralSource String? // Odkiaľ sa o nás dozvedel (Google, Facebook, LinkedIn, etc.)
54
- applicationText String? // Text žiadosti o prihlásenie
55
- // ✨ STRIPE FIELDS (B2C - len pre individuálnych používateľov)
56
- subscriptionTier SubscriptionTier @default(FREE) // Aktuálny subscription tier (cache)
57
- messageCount Int @default(10) // ✅ OPRAVENÉ z 100 na 10
58
- messageCountResetAt DateTime? // Kedy sa má resetovať message count
59
- adminGrantExpiresAt DateTime? // Kedy admin grant expiruje
60
- // ✨ COMPANY FIELDS (pre SZČO - samostatne zárobkovo činná osoba)
61
- customerType CustomerType @default(INDIVIDUAL) // Typ zákazníka: fyzická osoba alebo SZČO
62
- companyName String? // Obchodné meno (pre SZČO)
63
- companyNumber String? // IČO (povinné pre SZČO, 8 číslic)
64
- vatNumber String? // IČ DPH (SK + 10 číslic, nepovinné)
65
- taxNumber String? // DIČ (10 číslic, nepovinné)
66
- companyStreet String? // Ulica a číslo (pre SZČO)
67
- companyCity String? // Mesto (pre SZČO)
68
- companyPostalCode String? // PSČ (pre SZČO, formát: XXX XX)
69
- companyCountry String? @default("SK") // Krajina (ISO kód, default SK)
70
- // Relations
71
- approvalRequest UserApprovalRequest?
72
- stripeCustomer StripeCustomer? // ✨ B2C Stripe customer
73
- ownedOrganizations Organization[] @relation("OrganizationOwner")
74
- organizationMembers OrganizationMember[]
75
- createdInvites OrganizationInvite[] @relation("InviteCreator")
76
- accounts Account[]
77
- answers Answer[]
78
- conversations Conversation[]
79
- feedbacks Feedback[]
80
- pageViews PageView[]
81
- sessions Session[]
82
- workflowLogs WorkflowLog[]
83
- verificationTokens VerificationToken[]
84
- passwordResetTokens PasswordResetToken[]
85
- canvasDocuments CanvasDocument[]
86
- canvasDocumentVersions CanvasDocumentVersion[]
87
- // Folder system relations
88
- ownedFolders Folder[] @relation("FolderOwner")
89
- addedFolderItems FolderItem[] @relation("FolderItemAdder")
90
- folderActivities FolderActivity[] @relation("FolderActivityUser")
91
- folderSharesReceived FolderShare[] @relation("FolderShareUser")
92
- createdFolderShares FolderShare[] @relation("FolderShareCreator")
93
-
94
- @@index([customerType])
95
- @@index([companyNumber])
96
- @@index([email, customerType])
97
- }
98
-
99
- // Nový model pre žiadosti o schválenie
100
- model UserApprovalRequest {
101
- id String @id @default(cuid())
102
- userId String @unique
103
- status ApprovalStatus @default(PENDING)
104
- submittedAt DateTime @default(now())
105
- reviewedAt DateTime?
106
- reviewedBy String? // ID admina, ktorý preskúmal žiadosť
107
- notes String? // Poznámky admina
108
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
109
-
110
- @@index([status])
111
- @@index([submittedAt])
112
- @@index([reviewedAt])
113
- }
114
-
115
- // ============================================
116
- // ORGANIZATION MODELS (B2B)
117
- // ============================================
118
-
119
- // Organization = Právna kancelária / Firma
120
- model Organization {
121
- id String @id @default(cuid())
122
- name String // "Advokátska kancelária XYZ s.r.o."
123
-
124
- // Billing & Legal Information
125
- companyNumber String? // IČO (Identifikačné číslo organizácie)
126
- vatNumber String? // IČ DPH (VAT Number)
127
- taxNumber String? // DIČ (Daňové identifikačné číslo)
128
- legalForm String? // "s.r.o.", "a.s.", "v.o.s.", "k.s.", "SZČO"
129
- billingEmail String
130
-
131
- // Address
132
- street String?
133
- city String?
134
- postalCode String?
135
- country String @default("SK")
136
-
137
- // Subscription (B2B)
138
- subscriptionTier SubscriptionTier @default(FREE) // Tier organizácie (cache)
139
- messageCount Int @default(0) // Spoločný pool správ pre všetkých členov
140
- messageLimit Int @default(100) // Limit správ podľa tieru
141
- messageCountResetAt DateTime? // Kedy sa má resetovať pool
142
- adminGrantExpiresAt DateTime? // Kedy admin grant expiruje
143
-
144
- // Settings
145
- isActive Boolean @default(true)
146
- maxMembers Int @default(5) // Max počet členov podľa tieru
147
-
148
- // Relations
149
- owner User @relation("OrganizationOwner", fields: [ownerId], references: [id])
150
- ownerId String
151
- members OrganizationMember[]
152
- invites OrganizationInvite[]
153
- stripeCustomer StripeCustomer?
154
- folderShares FolderShare[]
155
-
156
- createdAt DateTime @default(now())
157
- updatedAt DateTime @updatedAt
158
-
159
- @@index([ownerId])
160
- @@index([vatNumber])
161
- @@index([companyNumber])
162
- @@index([subscriptionTier])
163
- @@index([billingEmail])
164
- }
165
-
166
- // Many-to-Many: User ↔ Organization
167
- model OrganizationMember {
168
- id String @id @default(cuid())
169
- organizationId String
170
- userId String
171
- role MemberRole @default(MEMBER)
172
- joinedAt DateTime @default(now())
173
-
174
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
175
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
176
-
177
- @@unique([organizationId, userId])
178
- @@index([organizationId])
179
- @@index([userId])
180
- @@index([role])
181
- }
182
-
183
- // Organization Invite System
184
- model OrganizationInvite {
185
- id String @id @default(cuid())
186
- organizationId String
187
- token String @unique
188
- email String? // Optional: specific email invite
189
- role MemberRole @default(MEMBER)
190
- createdBy String
191
- expiresAt DateTime
192
- maxUses Int @default(1) // For multi-use invites
193
- currentUses Int @default(0)
194
- isActive Boolean @default(true)
195
- usedAt DateTime? // Last usage timestamp
196
- usedBy String? // Last user who used it
197
- createdAt DateTime @default(now())
198
- updatedAt DateTime @updatedAt
199
-
200
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
201
- creator User @relation("InviteCreator", fields: [createdBy], references: [id])
202
-
203
- @@index([token])
204
- @@index([organizationId])
205
- @@index([isActive])
206
- @@index([expiresAt])
207
- }
208
-
209
- enum MemberRole {
210
- OWNER // Zakladateľ/vlastník, plný prístup k billing a settings
211
- ADMIN // Administrátor, môže pridávať/odoberať členov
212
- MEMBER // Bežný člen, len používa systém
213
- }
214
-
215
- // ZJEDNODUŠENÝ Conversation - len metadata, bez duplikátov
216
- model Conversation {
217
- id String @id @default(cuid())
218
- name String
219
- userId String
220
- isShareable Boolean @default(false)
221
- shareUrl String? @unique
222
- sharedAt DateTime?
223
- createdAt DateTime @default(now())
224
- updatedAt DateTime @updatedAt
225
- summary String?
226
- messagesSinceLastSummary Int? @default(0)
227
- // Relácie
228
- answers Answer[]
229
- user User @relation(fields: [userId], references: [id])
230
- workflowLogs WorkflowLog[]
231
- canvasDocuments CanvasDocument[]
232
-
233
- @@index([userId])
234
- @@index([createdAt])
235
- }
236
-
237
- // Hlavný model - všetky správy, bez duplikátov
238
- model Answer {
239
- id String @id @default(cuid())
240
- conversationId String
241
- messageId String @unique
242
- role Role
243
- content String
244
- question String?
245
- answer String?
246
- evaluation String?
247
- isWelcome Boolean @default(false)
248
- processingTime Int?
249
- model String?
250
- userId String?
251
- createdAt DateTime @default(now())
252
- updatedAt DateTime @updatedAt
253
- // Relácie
254
- conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
255
- user User? @relation(fields: [userId], references: [id])
256
- feedback Feedback?
257
- references Reference[]
258
- metrics AnswerMetrics?
259
- WorkflowLog WorkflowLog[]
260
- files MessageFile[]
261
- canvasDocumentId String? // No FK constraint - flexible document management
262
-
263
- @@index([conversationId])
264
- @@index([messageId])
265
- @@index([role])
266
- @@index([userId])
267
- @@index([createdAt])
268
- }
269
-
270
- model MessageFile {
271
- id String @id @default(cuid())
272
- answerId String
273
- fileName String
274
- fileType String
275
- base64Data String
276
- uploadedAt DateTime @default(now())
277
- answer Answer @relation(fields: [answerId], references: [id], onDelete: Cascade)
278
-
279
- @@index([answerId])
280
- @@index([fileType])
281
- @@index([uploadedAt])
282
- }
283
-
284
- // Nová tabuľka pre metriky odpovedí
285
- model AnswerMetrics {
286
- id String @id @default(cuid())
287
- answerId String @unique
288
- // Náklady
289
- apiCost Float? // Celkové náklady (ai_cost + rag_cost)
290
- aiCost Float? // Náklady len na AI provider volania
291
- ragCost Float? // Náklady na RAG operácie
292
- // Volania
293
- apiCalls Int? // Celkový počet volaní
294
- aiCalls Int? // Počet AI provider volaní
295
- ragCalls Int? // Počet RAG operácií
296
- // Čas a výkon
297
- apiDuration Int? // Doba spracovania v ms
298
- // AI Provider a Model
299
- aiProvider String? // Hlavný AI provider
300
- aiModel String? // Hlavný AI model
301
- aiProvidersUsed String[] // Všetky použité AI providery
302
- aiModelsUsed String[] // Všetky použité AI modely
303
- // Timestamps
304
- createdAt DateTime @default(now())
305
- updatedAt DateTime @updatedAt
306
- // Relations
307
- answer Answer @relation(fields: [answerId], references: [id], onDelete: Cascade)
308
-
309
- @@index([answerId])
310
- @@index([apiCost])
311
- @@index([apiDuration])
312
- @@index([aiProvider])
313
- @@index([createdAt])
314
- }
315
-
316
- model Feedback {
317
- id String @id @default(cuid())
318
- answerId String @unique
319
- rating FeedbackRating
320
- feedbackTypes String[]
321
- customFeedback String?
322
- userId String
323
- messageContent String?
324
- createdAt DateTime @default(now())
325
- answer Answer @relation(fields: [answerId], references: [id], onDelete: Cascade)
326
- user User @relation(fields: [userId], references: [id])
327
-
328
- @@index([rating])
329
- @@index([userId])
330
- @@index([answerId])
331
- }
332
-
333
- // ZJEDNODUŠENÝ Reference - len na Answer, bez duplikátov
334
- model Reference {
335
- id String @id @default(cuid())
336
- answerId String // Len answerId - konzistentné
337
- type ReferenceType
338
- title String
339
- reference String
340
- summary String?
341
- url String?
342
- uuid String?
343
- relevance Float?
344
- citationNumber Int?
345
- metadata Json?
346
- userId String?
347
- createdAt DateTime @default(now())
348
- // Relácie
349
- answer Answer @relation(fields: [answerId], references: [id], onDelete: Cascade)
350
-
351
- @@index([answerId])
352
- @@index([type])
353
- @@index([reference])
354
- @@index([userId])
355
- @@index([createdAt])
356
- }
357
-
358
- model PageView {
359
- id String @id @default(cuid())
360
- userId String?
361
- sessionId String?
362
- page String
363
- path String
364
- referrer String?
365
- userAgent String?
366
- ipAddress String?
367
- country String?
368
- city String?
369
- deviceType String?
370
- browser String?
371
- os String?
372
- screenSize String?
373
- language String?
374
- timeOnPage Int?
375
- isBounce Boolean @default(true)
376
- createdAt DateTime @default(now())
377
- session Session? @relation(fields: [sessionId], references: [sessionId], onDelete: SetNull)
378
- user User? @relation(fields: [userId], references: [id])
379
-
380
- @@index([userId])
381
- @@index([sessionId])
382
- @@index([page])
383
- @@index([createdAt])
384
- @@index([country])
385
- @@index([deviceType])
386
- }
387
-
388
- model Session {
389
- id String @id @default(cuid())
390
- sessionId String @unique
391
- userId String?
392
- startedAt DateTime @default(now())
393
- endedAt DateTime?
394
- duration Int?
395
- pageViews PageView[]
396
- user User? @relation(fields: [userId], references: [id])
397
- workflowLogs WorkflowLog[]
398
-
399
- @@index([userId])
400
- @@index([startedAt])
401
- }
402
-
403
- // ============================================
404
- // STRIPE INTEGRATION MODELS
405
- // ============================================
406
-
407
- // Stripe Customer - polymorphic relation (User OR Organization)
408
- model StripeCustomer {
409
- id String @id @default(cuid())
410
-
411
- // ✅ Polymorphic relation - buď User (B2C) alebo Organization (B2B)
412
- userId String? @unique // B2C: Individuálny používateľ
413
- organizationId String? @unique // B2B: Organizácia
414
-
415
- stripeCustomerId String @unique
416
- email String
417
- name String?
418
-
419
- // Billing details (Stripe Address & Tax IDs)
420
- billingAddress Json? // Stripe Address object
421
- taxIds Json? // Stripe Tax IDs array (VAT, etc.)
422
-
423
- createdAt DateTime @default(now())
424
- updatedAt DateTime @updatedAt
425
-
426
- // Relations
427
- user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
428
- organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
429
- subscriptions StripeSubscription[]
430
- payments StripePayment[]
431
-
432
- @@index([stripeCustomerId])
433
- @@index([userId])
434
- @@index([organizationId])
435
- @@index([email])
436
- }
437
-
438
- // Stripe Subscription - sledovanie predplatného (User alebo Organization)
439
- model StripeSubscription {
440
- id String @id @default(cuid())
441
-
442
- // ✅ FIX: customerId = FK na StripeCustomer.id (nie stripeCustomerId!)
443
- customerId String // FK na StripeCustomer.id
444
- stripeCustomerId String // Stripe ID (pre logging/redundancia)
445
- stripeSubscriptionId String @unique
446
- stripePriceId String
447
- stripeProductId String
448
-
449
- status SubscriptionStatus
450
- tier SubscriptionTier @default(FREE)
451
- billingInterval BillingInterval @default(MONTHLY) // Monthly or Yearly billing
452
-
453
- currentPeriodStart DateTime
454
- currentPeriodEnd DateTime
455
- cancelAtPeriodEnd Boolean @default(false)
456
- canceledAt DateTime?
457
-
458
- trialStart DateTime?
459
- trialEnd DateTime?
460
-
461
- // Additional fields
462
- quantity Int @default(1) // Počet seats (pre LAW_FIRM/ENTERPRISE tier)
463
- defaultPaymentMethodId String? // Stripe payment method ID
464
-
465
- metadata Json? // Dodatočné Stripe metadata
466
- createdAt DateTime @default(now())
467
- updatedAt DateTime @updatedAt
468
-
469
- // ✅ FIX: Relácia na customerId (interné ID), nie stripeCustomerId (Stripe ID)
470
- customer StripeCustomer @relation(fields: [customerId], references: [id], onDelete: Cascade)
471
-
472
- @@index([stripeSubscriptionId])
473
- @@index([customerId])
474
- @@index([stripeCustomerId])
475
- @@index([status])
476
- @@index([tier])
477
- @@index([billingInterval])
478
- @@index([currentPeriodEnd])
479
- }
480
-
481
- // Stripe Event - prevencia duplicitného spracovania webhookov (idempotencia)
482
- model StripeEvent {
483
- id String @id @default(cuid())
484
- eventId String @unique // Stripe event ID
485
- type String // Typ eventu (napr. 'checkout.session.completed')
486
- data Json // Úplné event data pre debugging
487
- processed Boolean @default(false)
488
- processedAt DateTime?
489
- error String? // Uloženie chýb pri spracovaní
490
- createdAt DateTime @default(now())
491
-
492
- @@index([eventId])
493
- @@index([processed])
494
- @@index([type])
495
- @@index([createdAt])
496
- }
497
-
498
- // Stripe Payment - sledovanie jednotlivých platieb (voliteľné, pre detailnú analytiku)
499
- model StripePayment {
500
- id String @id @default(cuid())
501
-
502
- // ✅ FIX: Pridaná relácia na StripeCustomer
503
- customerId String
504
- stripePaymentId String @unique
505
- stripeCustomerId String // Redundantné, ale OK pre logging
506
-
507
- amount Int // Suma v centoch
508
- currency String @default("eur")
509
- status String // succeeded, failed, pending
510
- paymentMethod String? // card, sepa_debit, atď.
511
- description String?
512
-
513
- // Invoice info
514
- invoiceId String? // Stripe Invoice ID
515
- invoiceUrl String? // URL na faktúru
516
-
517
- metadata Json?
518
- createdAt DateTime @default(now())
519
-
520
- // ✅ Relácia na StripeCustomer
521
- customer StripeCustomer @relation(fields: [customerId], references: [id], onDelete: Cascade)
522
-
523
- @@index([stripePaymentId])
524
- @@index([customerId])
525
- @@index([stripeCustomerId])
526
- @@index([status])
527
- @@index([createdAt])
528
- }
529
-
530
- // ============================================
531
- // ENUMS
532
- // ============================================
533
-
534
- enum Role {
535
- USER
536
- ASSISTANT
537
- SYSTEM
538
- }
539
-
540
- enum FeedbackRating {
541
- LIKE
542
- DISLIKE
543
- NEUTRAL
544
- }
545
-
546
- enum ReferenceType {
547
- LAW
548
- CASE
549
- REGULATION
550
- DOCUMENT
551
- OTHER
552
- }
553
-
554
- enum ApprovalStatus {
555
- PENDING
556
- APPROVED
557
- REJECTED
558
- }
559
-
560
- // Stripe: Status predplatného
561
- enum SubscriptionStatus {
562
- ACTIVE // Predplatné je aktívne
563
- CANCELED // Predplatné zrušené
564
- INCOMPLETE // Iniciálna platba zlyhala
565
- INCOMPLETE_EXPIRED // Neúplné predplatné expirované
566
- PAST_DUE // Platba zlyhala, retry prebieha
567
- TRIALING // V skúšobnom období
568
- UNPAID // Platba zlyhala, žiadny retry
569
- PAUSED // Predplatné pozastavené (Stripe feature)
570
- }
571
-
572
- // Customer type: Individuálny vs SZČO
573
- enum CustomerType {
574
- INDIVIDUAL // Fyzická osoba (bez IČO)
575
- SELF_EMPLOYED // SZČO - Samostatne zárobkovo činná osoba (s IČO)
576
- }
577
-
578
- // Stripe: Tier predplatného
579
- enum SubscriptionTier {
580
- FREE // Free tier (10 messages/month)
581
- LAWYER // Lawyer tier (1000 messages/month, €29/month, 1 user)
582
- LAWYER_PRO // Lawyer Pro tier (3000 messages/month, €49/month, 1 user) - RECOMMENDED
583
- LAW_FIRM // Law Firm tier (10000 messages/month, €129/month, up to 5 users)
584
- ENTERPRISE // Enterprise tier (unlimited messages, unlimited users, custom pricing)
585
- }
586
-
587
- // Stripe: Billing interval
588
- enum BillingInterval {
589
- MONTHLY // Monthly billing
590
- YEARLY // Yearly billing (17% discount)
591
- }
592
-
593
- // Canvas Document Status
594
- enum DocumentStatus {
595
- DRAFT
596
- SAVED
597
- ARCHIVED
598
- }
599
-
600
- // ============================================
601
- // FOLDER SYSTEM ENUMS
602
- // ============================================
603
-
604
- // Folder item types (what can be stored in folders)
605
- enum FolderItemType {
606
- CONVERSATION
607
- CANVAS_DOCUMENT
608
- REFERENCE
609
- ATTACHMENT
610
- }
611
-
612
- // Folder activity types (for timeline)
613
- enum FolderActivityType {
614
- FOLDER_CREATED
615
- FOLDER_UPDATED
616
- FOLDER_MOVED
617
- FOLDER_ARCHIVED
618
- ITEM_ADDED
619
- ITEM_REMOVED
620
- ITEM_UPDATED
621
- SHARE_ADDED
622
- SHARE_REMOVED
623
- USER_MESSAGE
624
- USER_NOTE
625
- }
626
-
627
- // Folder permission levels
628
- enum FolderPermission {
629
- VIEW
630
- EDIT
631
- ADMIN
632
- }
633
-
634
- // Nový model pre logovanie admin akcií
635
- model AdminActionLog {
636
- id String @id @default(cuid())
637
- action String // APPROVE_USER, REJECT_USER, etc.
638
- targetUserId String // ID používateľa, na ktorého sa akcia vzťahuje
639
- adminEmail String // E-mail admina, ktorý vykonal akciu
640
- details Json? // Ďalšie detaily akcie (reason, notes, etc.)
641
- createdAt DateTime @default(now())
642
-
643
- @@index([action])
644
- @@index([targetUserId])
645
- @@index([adminEmail])
646
- @@index([createdAt])
647
- }
648
-
649
- model WorkflowLog {
650
- id String @id @default(cuid()) // Added @default(cuid())
651
- conversationId String
652
- messageId String?
653
- userId String? // Made optional to preserve logs when users are deleted
654
- sessionId String? // Removed @unique to allow multiple workflows per session
655
- startedAt DateTime @default(now())
656
- completedAt DateTime?
657
- status WorkflowStatus @default(IN_PROGRESS)
658
- totalDuration Int? // milliseconds
659
- error String?
660
- metadata Json?
661
- steps WorkflowStep[] // Renamed from WorkflowStep to steps (lowerCamel, plural)
662
- conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
663
- user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
664
- session Session? @relation(fields: [sessionId], references: [sessionId], onDelete: SetNull)
665
- answer Answer? @relation(fields: [messageId], references: [messageId])
666
-
667
- @@index([conversationId])
668
- @@index([userId])
669
- @@index([sessionId])
670
- @@index([startedAt])
671
- @@index([status])
672
- @@index([conversationId, startedAt]) // Composite index for timeline queries
673
- @@index([messageId])
674
- }
675
-
676
- model WorkflowStep {
677
- id String @id @default(cuid()) // Added @default(cuid())
678
- workflowId String
679
- stepName String // 'classify_question', 'rag_search', 'ai_processing', 'generate_response'
680
- stepType StepType
681
- startedAt DateTime @default(now())
682
- completedAt DateTime?
683
- duration Int? // milliseconds
684
- status StepStatus @default(IN_PROGRESS)
685
- inputData Json? // Sanitized input data
686
- outputData Json? // Sanitized output data
687
- error String?
688
- metadata Json? // Provider used, model used, tokens, costs, etc.
689
- workflow WorkflowLog @relation(fields: [workflowId], references: [id], onDelete: Cascade)
690
-
691
- @@index([workflowId])
692
- @@index([stepName])
693
- @@index([stepType])
694
- @@index([startedAt])
695
- @@index([status])
696
- @@index([workflowId, startedAt]) // Composite index for timeline queries
697
- }
698
-
699
- enum WorkflowStatus {
700
- IN_PROGRESS
701
- COMPLETED
702
- FAILED
703
- CANCELLED
704
- }
705
-
706
- enum StepStatus {
707
- IN_PROGRESS
708
- COMPLETED
709
- FAILED
710
- SKIPPED
711
- }
712
-
713
- enum StepType {
714
- CLASSIFICATION
715
- RAG_RETRIEVAL
716
- AI_PROCESSING
717
- RESPONSE_GENERATION
718
- DATA_PERSISTENCE
719
- ERROR_HANDLING
720
- }
721
-
722
- // Email verification tokens
723
- model VerificationToken {
724
- id String @id @default(cuid())
725
- userId String
726
- token String @unique
727
- expires DateTime
728
- createdAt DateTime @default(now())
729
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
730
-
731
- @@index([token])
732
- @@index([userId])
733
- @@index([expires])
734
- }
735
-
736
- // Password reset tokens
737
- model PasswordResetToken {
738
- id String @id @default(cuid())
739
- userId String
740
- token String @unique
741
- expires DateTime
742
- createdAt DateTime @default(now())
743
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
744
-
745
- @@index([token])
746
- @@index([userId])
747
- @@index([expires])
748
- }
749
-
750
- // ============================================
751
- // CANVAS DOCUMENT MODELS
752
- // ============================================
753
-
754
- model CanvasDocument {
755
- id String @id @default(cuid())
756
- userId String
757
- title String
758
- status DocumentStatus @default(DRAFT)
759
- createdAt DateTime @default(now())
760
- updatedAt DateTime @updatedAt
761
- originConversationId String?
762
- originAnswerId String? // No FK constraint - async save reference
763
- currentVersionId String? @unique
764
-
765
- // Relations
766
- user User @relation(fields: [userId], references: [id], onDelete: Restrict)
767
- originConversation Conversation? @relation(fields: [originConversationId], references: [id], onDelete: SetNull)
768
- currentVersion CanvasDocumentVersion? @relation("CurrentVersion", fields: [currentVersionId], references: [id], onDelete: SetNull)
769
- versions CanvasDocumentVersion[] @relation("DocumentVersions")
770
-
771
- @@index([userId])
772
- @@index([originConversationId])
773
- @@index([status])
774
- @@index([createdAt])
775
- }
776
-
777
- model CanvasDocumentVersion {
778
- id String @id @default(cuid())
779
- documentId String
780
- versionNumber Int
781
- title String
782
- markdownContent String
783
- createdAt DateTime @default(now())
784
- createdBy String
785
- regenerationPrompt String?
786
- parentVersionId String?
787
-
788
- // Relations
789
- document CanvasDocument @relation("DocumentVersions", fields: [documentId], references: [id], onDelete: Cascade)
790
- creator User @relation(fields: [createdBy], references: [id], onDelete: Restrict)
791
- parentVersion CanvasDocumentVersion? @relation("VersionHistory", fields: [parentVersionId], references: [id], onDelete: SetNull)
792
- childVersions CanvasDocumentVersion[] @relation("VersionHistory")
793
- currentForDocument CanvasDocument? @relation("CurrentVersion")
794
-
795
- @@unique([documentId, versionNumber])
796
- @@index([documentId])
797
- @@index([createdBy])
798
- @@index([createdAt])
799
- }
800
-
801
- // ============================================
802
- // FOLDER SYSTEM MODELS
803
- // ============================================
804
-
805
- // Main folder entity with hierarchy support via parentId
806
- // Uses materialized path pattern for efficient hierarchy queries
807
- model Folder {
808
- id String @id @default(cuid())
809
- name String
810
- description String?
811
- color String? @default("#6366f1")
812
- icon String? @default("folder")
813
-
814
- // Ownership (always user-owned)
815
- ownerId String
816
-
817
- // Hierarchy
818
- parentId String?
819
- rootFolderId String? // NULL for root folders, points to top-level ancestor
820
- path String @default("/") // Materialized path: "/parentId/grandparentId/..."
821
- depth Int @default(0)
822
-
823
- // Metadata
824
- sortOrder Int @default(0)
825
- isArchived Boolean @default(false)
826
- createdAt DateTime @default(now())
827
- updatedAt DateTime @updatedAt
828
-
829
- // Relations
830
- owner User @relation("FolderOwner", fields: [ownerId], references: [id], onDelete: Cascade)
831
- parent Folder? @relation("FolderHierarchy", fields: [parentId], references: [id], onDelete: Cascade)
832
- children Folder[] @relation("FolderHierarchy")
833
- items FolderItem[]
834
- activities FolderActivity[]
835
- shares FolderShare[]
836
-
837
- @@index([ownerId])
838
- @@index([parentId])
839
- @@index([rootFolderId])
840
- @@index([path])
841
- @@index([isArchived])
842
- @@index([ownerId, isArchived])
843
- }
844
-
845
- // Links entities (conversations, documents, etc.) to folders
846
- // Polymorphic: entityType + entityId point to any supported entity
847
- model FolderItem {
848
- id String @id @default(cuid())
849
- folderId String
850
-
851
- // Polymorphic reference
852
- entityType FolderItemType
853
- entityId String
854
-
855
- // Optional metadata override
856
- displayName String?
857
- notes String?
858
-
859
- // Denormalized for efficient hierarchy queries
860
- rootFolderId String?
861
-
862
- // Tracking
863
- addedById String
864
- sortOrder Int @default(0)
865
- createdAt DateTime @default(now())
866
- updatedAt DateTime @updatedAt
867
-
868
- // Relations
869
- folder Folder @relation(fields: [folderId], references: [id], onDelete: Cascade)
870
- addedBy User @relation("FolderItemAdder", fields: [addedById], references: [id], onDelete: Restrict)
871
-
872
- @@unique([folderId, entityType, entityId])
873
- @@index([folderId])
874
- @@index([entityType, entityId])
875
- @@index([rootFolderId])
876
- @@index([addedById])
877
- }
878
-
879
- // Timeline entries for folders (system events + user messages)
880
- // Opening ANY folder shows ALL activities from the entire folder tree
881
- model FolderActivity {
882
- id String @id @default(cuid())
883
- folderId String
884
-
885
- // Denormalized for cross-folder timeline queries
886
- rootFolderId String?
887
-
888
- // Activity details
889
- activityType FolderActivityType
890
- userId String
891
- content String? // For USER_MESSAGE, USER_NOTE types
892
- metadata Json? // For system event details
893
- relatedItemId String? // Optional reference to FolderItem
894
-
895
- // Timestamp
896
- createdAt DateTime @default(now())
897
-
898
- // Relations
899
- folder Folder @relation(fields: [folderId], references: [id], onDelete: Cascade)
900
- user User @relation("FolderActivityUser", fields: [userId], references: [id], onDelete: Restrict)
901
-
902
- @@index([folderId])
903
- @@index([rootFolderId])
904
- @@index([userId])
905
- @@index([activityType])
906
- @@index([createdAt])
907
- @@index([rootFolderId, createdAt(sort: Desc)])
908
- }
909
-
910
- // Sharing permissions for folders
911
- // Can share with individual user OR entire organization (not both)
912
- model FolderShare {
913
- id String @id @default(cuid())
914
- folderId String
915
-
916
- // Share target (either user OR organization, enforced by application logic)
917
- userId String?
918
- organizationId String?
919
-
920
- // Permission level
921
- permission FolderPermission @default(VIEW)
922
-
923
- // Sharing metadata
924
- sharedById String
925
- sharedAt DateTime @default(now())
926
- expiresAt DateTime?
927
-
928
- // Relations
929
- folder Folder @relation(fields: [folderId], references: [id], onDelete: Cascade)
930
- user User? @relation("FolderShareUser", fields: [userId], references: [id], onDelete: Cascade)
931
- organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
932
- sharedBy User @relation("FolderShareCreator", fields: [sharedById], references: [id], onDelete: Restrict)
933
-
934
- // Partial unique indexes for nullable columns
935
- @@unique([folderId, userId])
936
- @@unique([folderId, organizationId])
937
- @@index([folderId])
938
- @@index([userId])
939
- @@index([organizationId])
940
- @@index([sharedById])
941
- }