@@ -5,11 +5,15 @@ import {
55 jsonb ,
66 pgEnum ,
77 pgTable ,
8+ primaryKey ,
89 text ,
910 timestamp ,
1011 uuid ,
12+ varchar ,
1113} from 'drizzle-orm/pg-core' ;
14+ import { archivedEmails } from './archived-emails' ;
1215import { custodians } from './custodians' ;
16+ import { users } from './users' ;
1317
1418// --- Enums ---
1519
@@ -33,6 +37,36 @@ export const retentionPolicies = pgTable('retention_policies', {
3337 updatedAt : timestamp ( 'updated_at' , { withTimezone : true } ) . notNull ( ) . defaultNow ( ) ,
3438} ) ;
3539
40+ export const retentionLabels = pgTable ( 'retention_labels' , {
41+ id : uuid ( 'id' ) . defaultRandom ( ) . primaryKey ( ) ,
42+ name : varchar ( 'name' , { length : 255 } ) . notNull ( ) ,
43+ retentionPeriodDays : integer ( 'retention_period_days' ) . notNull ( ) ,
44+ description : text ( 'description' ) ,
45+ createdAt : timestamp ( 'created_at' , { withTimezone : true } ) . notNull ( ) . defaultNow ( ) ,
46+ } ) ;
47+
48+ export const emailRetentionLabels = pgTable ( 'email_retention_labels' , {
49+ emailId : uuid ( 'email_id' )
50+ . references ( ( ) => archivedEmails . id , { onDelete : 'cascade' } )
51+ . notNull ( ) ,
52+ labelId : uuid ( 'label_id' )
53+ . references ( ( ) => retentionLabels . id , { onDelete : 'cascade' } )
54+ . notNull ( ) ,
55+ appliedAt : timestamp ( 'applied_at' , { withTimezone : true } ) . notNull ( ) . defaultNow ( ) ,
56+ appliedByUserId : uuid ( 'applied_by_user_id' ) . references ( ( ) => users . id ) ,
57+ } , ( t ) => [
58+ primaryKey ( { columns : [ t . emailId , t . labelId ] } ) ,
59+ ] ) ;
60+
61+ export const retentionEvents = pgTable ( 'retention_events' , {
62+ id : uuid ( 'id' ) . defaultRandom ( ) . primaryKey ( ) ,
63+ eventName : varchar ( 'event_name' , { length : 255 } ) . notNull ( ) ,
64+ eventType : varchar ( 'event_type' , { length : 100 } ) . notNull ( ) ,
65+ eventTimestamp : timestamp ( 'event_timestamp' , { withTimezone : true } ) . notNull ( ) ,
66+ targetCriteria : jsonb ( 'target_criteria' ) . notNull ( ) ,
67+ createdAt : timestamp ( 'created_at' , { withTimezone : true } ) . notNull ( ) . defaultNow ( ) ,
68+ } ) ;
69+
3670export const ediscoveryCases = pgTable ( 'ediscovery_cases' , {
3771 id : uuid ( 'id' ) . primaryKey ( ) . defaultRandom ( ) ,
3872 name : text ( 'name' ) . notNull ( ) . unique ( ) ,
@@ -44,18 +78,31 @@ export const ediscoveryCases = pgTable('ediscovery_cases', {
4478} ) ;
4579
4680export const legalHolds = pgTable ( 'legal_holds' , {
47- id : uuid ( 'id' ) . primaryKey ( ) . defaultRandom ( ) ,
48- caseId : uuid ( 'case_id' )
49- . notNull ( )
50- . references ( ( ) => ediscoveryCases . id , { onDelete : 'cascade' } ) ,
51- custodianId : uuid ( 'custodian_id' ) . references ( ( ) => custodians . id , { onDelete : 'cascade' } ) ,
52- holdCriteria : jsonb ( 'hold_criteria' ) ,
81+ id : uuid ( 'id' ) . defaultRandom ( ) . primaryKey ( ) ,
82+ name : varchar ( 'name' , { length : 255 } ) . notNull ( ) ,
5383 reason : text ( 'reason' ) ,
54- appliedByIdentifier : text ( 'applied_by_identifier' ) . notNull ( ) ,
55- appliedAt : timestamp ( 'applied_at' , { withTimezone : true } ) . notNull ( ) . defaultNow ( ) ,
56- removedAt : timestamp ( 'removed_at' , { withTimezone : true } ) ,
84+ isActive : boolean ( 'is_active' ) . notNull ( ) . default ( true ) ,
85+ // Optional link to ediscovery cases for backward compatibility or future use
86+ caseId : uuid ( 'case_id' ) . references ( ( ) => ediscoveryCases . id , { onDelete : 'set null' } ) ,
87+ createdAt : timestamp ( 'created_at' , { withTimezone : true } ) . notNull ( ) . defaultNow ( ) ,
88+ updatedAt : timestamp ( 'updated_at' , { withTimezone : true } ) . notNull ( ) . defaultNow ( ) ,
5789} ) ;
5890
91+ export const emailLegalHolds = pgTable (
92+ 'email_legal_holds' ,
93+ {
94+ emailId : uuid ( 'email_id' )
95+ . references ( ( ) => archivedEmails . id , { onDelete : 'cascade' } )
96+ . notNull ( ) ,
97+ legalHoldId : uuid ( 'legal_hold_id' )
98+ . references ( ( ) => legalHolds . id , { onDelete : 'cascade' } )
99+ . notNull ( ) ,
100+ } ,
101+ ( t ) => [
102+ primaryKey ( { columns : [ t . emailId , t . legalHoldId ] } ) ,
103+ ] ,
104+ ) ;
105+
59106export const exportJobs = pgTable ( 'export_jobs' , {
60107 id : uuid ( 'id' ) . primaryKey ( ) . defaultRandom ( ) ,
61108 caseId : uuid ( 'case_id' ) . references ( ( ) => ediscoveryCases . id , { onDelete : 'set null' } ) ,
@@ -70,20 +117,51 @@ export const exportJobs = pgTable('export_jobs', {
70117
71118// --- Relations ---
72119
73- export const ediscoveryCasesRelations = relations ( ediscoveryCases , ( { many } ) => ( {
74- legalHolds : many ( legalHolds ) ,
75- exportJobs : many ( exportJobs ) ,
120+ export const retentionPoliciesRelations = relations ( retentionPolicies , ( { many } ) => ( {
121+ // Add relations if needed
122+ } ) ) ;
123+
124+ export const retentionLabelsRelations = relations ( retentionLabels , ( { many } ) => ( {
125+ emailRetentionLabels : many ( emailRetentionLabels ) ,
126+ } ) ) ;
127+
128+ export const emailRetentionLabelsRelations = relations ( emailRetentionLabels , ( { one } ) => ( {
129+ label : one ( retentionLabels , {
130+ fields : [ emailRetentionLabels . labelId ] ,
131+ references : [ retentionLabels . id ] ,
132+ } ) ,
133+ email : one ( archivedEmails , {
134+ fields : [ emailRetentionLabels . emailId ] ,
135+ references : [ archivedEmails . id ] ,
136+ } ) ,
137+ appliedByUser : one ( users , {
138+ fields : [ emailRetentionLabels . appliedByUserId ] ,
139+ references : [ users . id ] ,
140+ } ) ,
76141} ) ) ;
77142
78- export const legalHoldsRelations = relations ( legalHolds , ( { one } ) => ( {
143+ export const legalHoldsRelations = relations ( legalHolds , ( { one, many } ) => ( {
144+ emailLegalHolds : many ( emailLegalHolds ) ,
79145 ediscoveryCase : one ( ediscoveryCases , {
80146 fields : [ legalHolds . caseId ] ,
81147 references : [ ediscoveryCases . id ] ,
82148 } ) ,
83- custodian : one ( custodians , {
84- fields : [ legalHolds . custodianId ] ,
85- references : [ custodians . id ] ,
149+ } ) ) ;
150+
151+ export const emailLegalHoldsRelations = relations ( emailLegalHolds , ( { one } ) => ( {
152+ legalHold : one ( legalHolds , {
153+ fields : [ emailLegalHolds . legalHoldId ] ,
154+ references : [ legalHolds . id ] ,
86155 } ) ,
156+ email : one ( archivedEmails , {
157+ fields : [ emailLegalHolds . emailId ] ,
158+ references : [ archivedEmails . id ] ,
159+ } ) ,
160+ } ) ) ;
161+
162+ export const ediscoveryCasesRelations = relations ( ediscoveryCases , ( { many } ) => ( {
163+ legalHolds : many ( legalHolds ) ,
164+ exportJobs : many ( exportJobs ) ,
87165} ) ) ;
88166
89167export const exportJobsRelations = relations ( exportJobs , ( { one } ) => ( {
0 commit comments