@varaos/db 1.5.2 → 1.5.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@varaos/db",
3
- "version": "1.5.2",
3
+ "version": "1.5.3",
4
4
  "private": false,
5
5
  "main": "index.js",
6
6
  "files": [
@@ -0,0 +1,77 @@
1
+ -- Migration: add_system_announcements
2
+ -- Description:
3
+ -- 1. Add TargetSegment enum for audience targeting
4
+ -- 2. Add SystemAnnouncement table for broadcast messages
5
+ -- 3. Add UserAnnouncementRead table for read receipts
6
+
7
+ -- ============================================================
8
+ -- 1. ENUM: TargetSegment
9
+ -- ============================================================
10
+
11
+ CREATE TYPE "TargetSegment" AS ENUM (
12
+ 'all',
13
+ 'free_plan',
14
+ 'pro_plan',
15
+ 'business',
16
+ 'enterprise',
17
+ 'admin'
18
+ );
19
+
20
+ -- ============================================================
21
+ -- 2. TABLE: SystemAnnouncement
22
+ -- ============================================================
23
+
24
+ CREATE TABLE "SystemAnnouncement" (
25
+ "id" TEXT NOT NULL,
26
+ "title" TEXT NOT NULL,
27
+ "body" TEXT,
28
+ "type" TEXT NOT NULL,
29
+ "actionUrl" TEXT,
30
+ "targetSegment" "TargetSegment" NOT NULL DEFAULT 'all',
31
+ "active" BOOLEAN NOT NULL DEFAULT true,
32
+ "expiresAt" TIMESTAMP(3),
33
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
34
+
35
+ CONSTRAINT "SystemAnnouncement_pkey" PRIMARY KEY ("id")
36
+ );
37
+
38
+ -- ============================================================
39
+ -- 3. TABLE: UserAnnouncementRead
40
+ -- ============================================================
41
+
42
+ CREATE TABLE "UserAnnouncementRead" (
43
+ "id" TEXT NOT NULL,
44
+ "userId" TEXT NOT NULL,
45
+ "announcementId" TEXT NOT NULL,
46
+ "readAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
47
+
48
+ CONSTRAINT "UserAnnouncementRead_pkey" PRIMARY KEY ("id")
49
+ );
50
+
51
+ -- ============================================================
52
+ -- 4. UNIQUE CONSTRAINT
53
+ -- ============================================================
54
+
55
+ CREATE UNIQUE INDEX "UserAnnouncementRead_userId_announcementId_key"
56
+ ON "UserAnnouncementRead"("userId", "announcementId");
57
+
58
+ -- ============================================================
59
+ -- 5. INDEX
60
+ -- ============================================================
61
+
62
+ CREATE INDEX "UserAnnouncementRead_userId_idx"
63
+ ON "UserAnnouncementRead"("userId");
64
+
65
+ -- ============================================================
66
+ -- 6. FOREIGN KEYS
67
+ -- ============================================================
68
+
69
+ ALTER TABLE "UserAnnouncementRead"
70
+ ADD CONSTRAINT "UserAnnouncementRead_userId_fkey"
71
+ FOREIGN KEY ("userId") REFERENCES "User"("id")
72
+ ON DELETE CASCADE ON UPDATE CASCADE;
73
+
74
+ ALTER TABLE "UserAnnouncementRead"
75
+ ADD CONSTRAINT "UserAnnouncementRead_announcementId_fkey"
76
+ FOREIGN KEY ("announcementId") REFERENCES "SystemAnnouncement"("id")
77
+ ON DELETE CASCADE ON UPDATE CASCADE;
@@ -307,6 +307,15 @@ enum ToolStatus {
307
307
  beta
308
308
  }
309
309
 
310
+ enum TargetSegment {
311
+ all // Broadcast to every active user in the system
312
+ free_plan // Broadcast only to users on the free plan (e.g. upselling campaigns)
313
+ pro_plan // Broadcast only to users on the pro plan (e.g. announcing new premium features)
314
+ business // Broadcast to users on the business plan
315
+ enterprise // Broadcast only to enterprise plan users
316
+ admin // Internal broadcast only for system admins and moderators
317
+ }
318
+
310
319
  /// ─────────────────────────────────────────────
311
320
  /// USERS & AUTH
312
321
  /// ─────────────────────────────────────────────
@@ -1115,6 +1124,35 @@ model Notification {
1115
1124
  @@index([type])
1116
1125
  }
1117
1126
 
1127
+ model SystemAnnouncement {
1128
+ id String @id @default(uuid())
1129
+ title String
1130
+ body String? @db.Text
1131
+ type String // e.g. 'info', 'warning', 'feature', 'maintenance'
1132
+ actionUrl String?
1133
+
1134
+ targetSegment TargetSegment @default(all)
1135
+
1136
+ active Boolean @default(true)
1137
+ expiresAt DateTime?
1138
+ createdAt DateTime @default(now())
1139
+
1140
+ readReceipts UserAnnouncementRead[]
1141
+ }
1142
+
1143
+ model UserAnnouncementRead {
1144
+ id String @id @default(uuid())
1145
+ userId String
1146
+ announcementId String
1147
+ readAt DateTime @default(now())
1148
+
1149
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1150
+ announcement SystemAnnouncement @relation(fields: [announcementId], references: [id], onDelete: Cascade)
1151
+
1152
+ @@unique([userId, announcementId])
1153
+ @@index([userId])
1154
+ }
1155
+
1118
1156
  model ChatSession {
1119
1157
  id String @id @default(uuid())
1120
1158
  title String?