Openstatus www.openstatus.dev

๐Ÿ—‘๏ธ soft delete monitor (#749)

authored by

Thibault Le Ouay and committed by
GitHub
27fd7b5f 65afc32a

+1688 -18
+12 -3
apps/server/src/v1/monitor.ts
··· 1 1 import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; 2 2 3 3 import { trackAnalytics } from "@openstatus/analytics"; 4 - import { db, eq, sql } from "@openstatus/db"; 4 + import { and, db, eq, isNull, sql } from "@openstatus/db"; 5 5 import { 6 6 flyRegions, 7 7 monitor, ··· 325 325 await db 326 326 .select({ count: sql<number>`count(*)` }) 327 327 .from(monitor) 328 - .where(eq(monitor.workspaceId, Number(workspaceId))) 328 + .where( 329 + and( 330 + eq(monitor.workspaceId, Number(workspaceId)), 331 + isNull(monitor.deletedAt), 332 + ), 333 + ) 329 334 .all() 330 335 )[0].count; 331 336 ··· 480 485 if (workspaceId !== _monitor.workspaceId) 481 486 return c.json({ code: 401, message: "Unauthorized" }, 401); 482 487 483 - await db.delete(monitor).where(eq(monitor.id, monitorId)).run(); 488 + await db 489 + .update(monitor) 490 + .set({ active: false, deletedAt: new Date() }) 491 + .where(eq(monitor.id, monitorId)) 492 + .run(); 484 493 return c.json({ message: "Deleted" }); 485 494 }); 486 495
+1 -1
apps/server/src/v1/page.ts
··· 240 240 token: token, 241 241 page: page.title, 242 242 }), 243 - from: "OpenStatus <notification@openstatus.dev>", 243 + from: "OpenStatus <notification@notifications.openstatus.dev>", 244 244 to: [input.email], 245 245 subject: "Verify your subscription", 246 246 });
+1 -1
apps/server/src/v1/statusReport.ts
··· 375 375 subject: `New status update for ${pageInfo.title}`, 376 376 html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 377 377 `, 378 - from: "Notification OpenStatus <notification@openstatus.dev>", 378 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 379 379 }); 380 380 } 381 381 }
+1 -1
apps/server/src/v1/statusReportUpdate.ts
··· 210 210 subject: `New status update for ${pageInfo.title}`, 211 211 html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 212 212 `, 213 - from: "Notification OpenStatus <notification@openstatus.dev>", 213 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 214 214 }); 215 215 } 216 216 }
+1 -1
apps/web/src/app/status-page/[domain]/_components/actions.ts
··· 72 72 token: token, 73 73 page: pageData.title, 74 74 }), 75 - from: "OpenStatus <notification@openstatus.dev>", 75 + from: "OpenStatus <notification@notifications.openstatus.dev>", 76 76 to: [validatedFields.data.email], 77 77 subject: "Verify your subscription to " + pageData.title, 78 78 });
+1 -1
apps/web/src/app/status-page/[domain]/subscribe/route.ts
··· 45 45 token: token, 46 46 page: pageData.title, 47 47 }), 48 - from: "OpenStatus <notification@openstatus.dev>", 48 + from: "OpenStatus <notification@notifications.openstatus.dev>", 49 49 to: [result.email], 50 50 subject: "Verify your subscription to " + pageData.title, 51 51 });
+20 -7
packages/api/src/router/monitor.ts
··· 7 7 serialize, 8 8 StatusAssertion, 9 9 } from "@openstatus/assertions"; 10 - import { and, eq, inArray, sql } from "@openstatus/db"; 10 + import { and, eq, inArray, isNull, sql } from "@openstatus/db"; 11 11 import { 12 12 insertMonitorSchema, 13 13 monitor, ··· 37 37 38 38 const monitorNumbers = ( 39 39 await opts.ctx.db.query.monitor.findMany({ 40 - where: eq(monitor.workspaceId, opts.ctx.workspace.id), 40 + where: and( 41 + eq(monitor.workspaceId, opts.ctx.workspace.id), 42 + isNull(monitor.deletedAt), 43 + ), 41 44 }) 42 45 ).length; 43 46 ··· 158 161 where: and( 159 162 eq(monitor.id, opts.input.id), 160 163 eq(monitor.workspaceId, opts.ctx.workspace.id), 164 + isNull(monitor.deletedAt), 161 165 ), 162 166 with: { 163 167 monitorTagsToMonitors: { with: { monitorTag: true } }, ··· 203 207 }); 204 208 } 205 209 206 - console.log(opts.input); 207 - 208 210 const { 209 211 regions, 210 212 headers, ··· 237 239 and( 238 240 eq(monitor.id, opts.input.id), 239 241 eq(monitor.workspaceId, opts.ctx.workspace.id), 242 + isNull(monitor.deletedAt), 240 243 ), 241 244 ) 242 245 .returning() ··· 373 376 if (!monitorToDelete) return; 374 377 375 378 await opts.ctx.db 376 - .delete(monitor) 379 + .update(monitor) 380 + .set({ deletedAt: new Date(), active: false }) 377 381 .where(eq(monitor.id, monitorToDelete.id)) 378 382 .run(); 383 + 384 + // might delete the notifications and tags related to the monitor 379 385 }), 380 386 381 387 getMonitorsByWorkspace: protectedProcedure.query(async (opts) => { 382 388 const monitors = await opts.ctx.db.query.monitor.findMany({ 383 - where: eq(monitor.workspaceId, opts.ctx.workspace.id), 389 + where: and( 390 + eq(monitor.workspaceId, opts.ctx.workspace.id), 391 + isNull(monitor.deletedAt), 392 + ), 384 393 with: { 385 394 monitorTagsToMonitors: { with: { monitorTag: true } }, 386 395 }, ··· 407 416 and( 408 417 eq(monitor.id, opts.input.id), 409 418 eq(monitor.workspaceId, opts.ctx.workspace.id), 419 + isNull(monitor.deletedAt), 410 420 ), 411 421 ) 412 422 .get(); ··· 467 477 const monitorLimit = allPlans[opts.ctx.workspace.plan].limits.monitors; 468 478 const monitorNumbers = ( 469 479 await opts.ctx.db.query.monitor.findMany({ 470 - where: eq(monitor.workspaceId, opts.ctx.workspace.id), 480 + where: and( 481 + eq(monitor.workspaceId, opts.ctx.workspace.id), 482 + isNull(monitor.deletedAt), 483 + ), 471 484 }) 472 485 ).length; 473 486
+7 -2
packages/api/src/router/page.ts
··· 1 1 import { TRPCError } from "@trpc/server"; 2 2 import { z } from "zod"; 3 3 4 - import { and, eq, inArray, or, sql } from "@openstatus/db"; 4 + import { and, eq, inArray, isNull, or, sql } from "@openstatus/db"; 5 5 import { 6 6 incidentTable, 7 7 insertPageSchema, ··· 51 51 where: and( 52 52 inArray(monitor.id, monitors), 53 53 eq(monitor.workspaceId, opts.ctx.workspace.id), 54 + isNull(monitor.deletedAt), 54 55 ), 55 56 }); 56 57 ··· 235 236 .select() 236 237 .from(monitor) 237 238 .where( 238 - and(inArray(monitor.id, monitorsId), eq(monitor.active, true)), // REMINDER: this is hardcoded 239 + and( 240 + inArray(monitor.id, monitorsId), 241 + eq(monitor.active, true), 242 + isNull(monitor.deletedAt), 243 + ), // REMINDER: this is hardcoded 239 244 ) 240 245 .all() 241 246 : [];
+1 -1
packages/api/src/router/statusReport.ts
··· 133 133 subject: `New status update for ${pageInfo.title}`, 134 134 html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${updatedValue.status}</p><p>${updatedValue.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 135 135 `, 136 - from: "Notification OpenStatus <notification@openstatus.dev>", 136 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 137 137 }); 138 138 } 139 139 }
+1
packages/db/drizzle/0024_young_proudstar.sql
··· 1 + ALTER TABLE monitor ADD `deleted_at` integer;
+1633
packages/db/drizzle/meta/0024_snapshot.json
··· 1 + { 2 + "version": "5", 3 + "dialect": "sqlite", 4 + "id": "96f82403-94f3-49fd-871b-946bc0a687f2", 5 + "prevId": "a8569d87-b829-4372-9f00-1c61a956f117", 6 + "tables": { 7 + "status_report_to_monitors": { 8 + "name": "status_report_to_monitors", 9 + "columns": { 10 + "monitor_id": { 11 + "name": "monitor_id", 12 + "type": "integer", 13 + "primaryKey": false, 14 + "notNull": true, 15 + "autoincrement": false 16 + }, 17 + "status_report_id": { 18 + "name": "status_report_id", 19 + "type": "integer", 20 + "primaryKey": false, 21 + "notNull": true, 22 + "autoincrement": false 23 + }, 24 + "created_at": { 25 + "name": "created_at", 26 + "type": "integer", 27 + "primaryKey": false, 28 + "notNull": false, 29 + "autoincrement": false, 30 + "default": "(strftime('%s', 'now'))" 31 + } 32 + }, 33 + "indexes": {}, 34 + "foreignKeys": { 35 + "status_report_to_monitors_monitor_id_monitor_id_fk": { 36 + "name": "status_report_to_monitors_monitor_id_monitor_id_fk", 37 + "tableFrom": "status_report_to_monitors", 38 + "tableTo": "monitor", 39 + "columnsFrom": [ 40 + "monitor_id" 41 + ], 42 + "columnsTo": [ 43 + "id" 44 + ], 45 + "onDelete": "cascade", 46 + "onUpdate": "no action" 47 + }, 48 + "status_report_to_monitors_status_report_id_status_report_id_fk": { 49 + "name": "status_report_to_monitors_status_report_id_status_report_id_fk", 50 + "tableFrom": "status_report_to_monitors", 51 + "tableTo": "status_report", 52 + "columnsFrom": [ 53 + "status_report_id" 54 + ], 55 + "columnsTo": [ 56 + "id" 57 + ], 58 + "onDelete": "cascade", 59 + "onUpdate": "no action" 60 + } 61 + }, 62 + "compositePrimaryKeys": { 63 + "status_report_to_monitors_monitor_id_status_report_id_pk": { 64 + "columns": [ 65 + "monitor_id", 66 + "status_report_id" 67 + ], 68 + "name": "status_report_to_monitors_monitor_id_status_report_id_pk" 69 + } 70 + }, 71 + "uniqueConstraints": {} 72 + }, 73 + "status_reports_to_pages": { 74 + "name": "status_reports_to_pages", 75 + "columns": { 76 + "page_id": { 77 + "name": "page_id", 78 + "type": "integer", 79 + "primaryKey": false, 80 + "notNull": true, 81 + "autoincrement": false 82 + }, 83 + "status_report_id": { 84 + "name": "status_report_id", 85 + "type": "integer", 86 + "primaryKey": false, 87 + "notNull": true, 88 + "autoincrement": false 89 + }, 90 + "created_at": { 91 + "name": "created_at", 92 + "type": "integer", 93 + "primaryKey": false, 94 + "notNull": false, 95 + "autoincrement": false, 96 + "default": "(strftime('%s', 'now'))" 97 + } 98 + }, 99 + "indexes": {}, 100 + "foreignKeys": { 101 + "status_reports_to_pages_page_id_page_id_fk": { 102 + "name": "status_reports_to_pages_page_id_page_id_fk", 103 + "tableFrom": "status_reports_to_pages", 104 + "tableTo": "page", 105 + "columnsFrom": [ 106 + "page_id" 107 + ], 108 + "columnsTo": [ 109 + "id" 110 + ], 111 + "onDelete": "cascade", 112 + "onUpdate": "no action" 113 + }, 114 + "status_reports_to_pages_status_report_id_status_report_id_fk": { 115 + "name": "status_reports_to_pages_status_report_id_status_report_id_fk", 116 + "tableFrom": "status_reports_to_pages", 117 + "tableTo": "status_report", 118 + "columnsFrom": [ 119 + "status_report_id" 120 + ], 121 + "columnsTo": [ 122 + "id" 123 + ], 124 + "onDelete": "cascade", 125 + "onUpdate": "no action" 126 + } 127 + }, 128 + "compositePrimaryKeys": { 129 + "status_reports_to_pages_page_id_status_report_id_pk": { 130 + "columns": [ 131 + "page_id", 132 + "status_report_id" 133 + ], 134 + "name": "status_reports_to_pages_page_id_status_report_id_pk" 135 + } 136 + }, 137 + "uniqueConstraints": {} 138 + }, 139 + "status_report": { 140 + "name": "status_report", 141 + "columns": { 142 + "id": { 143 + "name": "id", 144 + "type": "integer", 145 + "primaryKey": true, 146 + "notNull": true, 147 + "autoincrement": false 148 + }, 149 + "status": { 150 + "name": "status", 151 + "type": "text", 152 + "primaryKey": false, 153 + "notNull": true, 154 + "autoincrement": false 155 + }, 156 + "title": { 157 + "name": "title", 158 + "type": "text(256)", 159 + "primaryKey": false, 160 + "notNull": true, 161 + "autoincrement": false 162 + }, 163 + "workspace_id": { 164 + "name": "workspace_id", 165 + "type": "integer", 166 + "primaryKey": false, 167 + "notNull": false, 168 + "autoincrement": false 169 + }, 170 + "created_at": { 171 + "name": "created_at", 172 + "type": "integer", 173 + "primaryKey": false, 174 + "notNull": false, 175 + "autoincrement": false, 176 + "default": "(strftime('%s', 'now'))" 177 + }, 178 + "updated_at": { 179 + "name": "updated_at", 180 + "type": "integer", 181 + "primaryKey": false, 182 + "notNull": false, 183 + "autoincrement": false, 184 + "default": "(strftime('%s', 'now'))" 185 + } 186 + }, 187 + "indexes": {}, 188 + "foreignKeys": { 189 + "status_report_workspace_id_workspace_id_fk": { 190 + "name": "status_report_workspace_id_workspace_id_fk", 191 + "tableFrom": "status_report", 192 + "tableTo": "workspace", 193 + "columnsFrom": [ 194 + "workspace_id" 195 + ], 196 + "columnsTo": [ 197 + "id" 198 + ], 199 + "onDelete": "no action", 200 + "onUpdate": "no action" 201 + } 202 + }, 203 + "compositePrimaryKeys": {}, 204 + "uniqueConstraints": {} 205 + }, 206 + "status_report_update": { 207 + "name": "status_report_update", 208 + "columns": { 209 + "id": { 210 + "name": "id", 211 + "type": "integer", 212 + "primaryKey": true, 213 + "notNull": true, 214 + "autoincrement": false 215 + }, 216 + "status": { 217 + "name": "status", 218 + "type": "text(4)", 219 + "primaryKey": false, 220 + "notNull": true, 221 + "autoincrement": false 222 + }, 223 + "date": { 224 + "name": "date", 225 + "type": "integer", 226 + "primaryKey": false, 227 + "notNull": true, 228 + "autoincrement": false 229 + }, 230 + "message": { 231 + "name": "message", 232 + "type": "text", 233 + "primaryKey": false, 234 + "notNull": true, 235 + "autoincrement": false 236 + }, 237 + "status_report_id": { 238 + "name": "status_report_id", 239 + "type": "integer", 240 + "primaryKey": false, 241 + "notNull": true, 242 + "autoincrement": false 243 + }, 244 + "created_at": { 245 + "name": "created_at", 246 + "type": "integer", 247 + "primaryKey": false, 248 + "notNull": false, 249 + "autoincrement": false, 250 + "default": "(strftime('%s', 'now'))" 251 + }, 252 + "updated_at": { 253 + "name": "updated_at", 254 + "type": "integer", 255 + "primaryKey": false, 256 + "notNull": false, 257 + "autoincrement": false, 258 + "default": "(strftime('%s', 'now'))" 259 + } 260 + }, 261 + "indexes": {}, 262 + "foreignKeys": { 263 + "status_report_update_status_report_id_status_report_id_fk": { 264 + "name": "status_report_update_status_report_id_status_report_id_fk", 265 + "tableFrom": "status_report_update", 266 + "tableTo": "status_report", 267 + "columnsFrom": [ 268 + "status_report_id" 269 + ], 270 + "columnsTo": [ 271 + "id" 272 + ], 273 + "onDelete": "cascade", 274 + "onUpdate": "no action" 275 + } 276 + }, 277 + "compositePrimaryKeys": {}, 278 + "uniqueConstraints": {} 279 + }, 280 + "integration": { 281 + "name": "integration", 282 + "columns": { 283 + "id": { 284 + "name": "id", 285 + "type": "integer", 286 + "primaryKey": true, 287 + "notNull": true, 288 + "autoincrement": false 289 + }, 290 + "name": { 291 + "name": "name", 292 + "type": "text(256)", 293 + "primaryKey": false, 294 + "notNull": true, 295 + "autoincrement": false 296 + }, 297 + "workspace_id": { 298 + "name": "workspace_id", 299 + "type": "integer", 300 + "primaryKey": false, 301 + "notNull": false, 302 + "autoincrement": false 303 + }, 304 + "credential": { 305 + "name": "credential", 306 + "type": "text", 307 + "primaryKey": false, 308 + "notNull": false, 309 + "autoincrement": false 310 + }, 311 + "external_id": { 312 + "name": "external_id", 313 + "type": "text", 314 + "primaryKey": false, 315 + "notNull": true, 316 + "autoincrement": false 317 + }, 318 + "created_at": { 319 + "name": "created_at", 320 + "type": "integer", 321 + "primaryKey": false, 322 + "notNull": false, 323 + "autoincrement": false, 324 + "default": "(strftime('%s', 'now'))" 325 + }, 326 + "updated_at": { 327 + "name": "updated_at", 328 + "type": "integer", 329 + "primaryKey": false, 330 + "notNull": false, 331 + "autoincrement": false, 332 + "default": "(strftime('%s', 'now'))" 333 + }, 334 + "data": { 335 + "name": "data", 336 + "type": "text", 337 + "primaryKey": false, 338 + "notNull": true, 339 + "autoincrement": false 340 + } 341 + }, 342 + "indexes": {}, 343 + "foreignKeys": { 344 + "integration_workspace_id_workspace_id_fk": { 345 + "name": "integration_workspace_id_workspace_id_fk", 346 + "tableFrom": "integration", 347 + "tableTo": "workspace", 348 + "columnsFrom": [ 349 + "workspace_id" 350 + ], 351 + "columnsTo": [ 352 + "id" 353 + ], 354 + "onDelete": "no action", 355 + "onUpdate": "no action" 356 + } 357 + }, 358 + "compositePrimaryKeys": {}, 359 + "uniqueConstraints": {} 360 + }, 361 + "page": { 362 + "name": "page", 363 + "columns": { 364 + "id": { 365 + "name": "id", 366 + "type": "integer", 367 + "primaryKey": true, 368 + "notNull": true, 369 + "autoincrement": false 370 + }, 371 + "workspace_id": { 372 + "name": "workspace_id", 373 + "type": "integer", 374 + "primaryKey": false, 375 + "notNull": true, 376 + "autoincrement": false 377 + }, 378 + "title": { 379 + "name": "title", 380 + "type": "text", 381 + "primaryKey": false, 382 + "notNull": true, 383 + "autoincrement": false 384 + }, 385 + "description": { 386 + "name": "description", 387 + "type": "text", 388 + "primaryKey": false, 389 + "notNull": true, 390 + "autoincrement": false 391 + }, 392 + "icon": { 393 + "name": "icon", 394 + "type": "text(256)", 395 + "primaryKey": false, 396 + "notNull": false, 397 + "autoincrement": false, 398 + "default": "''" 399 + }, 400 + "slug": { 401 + "name": "slug", 402 + "type": "text(256)", 403 + "primaryKey": false, 404 + "notNull": true, 405 + "autoincrement": false 406 + }, 407 + "custom_domain": { 408 + "name": "custom_domain", 409 + "type": "text(256)", 410 + "primaryKey": false, 411 + "notNull": true, 412 + "autoincrement": false 413 + }, 414 + "published": { 415 + "name": "published", 416 + "type": "integer", 417 + "primaryKey": false, 418 + "notNull": false, 419 + "autoincrement": false, 420 + "default": false 421 + }, 422 + "created_at": { 423 + "name": "created_at", 424 + "type": "integer", 425 + "primaryKey": false, 426 + "notNull": false, 427 + "autoincrement": false, 428 + "default": "(strftime('%s', 'now'))" 429 + }, 430 + "updated_at": { 431 + "name": "updated_at", 432 + "type": "integer", 433 + "primaryKey": false, 434 + "notNull": false, 435 + "autoincrement": false, 436 + "default": "(strftime('%s', 'now'))" 437 + } 438 + }, 439 + "indexes": { 440 + "page_slug_unique": { 441 + "name": "page_slug_unique", 442 + "columns": [ 443 + "slug" 444 + ], 445 + "isUnique": true 446 + } 447 + }, 448 + "foreignKeys": { 449 + "page_workspace_id_workspace_id_fk": { 450 + "name": "page_workspace_id_workspace_id_fk", 451 + "tableFrom": "page", 452 + "tableTo": "workspace", 453 + "columnsFrom": [ 454 + "workspace_id" 455 + ], 456 + "columnsTo": [ 457 + "id" 458 + ], 459 + "onDelete": "cascade", 460 + "onUpdate": "no action" 461 + } 462 + }, 463 + "compositePrimaryKeys": {}, 464 + "uniqueConstraints": {} 465 + }, 466 + "monitor": { 467 + "name": "monitor", 468 + "columns": { 469 + "id": { 470 + "name": "id", 471 + "type": "integer", 472 + "primaryKey": true, 473 + "notNull": true, 474 + "autoincrement": false 475 + }, 476 + "job_type": { 477 + "name": "job_type", 478 + "type": "text", 479 + "primaryKey": false, 480 + "notNull": true, 481 + "autoincrement": false, 482 + "default": "'other'" 483 + }, 484 + "periodicity": { 485 + "name": "periodicity", 486 + "type": "text", 487 + "primaryKey": false, 488 + "notNull": true, 489 + "autoincrement": false, 490 + "default": "'other'" 491 + }, 492 + "status": { 493 + "name": "status", 494 + "type": "text", 495 + "primaryKey": false, 496 + "notNull": true, 497 + "autoincrement": false, 498 + "default": "'active'" 499 + }, 500 + "active": { 501 + "name": "active", 502 + "type": "integer", 503 + "primaryKey": false, 504 + "notNull": false, 505 + "autoincrement": false, 506 + "default": false 507 + }, 508 + "regions": { 509 + "name": "regions", 510 + "type": "text", 511 + "primaryKey": false, 512 + "notNull": true, 513 + "autoincrement": false, 514 + "default": "''" 515 + }, 516 + "url": { 517 + "name": "url", 518 + "type": "text(2048)", 519 + "primaryKey": false, 520 + "notNull": true, 521 + "autoincrement": false 522 + }, 523 + "name": { 524 + "name": "name", 525 + "type": "text(256)", 526 + "primaryKey": false, 527 + "notNull": true, 528 + "autoincrement": false, 529 + "default": "''" 530 + }, 531 + "description": { 532 + "name": "description", 533 + "type": "text", 534 + "primaryKey": false, 535 + "notNull": true, 536 + "autoincrement": false, 537 + "default": "''" 538 + }, 539 + "headers": { 540 + "name": "headers", 541 + "type": "text", 542 + "primaryKey": false, 543 + "notNull": false, 544 + "autoincrement": false, 545 + "default": "''" 546 + }, 547 + "body": { 548 + "name": "body", 549 + "type": "text", 550 + "primaryKey": false, 551 + "notNull": false, 552 + "autoincrement": false, 553 + "default": "''" 554 + }, 555 + "method": { 556 + "name": "method", 557 + "type": "text", 558 + "primaryKey": false, 559 + "notNull": false, 560 + "autoincrement": false, 561 + "default": "'GET'" 562 + }, 563 + "workspace_id": { 564 + "name": "workspace_id", 565 + "type": "integer", 566 + "primaryKey": false, 567 + "notNull": false, 568 + "autoincrement": false 569 + }, 570 + "assertions": { 571 + "name": "assertions", 572 + "type": "text", 573 + "primaryKey": false, 574 + "notNull": false, 575 + "autoincrement": false 576 + }, 577 + "created_at": { 578 + "name": "created_at", 579 + "type": "integer", 580 + "primaryKey": false, 581 + "notNull": false, 582 + "autoincrement": false, 583 + "default": "(strftime('%s', 'now'))" 584 + }, 585 + "updated_at": { 586 + "name": "updated_at", 587 + "type": "integer", 588 + "primaryKey": false, 589 + "notNull": false, 590 + "autoincrement": false, 591 + "default": "(strftime('%s', 'now'))" 592 + }, 593 + "deleted_at": { 594 + "name": "deleted_at", 595 + "type": "integer", 596 + "primaryKey": false, 597 + "notNull": false, 598 + "autoincrement": false 599 + } 600 + }, 601 + "indexes": {}, 602 + "foreignKeys": { 603 + "monitor_workspace_id_workspace_id_fk": { 604 + "name": "monitor_workspace_id_workspace_id_fk", 605 + "tableFrom": "monitor", 606 + "tableTo": "workspace", 607 + "columnsFrom": [ 608 + "workspace_id" 609 + ], 610 + "columnsTo": [ 611 + "id" 612 + ], 613 + "onDelete": "no action", 614 + "onUpdate": "no action" 615 + } 616 + }, 617 + "compositePrimaryKeys": {}, 618 + "uniqueConstraints": {} 619 + }, 620 + "monitors_to_pages": { 621 + "name": "monitors_to_pages", 622 + "columns": { 623 + "monitor_id": { 624 + "name": "monitor_id", 625 + "type": "integer", 626 + "primaryKey": false, 627 + "notNull": true, 628 + "autoincrement": false 629 + }, 630 + "page_id": { 631 + "name": "page_id", 632 + "type": "integer", 633 + "primaryKey": false, 634 + "notNull": true, 635 + "autoincrement": false 636 + }, 637 + "created_at": { 638 + "name": "created_at", 639 + "type": "integer", 640 + "primaryKey": false, 641 + "notNull": false, 642 + "autoincrement": false, 643 + "default": "(strftime('%s', 'now'))" 644 + } 645 + }, 646 + "indexes": {}, 647 + "foreignKeys": { 648 + "monitors_to_pages_monitor_id_monitor_id_fk": { 649 + "name": "monitors_to_pages_monitor_id_monitor_id_fk", 650 + "tableFrom": "monitors_to_pages", 651 + "tableTo": "monitor", 652 + "columnsFrom": [ 653 + "monitor_id" 654 + ], 655 + "columnsTo": [ 656 + "id" 657 + ], 658 + "onDelete": "cascade", 659 + "onUpdate": "no action" 660 + }, 661 + "monitors_to_pages_page_id_page_id_fk": { 662 + "name": "monitors_to_pages_page_id_page_id_fk", 663 + "tableFrom": "monitors_to_pages", 664 + "tableTo": "page", 665 + "columnsFrom": [ 666 + "page_id" 667 + ], 668 + "columnsTo": [ 669 + "id" 670 + ], 671 + "onDelete": "cascade", 672 + "onUpdate": "no action" 673 + } 674 + }, 675 + "compositePrimaryKeys": { 676 + "monitors_to_pages_monitor_id_page_id_pk": { 677 + "columns": [ 678 + "monitor_id", 679 + "page_id" 680 + ], 681 + "name": "monitors_to_pages_monitor_id_page_id_pk" 682 + } 683 + }, 684 + "uniqueConstraints": {} 685 + }, 686 + "user": { 687 + "name": "user", 688 + "columns": { 689 + "id": { 690 + "name": "id", 691 + "type": "integer", 692 + "primaryKey": true, 693 + "notNull": true, 694 + "autoincrement": false 695 + }, 696 + "tenant_id": { 697 + "name": "tenant_id", 698 + "type": "text(256)", 699 + "primaryKey": false, 700 + "notNull": false, 701 + "autoincrement": false 702 + }, 703 + "first_name": { 704 + "name": "first_name", 705 + "type": "text", 706 + "primaryKey": false, 707 + "notNull": false, 708 + "autoincrement": false, 709 + "default": "''" 710 + }, 711 + "last_name": { 712 + "name": "last_name", 713 + "type": "text", 714 + "primaryKey": false, 715 + "notNull": false, 716 + "autoincrement": false, 717 + "default": "''" 718 + }, 719 + "email": { 720 + "name": "email", 721 + "type": "text", 722 + "primaryKey": false, 723 + "notNull": false, 724 + "autoincrement": false, 725 + "default": "''" 726 + }, 727 + "photo_url": { 728 + "name": "photo_url", 729 + "type": "text", 730 + "primaryKey": false, 731 + "notNull": false, 732 + "autoincrement": false, 733 + "default": "''" 734 + }, 735 + "created_at": { 736 + "name": "created_at", 737 + "type": "integer", 738 + "primaryKey": false, 739 + "notNull": false, 740 + "autoincrement": false, 741 + "default": "(strftime('%s', 'now'))" 742 + }, 743 + "updated_at": { 744 + "name": "updated_at", 745 + "type": "integer", 746 + "primaryKey": false, 747 + "notNull": false, 748 + "autoincrement": false, 749 + "default": "(strftime('%s', 'now'))" 750 + } 751 + }, 752 + "indexes": { 753 + "user_tenant_id_unique": { 754 + "name": "user_tenant_id_unique", 755 + "columns": [ 756 + "tenant_id" 757 + ], 758 + "isUnique": true 759 + } 760 + }, 761 + "foreignKeys": {}, 762 + "compositePrimaryKeys": {}, 763 + "uniqueConstraints": {} 764 + }, 765 + "users_to_workspaces": { 766 + "name": "users_to_workspaces", 767 + "columns": { 768 + "user_id": { 769 + "name": "user_id", 770 + "type": "integer", 771 + "primaryKey": false, 772 + "notNull": true, 773 + "autoincrement": false 774 + }, 775 + "workspace_id": { 776 + "name": "workspace_id", 777 + "type": "integer", 778 + "primaryKey": false, 779 + "notNull": true, 780 + "autoincrement": false 781 + }, 782 + "role": { 783 + "name": "role", 784 + "type": "text", 785 + "primaryKey": false, 786 + "notNull": true, 787 + "autoincrement": false, 788 + "default": "'member'" 789 + }, 790 + "created_at": { 791 + "name": "created_at", 792 + "type": "integer", 793 + "primaryKey": false, 794 + "notNull": false, 795 + "autoincrement": false, 796 + "default": "(strftime('%s', 'now'))" 797 + } 798 + }, 799 + "indexes": {}, 800 + "foreignKeys": { 801 + "users_to_workspaces_user_id_user_id_fk": { 802 + "name": "users_to_workspaces_user_id_user_id_fk", 803 + "tableFrom": "users_to_workspaces", 804 + "tableTo": "user", 805 + "columnsFrom": [ 806 + "user_id" 807 + ], 808 + "columnsTo": [ 809 + "id" 810 + ], 811 + "onDelete": "no action", 812 + "onUpdate": "no action" 813 + }, 814 + "users_to_workspaces_workspace_id_workspace_id_fk": { 815 + "name": "users_to_workspaces_workspace_id_workspace_id_fk", 816 + "tableFrom": "users_to_workspaces", 817 + "tableTo": "workspace", 818 + "columnsFrom": [ 819 + "workspace_id" 820 + ], 821 + "columnsTo": [ 822 + "id" 823 + ], 824 + "onDelete": "no action", 825 + "onUpdate": "no action" 826 + } 827 + }, 828 + "compositePrimaryKeys": { 829 + "users_to_workspaces_user_id_workspace_id_pk": { 830 + "columns": [ 831 + "user_id", 832 + "workspace_id" 833 + ], 834 + "name": "users_to_workspaces_user_id_workspace_id_pk" 835 + } 836 + }, 837 + "uniqueConstraints": {} 838 + }, 839 + "page_subscriber": { 840 + "name": "page_subscriber", 841 + "columns": { 842 + "id": { 843 + "name": "id", 844 + "type": "integer", 845 + "primaryKey": true, 846 + "notNull": true, 847 + "autoincrement": false 848 + }, 849 + "email": { 850 + "name": "email", 851 + "type": "text", 852 + "primaryKey": false, 853 + "notNull": true, 854 + "autoincrement": false 855 + }, 856 + "page_id": { 857 + "name": "page_id", 858 + "type": "integer", 859 + "primaryKey": false, 860 + "notNull": true, 861 + "autoincrement": false 862 + }, 863 + "token": { 864 + "name": "token", 865 + "type": "text", 866 + "primaryKey": false, 867 + "notNull": false, 868 + "autoincrement": false 869 + }, 870 + "accepted_at": { 871 + "name": "accepted_at", 872 + "type": "integer", 873 + "primaryKey": false, 874 + "notNull": false, 875 + "autoincrement": false 876 + }, 877 + "expires_at": { 878 + "name": "expires_at", 879 + "type": "integer", 880 + "primaryKey": false, 881 + "notNull": false, 882 + "autoincrement": false 883 + }, 884 + "created_at": { 885 + "name": "created_at", 886 + "type": "integer", 887 + "primaryKey": false, 888 + "notNull": false, 889 + "autoincrement": false, 890 + "default": "(strftime('%s', 'now'))" 891 + }, 892 + "updated_at": { 893 + "name": "updated_at", 894 + "type": "integer", 895 + "primaryKey": false, 896 + "notNull": false, 897 + "autoincrement": false, 898 + "default": "(strftime('%s', 'now'))" 899 + } 900 + }, 901 + "indexes": {}, 902 + "foreignKeys": { 903 + "page_subscriber_page_id_page_id_fk": { 904 + "name": "page_subscriber_page_id_page_id_fk", 905 + "tableFrom": "page_subscriber", 906 + "tableTo": "page", 907 + "columnsFrom": [ 908 + "page_id" 909 + ], 910 + "columnsTo": [ 911 + "id" 912 + ], 913 + "onDelete": "no action", 914 + "onUpdate": "no action" 915 + } 916 + }, 917 + "compositePrimaryKeys": {}, 918 + "uniqueConstraints": {} 919 + }, 920 + "workspace": { 921 + "name": "workspace", 922 + "columns": { 923 + "id": { 924 + "name": "id", 925 + "type": "integer", 926 + "primaryKey": true, 927 + "notNull": true, 928 + "autoincrement": false 929 + }, 930 + "slug": { 931 + "name": "slug", 932 + "type": "text", 933 + "primaryKey": false, 934 + "notNull": true, 935 + "autoincrement": false 936 + }, 937 + "name": { 938 + "name": "name", 939 + "type": "text", 940 + "primaryKey": false, 941 + "notNull": false, 942 + "autoincrement": false 943 + }, 944 + "stripe_id": { 945 + "name": "stripe_id", 946 + "type": "text(256)", 947 + "primaryKey": false, 948 + "notNull": false, 949 + "autoincrement": false 950 + }, 951 + "subscription_id": { 952 + "name": "subscription_id", 953 + "type": "text", 954 + "primaryKey": false, 955 + "notNull": false, 956 + "autoincrement": false 957 + }, 958 + "plan": { 959 + "name": "plan", 960 + "type": "text", 961 + "primaryKey": false, 962 + "notNull": false, 963 + "autoincrement": false 964 + }, 965 + "ends_at": { 966 + "name": "ends_at", 967 + "type": "integer", 968 + "primaryKey": false, 969 + "notNull": false, 970 + "autoincrement": false 971 + }, 972 + "paid_until": { 973 + "name": "paid_until", 974 + "type": "integer", 975 + "primaryKey": false, 976 + "notNull": false, 977 + "autoincrement": false 978 + }, 979 + "created_at": { 980 + "name": "created_at", 981 + "type": "integer", 982 + "primaryKey": false, 983 + "notNull": false, 984 + "autoincrement": false, 985 + "default": "(strftime('%s', 'now'))" 986 + }, 987 + "updated_at": { 988 + "name": "updated_at", 989 + "type": "integer", 990 + "primaryKey": false, 991 + "notNull": false, 992 + "autoincrement": false, 993 + "default": "(strftime('%s', 'now'))" 994 + } 995 + }, 996 + "indexes": { 997 + "workspace_slug_unique": { 998 + "name": "workspace_slug_unique", 999 + "columns": [ 1000 + "slug" 1001 + ], 1002 + "isUnique": true 1003 + }, 1004 + "workspace_stripe_id_unique": { 1005 + "name": "workspace_stripe_id_unique", 1006 + "columns": [ 1007 + "stripe_id" 1008 + ], 1009 + "isUnique": true 1010 + } 1011 + }, 1012 + "foreignKeys": {}, 1013 + "compositePrimaryKeys": {}, 1014 + "uniqueConstraints": {} 1015 + }, 1016 + "notification": { 1017 + "name": "notification", 1018 + "columns": { 1019 + "id": { 1020 + "name": "id", 1021 + "type": "integer", 1022 + "primaryKey": true, 1023 + "notNull": true, 1024 + "autoincrement": false 1025 + }, 1026 + "name": { 1027 + "name": "name", 1028 + "type": "text", 1029 + "primaryKey": false, 1030 + "notNull": true, 1031 + "autoincrement": false 1032 + }, 1033 + "provider": { 1034 + "name": "provider", 1035 + "type": "text", 1036 + "primaryKey": false, 1037 + "notNull": true, 1038 + "autoincrement": false 1039 + }, 1040 + "data": { 1041 + "name": "data", 1042 + "type": "text", 1043 + "primaryKey": false, 1044 + "notNull": false, 1045 + "autoincrement": false, 1046 + "default": "'{}'" 1047 + }, 1048 + "workspace_id": { 1049 + "name": "workspace_id", 1050 + "type": "integer", 1051 + "primaryKey": false, 1052 + "notNull": false, 1053 + "autoincrement": false 1054 + }, 1055 + "created_at": { 1056 + "name": "created_at", 1057 + "type": "integer", 1058 + "primaryKey": false, 1059 + "notNull": false, 1060 + "autoincrement": false, 1061 + "default": "(strftime('%s', 'now'))" 1062 + }, 1063 + "updated_at": { 1064 + "name": "updated_at", 1065 + "type": "integer", 1066 + "primaryKey": false, 1067 + "notNull": false, 1068 + "autoincrement": false, 1069 + "default": "(strftime('%s', 'now'))" 1070 + } 1071 + }, 1072 + "indexes": {}, 1073 + "foreignKeys": { 1074 + "notification_workspace_id_workspace_id_fk": { 1075 + "name": "notification_workspace_id_workspace_id_fk", 1076 + "tableFrom": "notification", 1077 + "tableTo": "workspace", 1078 + "columnsFrom": [ 1079 + "workspace_id" 1080 + ], 1081 + "columnsTo": [ 1082 + "id" 1083 + ], 1084 + "onDelete": "no action", 1085 + "onUpdate": "no action" 1086 + } 1087 + }, 1088 + "compositePrimaryKeys": {}, 1089 + "uniqueConstraints": {} 1090 + }, 1091 + "notifications_to_monitors": { 1092 + "name": "notifications_to_monitors", 1093 + "columns": { 1094 + "monitor_id": { 1095 + "name": "monitor_id", 1096 + "type": "integer", 1097 + "primaryKey": false, 1098 + "notNull": true, 1099 + "autoincrement": false 1100 + }, 1101 + "notification_id": { 1102 + "name": "notification_id", 1103 + "type": "integer", 1104 + "primaryKey": false, 1105 + "notNull": true, 1106 + "autoincrement": false 1107 + }, 1108 + "created_at": { 1109 + "name": "created_at", 1110 + "type": "integer", 1111 + "primaryKey": false, 1112 + "notNull": false, 1113 + "autoincrement": false, 1114 + "default": "(strftime('%s', 'now'))" 1115 + } 1116 + }, 1117 + "indexes": {}, 1118 + "foreignKeys": { 1119 + "notifications_to_monitors_monitor_id_monitor_id_fk": { 1120 + "name": "notifications_to_monitors_monitor_id_monitor_id_fk", 1121 + "tableFrom": "notifications_to_monitors", 1122 + "tableTo": "monitor", 1123 + "columnsFrom": [ 1124 + "monitor_id" 1125 + ], 1126 + "columnsTo": [ 1127 + "id" 1128 + ], 1129 + "onDelete": "cascade", 1130 + "onUpdate": "no action" 1131 + }, 1132 + "notifications_to_monitors_notification_id_notification_id_fk": { 1133 + "name": "notifications_to_monitors_notification_id_notification_id_fk", 1134 + "tableFrom": "notifications_to_monitors", 1135 + "tableTo": "notification", 1136 + "columnsFrom": [ 1137 + "notification_id" 1138 + ], 1139 + "columnsTo": [ 1140 + "id" 1141 + ], 1142 + "onDelete": "cascade", 1143 + "onUpdate": "no action" 1144 + } 1145 + }, 1146 + "compositePrimaryKeys": { 1147 + "notifications_to_monitors_monitor_id_notification_id_pk": { 1148 + "columns": [ 1149 + "monitor_id", 1150 + "notification_id" 1151 + ], 1152 + "name": "notifications_to_monitors_monitor_id_notification_id_pk" 1153 + } 1154 + }, 1155 + "uniqueConstraints": {} 1156 + }, 1157 + "monitor_status": { 1158 + "name": "monitor_status", 1159 + "columns": { 1160 + "monitor_id": { 1161 + "name": "monitor_id", 1162 + "type": "integer", 1163 + "primaryKey": false, 1164 + "notNull": true, 1165 + "autoincrement": false 1166 + }, 1167 + "region": { 1168 + "name": "region", 1169 + "type": "text", 1170 + "primaryKey": false, 1171 + "notNull": true, 1172 + "autoincrement": false, 1173 + "default": "''" 1174 + }, 1175 + "status": { 1176 + "name": "status", 1177 + "type": "text", 1178 + "primaryKey": false, 1179 + "notNull": true, 1180 + "autoincrement": false, 1181 + "default": "'active'" 1182 + }, 1183 + "created_at": { 1184 + "name": "created_at", 1185 + "type": "integer", 1186 + "primaryKey": false, 1187 + "notNull": false, 1188 + "autoincrement": false, 1189 + "default": "(strftime('%s', 'now'))" 1190 + }, 1191 + "updated_at": { 1192 + "name": "updated_at", 1193 + "type": "integer", 1194 + "primaryKey": false, 1195 + "notNull": false, 1196 + "autoincrement": false, 1197 + "default": "(strftime('%s', 'now'))" 1198 + } 1199 + }, 1200 + "indexes": { 1201 + "monitor_status_idx": { 1202 + "name": "monitor_status_idx", 1203 + "columns": [ 1204 + "monitor_id", 1205 + "region" 1206 + ], 1207 + "isUnique": false 1208 + } 1209 + }, 1210 + "foreignKeys": { 1211 + "monitor_status_monitor_id_monitor_id_fk": { 1212 + "name": "monitor_status_monitor_id_monitor_id_fk", 1213 + "tableFrom": "monitor_status", 1214 + "tableTo": "monitor", 1215 + "columnsFrom": [ 1216 + "monitor_id" 1217 + ], 1218 + "columnsTo": [ 1219 + "id" 1220 + ], 1221 + "onDelete": "cascade", 1222 + "onUpdate": "no action" 1223 + } 1224 + }, 1225 + "compositePrimaryKeys": { 1226 + "monitor_status_monitor_id_region_pk": { 1227 + "columns": [ 1228 + "monitor_id", 1229 + "region" 1230 + ], 1231 + "name": "monitor_status_monitor_id_region_pk" 1232 + } 1233 + }, 1234 + "uniqueConstraints": {} 1235 + }, 1236 + "invitation": { 1237 + "name": "invitation", 1238 + "columns": { 1239 + "id": { 1240 + "name": "id", 1241 + "type": "integer", 1242 + "primaryKey": true, 1243 + "notNull": true, 1244 + "autoincrement": false 1245 + }, 1246 + "email": { 1247 + "name": "email", 1248 + "type": "text", 1249 + "primaryKey": false, 1250 + "notNull": true, 1251 + "autoincrement": false 1252 + }, 1253 + "role": { 1254 + "name": "role", 1255 + "type": "text", 1256 + "primaryKey": false, 1257 + "notNull": true, 1258 + "autoincrement": false, 1259 + "default": "'member'" 1260 + }, 1261 + "workspace_id": { 1262 + "name": "workspace_id", 1263 + "type": "integer", 1264 + "primaryKey": false, 1265 + "notNull": true, 1266 + "autoincrement": false 1267 + }, 1268 + "token": { 1269 + "name": "token", 1270 + "type": "text", 1271 + "primaryKey": false, 1272 + "notNull": true, 1273 + "autoincrement": false 1274 + }, 1275 + "expires_at": { 1276 + "name": "expires_at", 1277 + "type": "integer", 1278 + "primaryKey": false, 1279 + "notNull": true, 1280 + "autoincrement": false 1281 + }, 1282 + "created_at": { 1283 + "name": "created_at", 1284 + "type": "integer", 1285 + "primaryKey": false, 1286 + "notNull": false, 1287 + "autoincrement": false, 1288 + "default": "(strftime('%s', 'now'))" 1289 + }, 1290 + "accepted_at": { 1291 + "name": "accepted_at", 1292 + "type": "integer", 1293 + "primaryKey": false, 1294 + "notNull": false, 1295 + "autoincrement": false 1296 + } 1297 + }, 1298 + "indexes": {}, 1299 + "foreignKeys": {}, 1300 + "compositePrimaryKeys": {}, 1301 + "uniqueConstraints": {} 1302 + }, 1303 + "incident": { 1304 + "name": "incident", 1305 + "columns": { 1306 + "id": { 1307 + "name": "id", 1308 + "type": "integer", 1309 + "primaryKey": true, 1310 + "notNull": true, 1311 + "autoincrement": false 1312 + }, 1313 + "title": { 1314 + "name": "title", 1315 + "type": "text", 1316 + "primaryKey": false, 1317 + "notNull": true, 1318 + "autoincrement": false, 1319 + "default": "''" 1320 + }, 1321 + "summary": { 1322 + "name": "summary", 1323 + "type": "text", 1324 + "primaryKey": false, 1325 + "notNull": true, 1326 + "autoincrement": false, 1327 + "default": "''" 1328 + }, 1329 + "status": { 1330 + "name": "status", 1331 + "type": "text", 1332 + "primaryKey": false, 1333 + "notNull": true, 1334 + "autoincrement": false, 1335 + "default": "'triage'" 1336 + }, 1337 + "monitor_id": { 1338 + "name": "monitor_id", 1339 + "type": "integer", 1340 + "primaryKey": false, 1341 + "notNull": false, 1342 + "autoincrement": false 1343 + }, 1344 + "workspace_id": { 1345 + "name": "workspace_id", 1346 + "type": "integer", 1347 + "primaryKey": false, 1348 + "notNull": false, 1349 + "autoincrement": false 1350 + }, 1351 + "started_at": { 1352 + "name": "started_at", 1353 + "type": "integer", 1354 + "primaryKey": false, 1355 + "notNull": true, 1356 + "autoincrement": false, 1357 + "default": "(strftime('%s', 'now'))" 1358 + }, 1359 + "acknowledged_at": { 1360 + "name": "acknowledged_at", 1361 + "type": "integer", 1362 + "primaryKey": false, 1363 + "notNull": false, 1364 + "autoincrement": false 1365 + }, 1366 + "acknowledged_by": { 1367 + "name": "acknowledged_by", 1368 + "type": "integer", 1369 + "primaryKey": false, 1370 + "notNull": false, 1371 + "autoincrement": false 1372 + }, 1373 + "resolved_at": { 1374 + "name": "resolved_at", 1375 + "type": "integer", 1376 + "primaryKey": false, 1377 + "notNull": false, 1378 + "autoincrement": false 1379 + }, 1380 + "resolved_by": { 1381 + "name": "resolved_by", 1382 + "type": "integer", 1383 + "primaryKey": false, 1384 + "notNull": false, 1385 + "autoincrement": false 1386 + }, 1387 + "incident_screenshot_url": { 1388 + "name": "incident_screenshot_url", 1389 + "type": "text", 1390 + "primaryKey": false, 1391 + "notNull": false, 1392 + "autoincrement": false 1393 + }, 1394 + "recovery_screenshot_url": { 1395 + "name": "recovery_screenshot_url", 1396 + "type": "text", 1397 + "primaryKey": false, 1398 + "notNull": false, 1399 + "autoincrement": false 1400 + }, 1401 + "auto_resolved": { 1402 + "name": "auto_resolved", 1403 + "type": "integer", 1404 + "primaryKey": false, 1405 + "notNull": false, 1406 + "autoincrement": false, 1407 + "default": false 1408 + }, 1409 + "created_at": { 1410 + "name": "created_at", 1411 + "type": "integer", 1412 + "primaryKey": false, 1413 + "notNull": false, 1414 + "autoincrement": false, 1415 + "default": "(strftime('%s', 'now'))" 1416 + }, 1417 + "updated_at": { 1418 + "name": "updated_at", 1419 + "type": "integer", 1420 + "primaryKey": false, 1421 + "notNull": false, 1422 + "autoincrement": false, 1423 + "default": "(strftime('%s', 'now'))" 1424 + } 1425 + }, 1426 + "indexes": { 1427 + "incident_monitor_id_started_at_unique": { 1428 + "name": "incident_monitor_id_started_at_unique", 1429 + "columns": [ 1430 + "monitor_id", 1431 + "started_at" 1432 + ], 1433 + "isUnique": true 1434 + } 1435 + }, 1436 + "foreignKeys": { 1437 + "incident_monitor_id_monitor_id_fk": { 1438 + "name": "incident_monitor_id_monitor_id_fk", 1439 + "tableFrom": "incident", 1440 + "tableTo": "monitor", 1441 + "columnsFrom": [ 1442 + "monitor_id" 1443 + ], 1444 + "columnsTo": [ 1445 + "id" 1446 + ], 1447 + "onDelete": "set default", 1448 + "onUpdate": "no action" 1449 + }, 1450 + "incident_workspace_id_workspace_id_fk": { 1451 + "name": "incident_workspace_id_workspace_id_fk", 1452 + "tableFrom": "incident", 1453 + "tableTo": "workspace", 1454 + "columnsFrom": [ 1455 + "workspace_id" 1456 + ], 1457 + "columnsTo": [ 1458 + "id" 1459 + ], 1460 + "onDelete": "no action", 1461 + "onUpdate": "no action" 1462 + }, 1463 + "incident_acknowledged_by_user_id_fk": { 1464 + "name": "incident_acknowledged_by_user_id_fk", 1465 + "tableFrom": "incident", 1466 + "tableTo": "user", 1467 + "columnsFrom": [ 1468 + "acknowledged_by" 1469 + ], 1470 + "columnsTo": [ 1471 + "id" 1472 + ], 1473 + "onDelete": "no action", 1474 + "onUpdate": "no action" 1475 + }, 1476 + "incident_resolved_by_user_id_fk": { 1477 + "name": "incident_resolved_by_user_id_fk", 1478 + "tableFrom": "incident", 1479 + "tableTo": "user", 1480 + "columnsFrom": [ 1481 + "resolved_by" 1482 + ], 1483 + "columnsTo": [ 1484 + "id" 1485 + ], 1486 + "onDelete": "no action", 1487 + "onUpdate": "no action" 1488 + } 1489 + }, 1490 + "compositePrimaryKeys": {}, 1491 + "uniqueConstraints": {} 1492 + }, 1493 + "monitor_tag": { 1494 + "name": "monitor_tag", 1495 + "columns": { 1496 + "id": { 1497 + "name": "id", 1498 + "type": "integer", 1499 + "primaryKey": true, 1500 + "notNull": true, 1501 + "autoincrement": false 1502 + }, 1503 + "workspace_id": { 1504 + "name": "workspace_id", 1505 + "type": "integer", 1506 + "primaryKey": false, 1507 + "notNull": true, 1508 + "autoincrement": false 1509 + }, 1510 + "name": { 1511 + "name": "name", 1512 + "type": "text", 1513 + "primaryKey": false, 1514 + "notNull": true, 1515 + "autoincrement": false 1516 + }, 1517 + "color": { 1518 + "name": "color", 1519 + "type": "text", 1520 + "primaryKey": false, 1521 + "notNull": true, 1522 + "autoincrement": false 1523 + }, 1524 + "created_at": { 1525 + "name": "created_at", 1526 + "type": "integer", 1527 + "primaryKey": false, 1528 + "notNull": false, 1529 + "autoincrement": false, 1530 + "default": "(strftime('%s', 'now'))" 1531 + }, 1532 + "updated_at": { 1533 + "name": "updated_at", 1534 + "type": "integer", 1535 + "primaryKey": false, 1536 + "notNull": false, 1537 + "autoincrement": false, 1538 + "default": "(strftime('%s', 'now'))" 1539 + } 1540 + }, 1541 + "indexes": {}, 1542 + "foreignKeys": { 1543 + "monitor_tag_workspace_id_workspace_id_fk": { 1544 + "name": "monitor_tag_workspace_id_workspace_id_fk", 1545 + "tableFrom": "monitor_tag", 1546 + "tableTo": "workspace", 1547 + "columnsFrom": [ 1548 + "workspace_id" 1549 + ], 1550 + "columnsTo": [ 1551 + "id" 1552 + ], 1553 + "onDelete": "cascade", 1554 + "onUpdate": "no action" 1555 + } 1556 + }, 1557 + "compositePrimaryKeys": {}, 1558 + "uniqueConstraints": {} 1559 + }, 1560 + "monitor_tag_to_monitor": { 1561 + "name": "monitor_tag_to_monitor", 1562 + "columns": { 1563 + "monitor_id": { 1564 + "name": "monitor_id", 1565 + "type": "integer", 1566 + "primaryKey": false, 1567 + "notNull": true, 1568 + "autoincrement": false 1569 + }, 1570 + "monitor_tag_id": { 1571 + "name": "monitor_tag_id", 1572 + "type": "integer", 1573 + "primaryKey": false, 1574 + "notNull": true, 1575 + "autoincrement": false 1576 + }, 1577 + "created_at": { 1578 + "name": "created_at", 1579 + "type": "integer", 1580 + "primaryKey": false, 1581 + "notNull": false, 1582 + "autoincrement": false, 1583 + "default": "(strftime('%s', 'now'))" 1584 + } 1585 + }, 1586 + "indexes": {}, 1587 + "foreignKeys": { 1588 + "monitor_tag_to_monitor_monitor_id_monitor_id_fk": { 1589 + "name": "monitor_tag_to_monitor_monitor_id_monitor_id_fk", 1590 + "tableFrom": "monitor_tag_to_monitor", 1591 + "tableTo": "monitor", 1592 + "columnsFrom": [ 1593 + "monitor_id" 1594 + ], 1595 + "columnsTo": [ 1596 + "id" 1597 + ], 1598 + "onDelete": "cascade", 1599 + "onUpdate": "no action" 1600 + }, 1601 + "monitor_tag_to_monitor_monitor_tag_id_monitor_tag_id_fk": { 1602 + "name": "monitor_tag_to_monitor_monitor_tag_id_monitor_tag_id_fk", 1603 + "tableFrom": "monitor_tag_to_monitor", 1604 + "tableTo": "monitor_tag", 1605 + "columnsFrom": [ 1606 + "monitor_tag_id" 1607 + ], 1608 + "columnsTo": [ 1609 + "id" 1610 + ], 1611 + "onDelete": "cascade", 1612 + "onUpdate": "no action" 1613 + } 1614 + }, 1615 + "compositePrimaryKeys": { 1616 + "monitor_tag_to_monitor_monitor_id_monitor_tag_id_pk": { 1617 + "columns": [ 1618 + "monitor_id", 1619 + "monitor_tag_id" 1620 + ], 1621 + "name": "monitor_tag_to_monitor_monitor_id_monitor_tag_id_pk" 1622 + } 1623 + }, 1624 + "uniqueConstraints": {} 1625 + } 1626 + }, 1627 + "enums": {}, 1628 + "_meta": { 1629 + "schemas": {}, 1630 + "tables": {}, 1631 + "columns": {} 1632 + } 1633 + }
+7
packages/db/drizzle/meta/_journal.json
··· 169 169 "when": 1712311348272, 170 170 "tag": "0023_dry_blink", 171 171 "breakpoints": true 172 + }, 173 + { 174 + "idx": 24, 175 + "version": "5", 176 + "when": 1712354121499, 177 + "tag": "0024_young_proudstar", 178 + "breakpoints": true 172 179 } 173 180 ] 174 181 }
+2
packages/db/src/schema/monitors/monitor.ts
··· 49 49 updatedAt: integer("updated_at", { mode: "timestamp" }).default( 50 50 sql`(strftime('%s', 'now'))`, 51 51 ), 52 + 53 + deletedAt: integer("deleted_at", { mode: "timestamp" }), 52 54 }); 53 55 54 56 export const monitorRelation = relations(monitor, ({ one, many }) => ({