@knotpad/app 0.1.0 → 0.1.2
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/bin/brief.js +165 -78
- package/package.json +6 -86
- package/app/(app)/calendar/page.tsx +0 -57
- package/app/(app)/error.tsx +0 -35
- package/app/(app)/graph/page.tsx +0 -32
- package/app/(app)/guide/page.tsx +0 -21
- package/app/(app)/kanban/loading.tsx +0 -24
- package/app/(app)/kanban/page.tsx +0 -59
- package/app/(app)/layout.tsx +0 -122
- package/app/(app)/list/loading.tsx +0 -21
- package/app/(app)/list/page.tsx +0 -137
- package/app/(app)/loading.tsx +0 -18
- package/app/(app)/notes/[noteId]/page.tsx +0 -84
- package/app/(app)/notes/layout.tsx +0 -30
- package/app/(app)/notes/page.tsx +0 -39
- package/app/(app)/page.tsx +0 -5
- package/app/(app)/settings/agent-token/page.tsx +0 -59
- package/app/(app)/settings/backup/page.tsx +0 -49
- package/app/(app)/settings/billing/page.tsx +0 -53
- package/app/(app)/settings/calendar/page.tsx +0 -41
- package/app/(app)/settings/layout.test.tsx +0 -39
- package/app/(app)/settings/layout.tsx +0 -71
- package/app/(app)/settings/page.tsx +0 -4
- package/app/(app)/settings/security/page.tsx +0 -43
- package/app/(app)/settings/team/page.tsx +0 -74
- package/app/(app)/settings/workspace/page.tsx +0 -27
- package/app/(app)/tasks/[taskId]/page.tsx +0 -79
- package/app/(auth)/forgot-password/page.tsx +0 -106
- package/app/(auth)/guest/page.tsx +0 -56
- package/app/(auth)/layout.tsx +0 -13
- package/app/(auth)/login/page.tsx +0 -14
- package/app/(auth)/register/page.tsx +0 -193
- package/app/(auth)/reset-password/page.tsx +0 -138
- package/app/api/account/claim/route.tsx +0 -135
- package/app/api/admin/backfill-encryption/route.tsx +0 -43
- package/app/api/admin/license/route.tsx +0 -42
- package/app/api/auth/2fa/route.tsx +0 -148
- package/app/api/auth/[...nextauth]/route.tsx +0 -3
- package/app/api/auth/change-password/route.tsx +0 -61
- package/app/api/auth/check-2fa/route.tsx +0 -19
- package/app/api/auth/forgot-password/route.tsx +0 -65
- package/app/api/auth/reset-password/route.tsx +0 -52
- package/app/api/auth/verify-2fa/route.tsx +0 -88
- package/app/api/backup/download/db/route.ts +0 -29
- package/app/api/backup/download/notes/route.ts +0 -25
- package/app/api/backup/settings/route.ts +0 -92
- package/app/api/billing/checkout/route.tsx +0 -81
- package/app/api/billing/migrate/route.tsx +0 -163
- package/app/api/billing/portal/route.tsx +0 -24
- package/app/api/billing/setup-intent/route.tsx +0 -55
- package/app/api/billing/status/route.tsx +0 -36
- package/app/api/billing/subscribe/route.tsx +0 -85
- package/app/api/billing/webhook/route.tsx +0 -199
- package/app/api/calendar-feeds/[feedId]/route.tsx +0 -67
- package/app/api/calendar-feeds/[feedId]/sync/route.tsx +0 -37
- package/app/api/calendar-feeds/events/route.tsx +0 -82
- package/app/api/calendar-feeds/route.tsx +0 -52
- package/app/api/calendar-feeds/sync-all/route.tsx +0 -34
- package/app/api/cron/calendar-feeds/route.tsx +0 -31
- package/app/api/cron/stale-tasks/route.tsx +0 -51
- package/app/api/cron/sync/route.tsx +0 -34
- package/app/api/devices/[deviceId]/route.tsx +0 -25
- package/app/api/devices/route.tsx +0 -41
- package/app/api/export/route.tsx +0 -40
- package/app/api/feedback/route.tsx +0 -54
- package/app/api/folders/[folderId]/route.tsx +0 -51
- package/app/api/folders/route.tsx +0 -37
- package/app/api/graph/route.tsx +0 -242
- package/app/api/guest/route.tsx +0 -58
- package/app/api/health/route.tsx +0 -10
- package/app/api/holidays/countries/route.tsx +0 -14
- package/app/api/holidays/route.tsx +0 -49
- package/app/api/holidays/states/route.tsx +0 -21
- package/app/api/invites/[token]/route.tsx +0 -131
- package/app/api/invites/route.tsx +0 -74
- package/app/api/mcp/generate-token/route.tsx +0 -55
- package/app/api/mcp/revoke-token/[tokenId]/route.tsx +0 -30
- package/app/api/mcp/update-alias/[tokenId]/route.tsx +0 -22
- package/app/api/notes/[noteId]/export/route.tsx +0 -45
- package/app/api/notes/[noteId]/route.tsx +0 -360
- package/app/api/notes/route.tsx +0 -112
- package/app/api/notifications/route.tsx +0 -44
- package/app/api/register/route.tsx +0 -67
- package/app/api/restore/route.tsx +0 -148
- package/app/api/sync/conflicts/[conflictId]/route.tsx +0 -134
- package/app/api/sync/conflicts/route.tsx +0 -48
- package/app/api/sync/status/route.tsx +0 -49
- package/app/api/sync/trigger/route.tsx +0 -15
- package/app/api/tasks/[taskId]/detail/route.tsx +0 -68
- package/app/api/tasks/[taskId]/route.tsx +0 -259
- package/app/api/tasks/bulk/route.tsx +0 -133
- package/app/api/tasks/route.tsx +0 -36
- package/app/api/workspace/active/route.tsx +0 -39
- package/app/api/workspace/create-team/route.tsx +0 -42
- package/app/api/workspace/kanban-statuses/route.tsx +0 -71
- package/app/api/workspace/members/[memberId]/route.tsx +0 -69
- package/app/api/workspace/route.tsx +0 -24
- package/app/download/page.tsx +0 -170
- package/app/favicon.ico +0 -0
- package/app/generated/prisma/client.d.ts +0 -1
- package/app/generated/prisma/client.js +0 -5
- package/app/generated/prisma/default.d.ts +0 -1
- package/app/generated/prisma/default.js +0 -5
- package/app/generated/prisma/edge.d.ts +0 -1
- package/app/generated/prisma/edge.js +0 -497
- package/app/generated/prisma/index-browser.js +0 -523
- package/app/generated/prisma/index.d.ts +0 -46376
- package/app/generated/prisma/index.js +0 -497
- package/app/generated/prisma/package.json +0 -144
- package/app/generated/prisma/query_compiler_fast_bg.js +0 -2
- package/app/generated/prisma/query_compiler_fast_bg.wasm +0 -0
- package/app/generated/prisma/query_compiler_fast_bg.wasm-base64.js +0 -2
- package/app/generated/prisma/runtime/client.d.ts +0 -3386
- package/app/generated/prisma/runtime/client.js +0 -86
- package/app/generated/prisma/runtime/index-browser.d.ts +0 -90
- package/app/generated/prisma/runtime/index-browser.js +0 -6
- package/app/generated/prisma/runtime/wasm-compiler-edge.js +0 -76
- package/app/generated/prisma/schema.prisma +0 -456
- package/app/generated/prisma/wasm-edge-light-loader.mjs +0 -5
- package/app/generated/prisma/wasm-worker-loader.mjs +0 -5
- package/app/globals.css +0 -54
- package/app/invite/[token]/page.tsx +0 -52
- package/app/layout.tsx +0 -90
- package/app/mcp/route.tsx +0 -430
- package/app/opengraph-image.tsx +0 -120
- package/app/page.tsx +0 -398
- package/app/privacy/page.tsx +0 -69
- package/app/robots.tsx +0 -25
- package/app/sitemap.tsx +0 -36
- package/app/terms/page.tsx +0 -69
- package/app/upgrade/page.tsx +0 -75
- package/auth.config.ts +0 -33
- package/auth.ts +0 -79
- package/components/auth/login-form.tsx +0 -302
- package/components/auth/password-checklist.tsx +0 -31
- package/components/auth/password-input.tsx +0 -36
- package/components/auth/switch-account-button.test.tsx +0 -22
- package/components/auth/switch-account-button.tsx +0 -19
- package/components/auth/two-factor-input.tsx +0 -116
- package/components/billing/billing-dashboard.tsx +0 -265
- package/components/billing/card-form.tsx +0 -210
- package/components/billing/claim-account-form.tsx +0 -99
- package/components/branding/app-logo.test.tsx +0 -20
- package/components/branding/app-logo.tsx +0 -25
- package/components/calendar/calendar-agenda.tsx +0 -150
- package/components/calendar/calendar-drag.test.tsx +0 -177
- package/components/calendar/calendar-grid.tsx +0 -357
- package/components/calendar/calendar-hooks.test.tsx +0 -27
- package/components/calendar/calendar-hooks.ts +0 -351
- package/components/calendar/calendar-toolbar.test.tsx +0 -68
- package/components/calendar/calendar-toolbar.tsx +0 -291
- package/components/calendar/calendar-types.ts +0 -148
- package/components/calendar/calendar-view.test.tsx +0 -295
- package/components/calendar/calendar-view.tsx +0 -307
- package/components/calendar/day-detail-popover.tsx +0 -174
- package/components/calendar/task-chip.tsx +0 -86
- package/components/command/command-palette.test.tsx +0 -33
- package/components/command/command-palette.tsx +0 -310
- package/components/download-cta.tsx +0 -87
- package/components/feedback/feedback-popup.tsx +0 -207
- package/components/graph/graph-draw.ts +0 -337
- package/components/graph/graph-overlays.tsx +0 -160
- package/components/graph/graph-page.test.tsx +0 -131
- package/components/graph/graph-page.tsx +0 -263
- package/components/graph/graph-types.ts +0 -47
- package/components/graph/graph-view.tsx +0 -322
- package/components/guide/guide-view.tsx +0 -522
- package/components/kanban/kanban-board.test.tsx +0 -128
- package/components/kanban/kanban-board.tsx +0 -361
- package/components/kanban/kanban-card-menu.tsx +0 -102
- package/components/kanban/kanban-card.tsx +0 -227
- package/components/kanban/kanban-column.tsx +0 -49
- package/components/kanban/kanban-status-context.tsx +0 -28
- package/components/landing/calendar-sandbox.test.tsx +0 -15
- package/components/landing/calendar-sandbox.tsx +0 -107
- package/components/landing/graph-sandbox.test.tsx +0 -27
- package/components/landing/graph-sandbox.tsx +0 -80
- package/components/landing/kanban-sandbox.test.tsx +0 -24
- package/components/landing/kanban-sandbox.tsx +0 -101
- package/components/landing/landing-showcase.test.tsx +0 -21
- package/components/landing/landing-showcase.tsx +0 -54
- package/components/landing/list-sandbox.tsx +0 -86
- package/components/landing/mock-workspace.ts +0 -168
- package/components/landing/notes-sandbox.test.tsx +0 -14
- package/components/landing/notes-sandbox.tsx +0 -88
- package/components/layout/app-shell.tsx +0 -83
- package/components/layout/backup-scheduler.tsx +0 -122
- package/components/layout/bottom-nav.tsx +0 -43
- package/components/layout/icon-bar.test.tsx +0 -29
- package/components/layout/icon-bar.tsx +0 -118
- package/components/layout/mobile-top-bar.tsx +0 -68
- package/components/layout/notes-panel-folder.tsx +0 -127
- package/components/layout/notes-panel-note-item.tsx +0 -140
- package/components/layout/notes-panel-task-tab.tsx +0 -63
- package/components/layout/notes-panel-types.ts +0 -44
- package/components/layout/notes-panel.tsx +0 -476
- package/components/layout/notification-bell.tsx +0 -251
- package/components/layout/paywall-screen.tsx +0 -41
- package/components/layout/pro-banner.tsx +0 -76
- package/components/layout/sw-register.tsx +0 -27
- package/components/layout/workspace-switcher.tsx +0 -90
- package/components/notes/mobile-bottom-sheet.tsx +0 -99
- package/components/notes/note-editor-context-menu.tsx +0 -47
- package/components/notes/note-editor-dom.ts +0 -33
- package/components/notes/note-editor-dropdowns.tsx +0 -484
- package/components/notes/note-editor-hooks.ts +0 -692
- package/components/notes/note-editor-keyboard.ts +0 -305
- package/components/notes/note-editor-overlay.tsx +0 -90
- package/components/notes/note-editor.test.tsx +0 -372
- package/components/notes/note-editor.tsx +0 -662
- package/components/notes/note-preview-pane.tsx +0 -156
- package/components/notes/note-tabs.tsx +0 -120
- package/components/notes/note-types.tsx +0 -157
- package/components/settings/accept-invite.tsx +0 -108
- package/components/settings/agent-token-settings.tsx +0 -369
- package/components/settings/backup-restore-settings.test.tsx +0 -25
- package/components/settings/backup-restore-settings.tsx +0 -327
- package/components/settings/calendar-feeds-settings.tsx +0 -489
- package/components/settings/calendar-general-settings.tsx +0 -174
- package/components/settings/confirm-danger-action.test.tsx +0 -215
- package/components/settings/confirm-danger-action.tsx +0 -65
- package/components/settings/security-settings.tsx +0 -252
- package/components/settings/settings-guidance.test.tsx +0 -98
- package/components/settings/team-settings.tsx +0 -319
- package/components/settings/two-factor-auth.tsx +0 -296
- package/components/settings/workspace-settings-client.tsx +0 -363
- package/components/settings/workspace-settings-form.tsx +0 -73
- package/components/sync/conflict-viewer.tsx +0 -247
- package/components/sync/sync-indicator.tsx +0 -171
- package/components/tasks/snippet-thread.tsx +0 -119
- package/components/tasks/status-dot.tsx +0 -47
- package/components/tasks/task-badge.tsx +0 -43
- package/components/tasks/task-detail.test.tsx +0 -187
- package/components/tasks/task-detail.tsx +0 -458
- package/components/tasks/task-list-filters.test.tsx +0 -75
- package/components/tasks/task-list-filters.tsx +0 -163
- package/components/tasks/task-list-types.ts +0 -20
- package/components/tasks/task-list.test.tsx +0 -175
- package/components/tasks/task-list.tsx +0 -481
- package/components/tasks/task-row.tsx +0 -85
- package/components/tasks/task-table-row.tsx +0 -259
- package/components/ui/skeleton.tsx +0 -3
- package/components/ui/toast.test.tsx +0 -42
- package/components/ui/toast.tsx +0 -70
- package/electron/main.ts +0 -251
- package/electron/preload.ts +0 -56
- package/instrumentation.tsx +0 -23
- package/lib/api-error.ts +0 -50
- package/lib/backup/backup-runner.test.ts +0 -32
- package/lib/backup/backup-runner.ts +0 -19
- package/lib/backup/backup-schedule.test.ts +0 -23
- package/lib/backup/backup-schedule.ts +0 -55
- package/lib/backup/backup-settings.test.ts +0 -30
- package/lib/backup/backup-settings.ts +0 -27
- package/lib/backup/export-notes-zip.test.ts +0 -26
- package/lib/backup/export-notes-zip.ts +0 -82
- package/lib/backup/export-workspace-backup.test.ts +0 -17
- package/lib/backup/export-workspace-backup.ts +0 -77
- package/lib/backup/restore-workspace-from-export.test.ts +0 -18
- package/lib/backup/restore-workspace-from-export.ts +0 -183
- package/lib/backup/types.ts +0 -14
- package/lib/brand-icons.ts +0 -1
- package/lib/calendar-feed-crypto.ts +0 -38
- package/lib/calendar-feed.ts +0 -239
- package/lib/client/online-status.ts +0 -47
- package/lib/conflict-resolver.test.ts +0 -57
- package/lib/conflict-resolver.ts +0 -240
- package/lib/db-init.ts +0 -79
- package/lib/email.ts +0 -159
- package/lib/encryption.test.ts +0 -41
- package/lib/encryption.ts +0 -98
- package/lib/extract-snippet.test.ts +0 -123
- package/lib/extract-snippet.ts +0 -69
- package/lib/kanban-status.ts +0 -55
- package/lib/license.ts +0 -21
- package/lib/limits.ts +0 -31
- package/lib/mcp-auth.test.ts +0 -58
- package/lib/mcp-auth.ts +0 -65
- package/lib/mcp-contract.test.ts +0 -25
- package/lib/mcp-contract.ts +0 -210
- package/lib/mcp-handler.ts +0 -31
- package/lib/mcp-url.test.ts +0 -12
- package/lib/mcp-url.ts +0 -7
- package/lib/mentions.test.ts +0 -45
- package/lib/mentions.ts +0 -73
- package/lib/note-crypto.ts +0 -108
- package/lib/note-sync.ts +0 -201
- package/lib/note-title.ts +0 -93
- package/lib/prisma.ts +0 -193
- package/lib/pro-flush.ts +0 -292
- package/lib/rate-limit.ts +0 -57
- package/lib/stripe.ts +0 -38
- package/lib/sync-worker.ts +0 -388
- package/lib/task-parser.test.ts +0 -91
- package/lib/task-parser.ts +0 -81
- package/lib/task-utils.ts +0 -52
- package/lib/use-is-electron.ts +0 -19
- package/lib/use-is-mobile.ts +0 -22
- package/lib/validation/calendar-feed.ts +0 -31
- package/lib/validation/note.ts +0 -27
- package/lib/validation/task.ts +0 -26
- package/lib/view-preferences.test.ts +0 -54
- package/lib/view-preferences.ts +0 -28
- package/lib/workspace.ts +0 -66
- package/next.config.ts +0 -21
- package/postcss.config.mjs +0 -7
- package/prisma/migrations/20260519021916_init/migration.sql +0 -388
- package/prisma/migrations/20260519061113_drop_sync_password/migration.sql +0 -8
- package/prisma/migrations/20260520065016_add_task_start_date/migration.sql +0 -2
- package/prisma/migrations/20260529010600_remove_encryption_fields/migration.sql +0 -12
- package/prisma/migrations/20260529020000_restore_encryption_salt/migration.sql +0 -3
- package/prisma/migrations/20260529030000_add_folders/migration.sql +0 -17
- package/prisma/migrations/20260605000000_deferred_fixes/migration.sql +0 -31
- package/prisma/migrations/20260605020806_add_pending_sync_to_note_and_task/migration.sql +0 -5
- package/prisma/migrations/20260605063634_add_stripe_webhook_event_sync_lock/migration.sql +0 -14
- package/prisma/migrations/20260605100000_add_prod_indexes/migration.sql +0 -26
- package/prisma/migrations/20260608081404_add_kanban_statuses/migration.sql +0 -23
- package/prisma/migrations/20260611032723_add_calendar_feeds/migration.sql +0 -43
- package/prisma/migrations/20260611040000_add_calendar_feed_color/migration.sql +0 -2
- package/prisma/migrations/20260611050000_add_task_priority/migration.sql +0 -14
- package/prisma/migrations/20260612060000_add_critical_priority/migration.sql +0 -2
- package/prisma/migrations/20260613090000_add_backup_settings/migration.sql +0 -25
- package/prisma/migrations/20260614160000_add_feedback/migration.sql +0 -20
- package/prisma/migrations/20260614210000_add_2fa/migration.sql +0 -4
- package/prisma/migrations/migration_lock.toml +0 -3
- package/prisma/schema.prisma +0 -457
- package/public/Logo_icon.svg +0 -1
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/icon.svg +0 -4
- package/public/icon_dark.svg +0 -1
- package/public/knotpad_icon.svg +0 -1
- package/public/knotpad_logo_full.svg +0 -1
- package/public/manifest.json +0 -14
- package/public/next.svg +0 -1
- package/public/sw.js +0 -137
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/tsconfig.json +0 -35
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
-- Migration: deferred_fixes
|
|
2
|
-
-- 1. SyncState: snapshotVersion for optimistic concurrency on the snapshot blob
|
|
3
|
-
-- 2. PasswordResetToken: password reset flow
|
|
4
|
-
-- 3. ConflictLog: partial unique index to prevent duplicate active conflicts
|
|
5
|
-
|
|
6
|
-
-- 1. SyncState.snapshotVersion
|
|
7
|
-
ALTER TABLE "SyncState" ADD COLUMN "snapshotVersion" INTEGER NOT NULL DEFAULT 0;
|
|
8
|
-
|
|
9
|
-
-- 2. PasswordResetToken table
|
|
10
|
-
CREATE TABLE "PasswordResetToken" (
|
|
11
|
-
"id" TEXT NOT NULL,
|
|
12
|
-
"token" TEXT NOT NULL,
|
|
13
|
-
"userId" TEXT NOT NULL,
|
|
14
|
-
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
15
|
-
"usedAt" TIMESTAMP(3),
|
|
16
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
17
|
-
|
|
18
|
-
CONSTRAINT "PasswordResetToken_pkey" PRIMARY KEY ("id")
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
CREATE UNIQUE INDEX "PasswordResetToken_token_key" ON "PasswordResetToken"("token");
|
|
22
|
-
|
|
23
|
-
ALTER TABLE "PasswordResetToken"
|
|
24
|
-
ADD CONSTRAINT "PasswordResetToken_userId_fkey"
|
|
25
|
-
FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
26
|
-
|
|
27
|
-
-- 3. ConflictLog: prevent duplicate unresolved conflicts for the same entity.
|
|
28
|
-
-- Partial unique index (Prisma schema doesn't support partial indexes natively).
|
|
29
|
-
CREATE UNIQUE INDEX IF NOT EXISTS "ConflictLog_active_unique"
|
|
30
|
-
ON "ConflictLog" ("workspaceId", "entityId")
|
|
31
|
-
WHERE "resolvedAt" IS NULL;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
-- AlterTable
|
|
2
|
-
ALTER TABLE "SyncState" ADD COLUMN "syncLockedAt" TIMESTAMP(3);
|
|
3
|
-
|
|
4
|
-
-- CreateTable
|
|
5
|
-
CREATE TABLE "StripeWebhookEvent" (
|
|
6
|
-
"id" TEXT NOT NULL,
|
|
7
|
-
"type" TEXT NOT NULL,
|
|
8
|
-
"processedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
9
|
-
|
|
10
|
-
CONSTRAINT "StripeWebhookEvent_pkey" PRIMARY KEY ("id")
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
-- CreateIndex
|
|
14
|
-
CREATE INDEX "StripeWebhookEvent_processedAt_idx" ON "StripeWebhookEvent"("processedAt");
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
-- Notification: index on userId (every notification query was a full table scan)
|
|
2
|
-
CREATE INDEX IF NOT EXISTS "Notification_userId_idx" ON "Notification"("userId");
|
|
3
|
-
CREATE INDEX IF NOT EXISTS "Notification_userId_read_idx" ON "Notification"("userId", "read");
|
|
4
|
-
|
|
5
|
-
-- Task: index on claimedBy (heartbeat + stale-task cron both filter by this)
|
|
6
|
-
CREATE INDEX IF NOT EXISTS "Task_claimedBy_idx" ON "Task"("claimedBy");
|
|
7
|
-
|
|
8
|
-
-- TaskReference: indexes on both FK columns (were completely missing)
|
|
9
|
-
CREATE INDEX IF NOT EXISTS "TaskReference_taskId_idx" ON "TaskReference"("taskId");
|
|
10
|
-
CREATE INDEX IF NOT EXISTS "TaskReference_noteId_idx" ON "TaskReference"("noteId");
|
|
11
|
-
|
|
12
|
-
-- McpToken: index on userId and workspaceId (token settings page queries)
|
|
13
|
-
CREATE INDEX IF NOT EXISTS "McpToken_userId_idx" ON "McpToken"("userId");
|
|
14
|
-
CREATE INDEX IF NOT EXISTS "McpToken_workspaceId_idx" ON "McpToken"("workspaceId");
|
|
15
|
-
|
|
16
|
-
-- ConflictLog: unique constraint to prevent duplicate conflict entries per entity
|
|
17
|
-
-- Deduplicate first in case any duplicates exist from before this migration.
|
|
18
|
-
DELETE FROM "ConflictLog" c1
|
|
19
|
-
USING "ConflictLog" c2
|
|
20
|
-
WHERE c1."id" > c2."id"
|
|
21
|
-
AND c1."workspaceId" = c2."workspaceId"
|
|
22
|
-
AND c1."entityType" = c2."entityType"
|
|
23
|
-
AND c1."entityId" = c2."entityId";
|
|
24
|
-
|
|
25
|
-
CREATE UNIQUE INDEX IF NOT EXISTS "ConflictLog_workspaceId_entityType_entityId_key"
|
|
26
|
-
ON "ConflictLog"("workspaceId", "entityType", "entityId");
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
-- CreateTable
|
|
2
|
-
CREATE TABLE "KanbanStatus" (
|
|
3
|
-
"id" TEXT NOT NULL,
|
|
4
|
-
"workspaceId" TEXT NOT NULL,
|
|
5
|
-
"key" TEXT NOT NULL,
|
|
6
|
-
"label" TEXT NOT NULL,
|
|
7
|
-
"color" TEXT NOT NULL,
|
|
8
|
-
"order" INTEGER NOT NULL DEFAULT 0,
|
|
9
|
-
"isVisible" BOOLEAN NOT NULL DEFAULT true,
|
|
10
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
11
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
12
|
-
|
|
13
|
-
CONSTRAINT "KanbanStatus_pkey" PRIMARY KEY ("id")
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
-- CreateIndex
|
|
17
|
-
CREATE INDEX "KanbanStatus_workspaceId_idx" ON "KanbanStatus"("workspaceId");
|
|
18
|
-
|
|
19
|
-
-- CreateIndex
|
|
20
|
-
CREATE UNIQUE INDEX "KanbanStatus_workspaceId_key_key" ON "KanbanStatus"("workspaceId", "key");
|
|
21
|
-
|
|
22
|
-
-- AddForeignKey
|
|
23
|
-
ALTER TABLE "KanbanStatus" ADD CONSTRAINT "KanbanStatus_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
-- CreateTable
|
|
2
|
-
CREATE TABLE "CalendarFeed" (
|
|
3
|
-
"id" TEXT NOT NULL,
|
|
4
|
-
"userId" TEXT NOT NULL,
|
|
5
|
-
"label" TEXT NOT NULL,
|
|
6
|
-
"encryptedUrl" TEXT NOT NULL,
|
|
7
|
-
"urlSalt" TEXT NOT NULL,
|
|
8
|
-
"enabled" BOOLEAN NOT NULL DEFAULT true,
|
|
9
|
-
"lastFetchedAt" TIMESTAMP(3),
|
|
10
|
-
"lastError" TEXT,
|
|
11
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
12
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
13
|
-
|
|
14
|
-
CONSTRAINT "CalendarFeed_pkey" PRIMARY KEY ("id")
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
-- CreateTable
|
|
18
|
-
CREATE TABLE "CalendarFeedEvent" (
|
|
19
|
-
"id" TEXT NOT NULL,
|
|
20
|
-
"feedId" TEXT NOT NULL,
|
|
21
|
-
"uid" TEXT NOT NULL,
|
|
22
|
-
"title" TEXT NOT NULL,
|
|
23
|
-
"start" TIMESTAMP(3) NOT NULL,
|
|
24
|
-
"end" TIMESTAMP(3) NOT NULL,
|
|
25
|
-
"allDay" BOOLEAN NOT NULL DEFAULT false,
|
|
26
|
-
|
|
27
|
-
CONSTRAINT "CalendarFeedEvent_pkey" PRIMARY KEY ("id")
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
-- CreateIndex
|
|
31
|
-
CREATE INDEX "CalendarFeed_userId_idx" ON "CalendarFeed"("userId");
|
|
32
|
-
|
|
33
|
-
-- CreateIndex
|
|
34
|
-
CREATE INDEX "CalendarFeedEvent_feedId_start_idx" ON "CalendarFeedEvent"("feedId", "start");
|
|
35
|
-
|
|
36
|
-
-- CreateIndex
|
|
37
|
-
CREATE UNIQUE INDEX "CalendarFeedEvent_feedId_uid_key" ON "CalendarFeedEvent"("feedId", "uid");
|
|
38
|
-
|
|
39
|
-
-- AddForeignKey
|
|
40
|
-
ALTER TABLE "CalendarFeed" ADD CONSTRAINT "CalendarFeed_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
41
|
-
|
|
42
|
-
-- AddForeignKey
|
|
43
|
-
ALTER TABLE "CalendarFeedEvent" ADD CONSTRAINT "CalendarFeedEvent_feedId_fkey" FOREIGN KEY ("feedId") REFERENCES "CalendarFeed"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
-- CreateEnum
|
|
2
|
-
CREATE TYPE "Priority" AS ENUM ('HIGH', 'MEDIUM', 'LOW');
|
|
3
|
-
|
|
4
|
-
-- AlterTable
|
|
5
|
-
ALTER TABLE "Task" ADD COLUMN "priority" "Priority" NOT NULL DEFAULT 'MEDIUM';
|
|
6
|
-
|
|
7
|
-
-- CreateIndex
|
|
8
|
-
CREATE INDEX "Task_workspaceId_priority_idx" ON "Task"("workspaceId", "priority");
|
|
9
|
-
|
|
10
|
-
-- DropIndex
|
|
11
|
-
DROP INDEX "Task_workspaceId_priority_idx";
|
|
12
|
-
|
|
13
|
-
-- CreateIndex
|
|
14
|
-
CREATE INDEX "Task_workspaceId_priority_idx" ON "Task"("workspaceId", "priority");
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
-- CreateEnum
|
|
2
|
-
CREATE TYPE "BackupCadence" AS ENUM ('DAILY', 'WEEKLY', 'MONTHLY');
|
|
3
|
-
|
|
4
|
-
-- CreateTable
|
|
5
|
-
CREATE TABLE "WorkspaceBackupSettings" (
|
|
6
|
-
"id" TEXT NOT NULL,
|
|
7
|
-
"workspaceId" TEXT NOT NULL,
|
|
8
|
-
"scheduleEnabled" BOOLEAN NOT NULL DEFAULT false,
|
|
9
|
-
"scheduleCadence" "BackupCadence" NOT NULL DEFAULT 'WEEKLY',
|
|
10
|
-
"destinationPath" TEXT,
|
|
11
|
-
"includeMarkdownZip" BOOLEAN NOT NULL DEFAULT false,
|
|
12
|
-
"lastBackupAt" TIMESTAMP(3),
|
|
13
|
-
"lastBackupStatus" TEXT NOT NULL DEFAULT 'idle',
|
|
14
|
-
"lastBackupError" TEXT,
|
|
15
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
16
|
-
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
17
|
-
|
|
18
|
-
CONSTRAINT "WorkspaceBackupSettings_pkey" PRIMARY KEY ("id")
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
-- CreateIndex
|
|
22
|
-
CREATE UNIQUE INDEX "WorkspaceBackupSettings_workspaceId_key" ON "WorkspaceBackupSettings"("workspaceId");
|
|
23
|
-
|
|
24
|
-
-- AddForeignKey
|
|
25
|
-
ALTER TABLE "WorkspaceBackupSettings" ADD CONSTRAINT "WorkspaceBackupSettings_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
-- CreateTable
|
|
2
|
-
CREATE TABLE "Feedback" (
|
|
3
|
-
"id" TEXT NOT NULL,
|
|
4
|
-
"userId" TEXT NOT NULL,
|
|
5
|
-
"type" TEXT NOT NULL,
|
|
6
|
-
"subject" TEXT NOT NULL,
|
|
7
|
-
"message" TEXT NOT NULL,
|
|
8
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
9
|
-
|
|
10
|
-
CONSTRAINT "Feedback_pkey" PRIMARY KEY ("id")
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
-- CreateIndex
|
|
14
|
-
CREATE INDEX "Feedback_userId_idx" ON "Feedback"("userId");
|
|
15
|
-
|
|
16
|
-
-- CreateIndex
|
|
17
|
-
CREATE INDEX "Feedback_createdAt_idx" ON "Feedback"("createdAt");
|
|
18
|
-
|
|
19
|
-
-- AddForeignKey
|
|
20
|
-
ALTER TABLE "Feedback" ADD CONSTRAINT "Feedback_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
package/prisma/schema.prisma
DELETED
|
@@ -1,457 +0,0 @@
|
|
|
1
|
-
generator client {
|
|
2
|
-
provider = "prisma-client-js"
|
|
3
|
-
output = "../app/generated/prisma"
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
datasource db {
|
|
7
|
-
provider = "postgresql"
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
enum Role {
|
|
11
|
-
OWNER
|
|
12
|
-
ADMIN
|
|
13
|
-
MEMBER
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
enum TaskStatus {
|
|
17
|
-
OPEN
|
|
18
|
-
CLAIMED
|
|
19
|
-
IN_PROGRESS
|
|
20
|
-
REVIEW
|
|
21
|
-
DONE
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
enum AssigneeType {
|
|
25
|
-
HUMAN
|
|
26
|
-
AGENT
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
enum Priority {
|
|
30
|
-
CRITICAL
|
|
31
|
-
HIGH
|
|
32
|
-
MEDIUM
|
|
33
|
-
LOW
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
enum WorkspaceType {
|
|
37
|
-
PERSONAL
|
|
38
|
-
TEAM
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
enum PlanType {
|
|
42
|
-
FREE
|
|
43
|
-
PERSONAL_PRO
|
|
44
|
-
TEAM_PRO
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
enum LicenseType {
|
|
48
|
-
STANDARD
|
|
49
|
-
COMPLIMENTARY
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
enum BackupCadence {
|
|
53
|
-
DAILY
|
|
54
|
-
WEEKLY
|
|
55
|
-
MONTHLY
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
model User {
|
|
59
|
-
id String @id @default(cuid())
|
|
60
|
-
email String? @unique
|
|
61
|
-
name String?
|
|
62
|
-
passwordHash String?
|
|
63
|
-
image String?
|
|
64
|
-
isPro Boolean @default(false)
|
|
65
|
-
role Role @default(MEMBER)
|
|
66
|
-
createdAt DateTime @default(now())
|
|
67
|
-
workspaces WorkspaceMember[]
|
|
68
|
-
mcpTokens McpToken[]
|
|
69
|
-
tasksAssigned Task[] @relation("AssignedTo")
|
|
70
|
-
auditLogs AuditLog[]
|
|
71
|
-
deviceSessions DeviceSession[]
|
|
72
|
-
accounts Account[]
|
|
73
|
-
sessions Session[]
|
|
74
|
-
invitesSent InviteToken[] @relation("InvitedBy")
|
|
75
|
-
notifications Notification[]
|
|
76
|
-
passwordResetTokens PasswordResetToken[]
|
|
77
|
-
calendarFeeds CalendarFeed[]
|
|
78
|
-
feedback Feedback[]
|
|
79
|
-
twoFactorSecret String?
|
|
80
|
-
twoFactorEnabled Boolean @default(false)
|
|
81
|
-
twoFactorVerified Boolean @default(false)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
model Workspace {
|
|
85
|
-
id String @id @default(cuid())
|
|
86
|
-
name String
|
|
87
|
-
slug String @unique
|
|
88
|
-
type WorkspaceType @default(PERSONAL)
|
|
89
|
-
planType PlanType @default(FREE)
|
|
90
|
-
licenseType LicenseType @default(STANDARD)
|
|
91
|
-
isCloud Boolean @default(false) // derived: planType != FREE || licenseType == COMPLIMENTARY
|
|
92
|
-
isPro Boolean @default(false) // derived: planType != FREE || licenseType == COMPLIMENTARY
|
|
93
|
-
seatCount Int @default(1) // mirrors Stripe subscription quantity
|
|
94
|
-
stripeId String? // Stripe customer ID
|
|
95
|
-
stripeSubId String? // Stripe subscription ID
|
|
96
|
-
encryptionSalt String? // per-workspace salt for at-rest note encryption (non-sensitive)
|
|
97
|
-
createdAt DateTime @default(now())
|
|
98
|
-
members WorkspaceMember[]
|
|
99
|
-
notes Note[]
|
|
100
|
-
folders Folder[]
|
|
101
|
-
tasks Task[]
|
|
102
|
-
mcpTokens McpToken[]
|
|
103
|
-
syncState SyncState?
|
|
104
|
-
conflictLogs ConflictLog[]
|
|
105
|
-
tombstones Tombstone[]
|
|
106
|
-
invites InviteToken[]
|
|
107
|
-
kanbanStatuses KanbanStatus[]
|
|
108
|
-
backupSettings WorkspaceBackupSettings?
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
model WorkspaceBackupSettings {
|
|
112
|
-
id String @id @default(cuid())
|
|
113
|
-
workspaceId String @unique
|
|
114
|
-
scheduleEnabled Boolean @default(false)
|
|
115
|
-
scheduleCadence BackupCadence @default(WEEKLY)
|
|
116
|
-
destinationPath String?
|
|
117
|
-
includeMarkdownZip Boolean @default(false)
|
|
118
|
-
lastBackupAt DateTime?
|
|
119
|
-
lastBackupStatus String @default("idle")
|
|
120
|
-
lastBackupError String?
|
|
121
|
-
createdAt DateTime @default(now())
|
|
122
|
-
updatedAt DateTime @updatedAt
|
|
123
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
model KanbanStatus {
|
|
127
|
-
id String @id @default(cuid())
|
|
128
|
-
workspaceId String
|
|
129
|
-
key String // e.g. OPEN, CLAIMED, IN_PROGRESS, REVIEW, DONE
|
|
130
|
-
label String
|
|
131
|
-
color String // Tailwind border class, e.g. border-zinc-700
|
|
132
|
-
order Int @default(0)
|
|
133
|
-
isVisible Boolean @default(true)
|
|
134
|
-
createdAt DateTime @default(now())
|
|
135
|
-
updatedAt DateTime @updatedAt
|
|
136
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
137
|
-
|
|
138
|
-
@@unique([workspaceId, key])
|
|
139
|
-
@@index([workspaceId])
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
model WorkspaceMember {
|
|
143
|
-
id String @id @default(cuid())
|
|
144
|
-
userId String
|
|
145
|
-
workspaceId String
|
|
146
|
-
role Role @default(MEMBER)
|
|
147
|
-
mcpAlias String?
|
|
148
|
-
joinedAt DateTime @default(now())
|
|
149
|
-
revokedAt DateTime?
|
|
150
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
151
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
152
|
-
|
|
153
|
-
@@unique([userId, workspaceId])
|
|
154
|
-
@@index([userId])
|
|
155
|
-
@@index([workspaceId])
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
model Note {
|
|
159
|
-
id String @id @default(cuid())
|
|
160
|
-
title String
|
|
161
|
-
content String @db.Text
|
|
162
|
-
workspaceId String
|
|
163
|
-
folderId String?
|
|
164
|
-
isLocked Boolean @default(false)
|
|
165
|
-
cloudOnly Boolean @default(false)
|
|
166
|
-
pendingSync Boolean @default(false)
|
|
167
|
-
version Int @default(0)
|
|
168
|
-
deviceId String?
|
|
169
|
-
createdAt DateTime @default(now())
|
|
170
|
-
updatedAt DateTime @updatedAt
|
|
171
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
172
|
-
folder Folder? @relation(fields: [folderId], references: [id], onDelete: SetNull)
|
|
173
|
-
tasks Task[]
|
|
174
|
-
references TaskReference[]
|
|
175
|
-
|
|
176
|
-
@@index([workspaceId])
|
|
177
|
-
@@index([workspaceId, updatedAt])
|
|
178
|
-
@@index([folderId])
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
model Folder {
|
|
182
|
-
id String @id @default(cuid())
|
|
183
|
-
name String
|
|
184
|
-
workspaceId String
|
|
185
|
-
createdAt DateTime @default(now())
|
|
186
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
187
|
-
notes Note[]
|
|
188
|
-
|
|
189
|
-
@@index([workspaceId])
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
model Task {
|
|
193
|
-
id String @id @default(cuid())
|
|
194
|
-
title String
|
|
195
|
-
status TaskStatus @default(OPEN)
|
|
196
|
-
priority Priority @default(MEDIUM)
|
|
197
|
-
noteId String
|
|
198
|
-
workspaceId String
|
|
199
|
-
assigneeId String?
|
|
200
|
-
assigneeType AssigneeType @default(HUMAN)
|
|
201
|
-
claimedBy String?
|
|
202
|
-
claimedByAlias String?
|
|
203
|
-
claimedAt DateTime?
|
|
204
|
-
lastHeartbeat DateTime?
|
|
205
|
-
fileRefs String[]
|
|
206
|
-
startDate DateTime?
|
|
207
|
-
dueDate DateTime?
|
|
208
|
-
syncLocal Boolean @default(true) // false = cloud-only, won't be pulled to local
|
|
209
|
-
pendingSync Boolean @default(false)
|
|
210
|
-
version Int @default(0)
|
|
211
|
-
deviceId String?
|
|
212
|
-
createdAt DateTime @default(now())
|
|
213
|
-
updatedAt DateTime @updatedAt
|
|
214
|
-
note Note @relation(fields: [noteId], references: [id], onDelete: Cascade)
|
|
215
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
216
|
-
assignee User? @relation("AssignedTo", fields: [assigneeId], references: [id])
|
|
217
|
-
auditLogs AuditLog[]
|
|
218
|
-
references TaskReference[]
|
|
219
|
-
|
|
220
|
-
@@index([workspaceId])
|
|
221
|
-
@@index([noteId])
|
|
222
|
-
@@index([workspaceId, status])
|
|
223
|
-
@@index([workspaceId, assigneeType, status])
|
|
224
|
-
@@index([workspaceId, priority])
|
|
225
|
-
@@index([claimedBy])
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
model TaskReference {
|
|
229
|
-
id String @id @default(cuid())
|
|
230
|
-
taskId String
|
|
231
|
-
noteId String
|
|
232
|
-
snippet String @db.Text
|
|
233
|
-
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
234
|
-
note Note @relation(fields: [noteId], references: [id], onDelete: Cascade)
|
|
235
|
-
|
|
236
|
-
@@index([taskId])
|
|
237
|
-
@@index([noteId])
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
model McpToken {
|
|
241
|
-
id String @id @default(cuid())
|
|
242
|
-
token String @unique
|
|
243
|
-
userId String
|
|
244
|
-
workspaceId String
|
|
245
|
-
alias String?
|
|
246
|
-
lastUsed DateTime?
|
|
247
|
-
revokedAt DateTime?
|
|
248
|
-
createdAt DateTime @default(now())
|
|
249
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
250
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
251
|
-
|
|
252
|
-
@@index([userId])
|
|
253
|
-
@@index([workspaceId])
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
model DeviceSession {
|
|
257
|
-
id String @id @default(cuid())
|
|
258
|
-
userId String
|
|
259
|
-
deviceName String
|
|
260
|
-
deviceId String @unique
|
|
261
|
-
lastActive DateTime @default(now())
|
|
262
|
-
revokedAt DateTime?
|
|
263
|
-
createdAt DateTime @default(now())
|
|
264
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
model AuditLog {
|
|
268
|
-
id String @id @default(cuid())
|
|
269
|
-
taskId String
|
|
270
|
-
userId String?
|
|
271
|
-
action String
|
|
272
|
-
detail String?
|
|
273
|
-
deviceId String?
|
|
274
|
-
createdAt DateTime @default(now())
|
|
275
|
-
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
276
|
-
user User? @relation(fields: [userId], references: [id])
|
|
277
|
-
|
|
278
|
-
@@index([taskId])
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
model SyncState {
|
|
282
|
-
id String @id @default(cuid())
|
|
283
|
-
workspaceId String @unique
|
|
284
|
-
lastSyncedAt DateTime?
|
|
285
|
-
localVersion Int @default(0)
|
|
286
|
-
cloudVersion Int @default(0)
|
|
287
|
-
noteSnapshots String? @db.Text
|
|
288
|
-
snapshotVersion Int @default(0)
|
|
289
|
-
/// Distributed sync lock. Set to now() when a flush starts; cleared when done.
|
|
290
|
-
/// Any instance that finds a lock < 120s old will skip the flush to avoid races.
|
|
291
|
-
syncLockedAt DateTime?
|
|
292
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
model ConflictLog {
|
|
296
|
-
id String @id @default(cuid())
|
|
297
|
-
workspaceId String
|
|
298
|
-
entityType String
|
|
299
|
-
entityId String
|
|
300
|
-
localValue String @db.Text
|
|
301
|
-
cloudValue String @db.Text
|
|
302
|
-
resolvedBy String?
|
|
303
|
-
resolvedAt DateTime?
|
|
304
|
-
createdAt DateTime @default(now())
|
|
305
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
306
|
-
|
|
307
|
-
@@unique([workspaceId, entityType, entityId])
|
|
308
|
-
@@index([workspaceId, resolvedAt])
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
model Tombstone {
|
|
312
|
-
id String @id @default(cuid())
|
|
313
|
-
workspaceId String
|
|
314
|
-
entityType String
|
|
315
|
-
entityId String
|
|
316
|
-
deletedAt DateTime @default(now())
|
|
317
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
318
|
-
|
|
319
|
-
@@index([workspaceId, entityType, entityId])
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
model Account {
|
|
323
|
-
id String @id @default(cuid())
|
|
324
|
-
userId String
|
|
325
|
-
type String
|
|
326
|
-
provider String
|
|
327
|
-
providerAccountId String
|
|
328
|
-
refresh_token String? @db.Text
|
|
329
|
-
access_token String? @db.Text
|
|
330
|
-
expires_at Int?
|
|
331
|
-
token_type String?
|
|
332
|
-
scope String?
|
|
333
|
-
id_token String? @db.Text
|
|
334
|
-
session_state String?
|
|
335
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
336
|
-
|
|
337
|
-
@@unique([provider, providerAccountId])
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
model Session {
|
|
341
|
-
id String @id @default(cuid())
|
|
342
|
-
sessionToken String @unique
|
|
343
|
-
userId String
|
|
344
|
-
expires DateTime
|
|
345
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
model VerificationToken {
|
|
349
|
-
identifier String
|
|
350
|
-
token String @unique
|
|
351
|
-
expires DateTime
|
|
352
|
-
|
|
353
|
-
@@unique([identifier, token])
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
model PasswordResetToken {
|
|
357
|
-
id String @id @default(cuid())
|
|
358
|
-
token String @unique @default(cuid())
|
|
359
|
-
userId String
|
|
360
|
-
expiresAt DateTime
|
|
361
|
-
usedAt DateTime?
|
|
362
|
-
createdAt DateTime @default(now())
|
|
363
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
model InviteToken {
|
|
367
|
-
id String @id @default(cuid())
|
|
368
|
-
token String @unique @default(cuid())
|
|
369
|
-
email String
|
|
370
|
-
workspaceId String
|
|
371
|
-
role Role @default(MEMBER)
|
|
372
|
-
invitedById String
|
|
373
|
-
expiresAt DateTime
|
|
374
|
-
acceptedAt DateTime?
|
|
375
|
-
createdAt DateTime @default(now())
|
|
376
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
377
|
-
invitedBy User @relation("InvitedBy", fields: [invitedById], references: [id])
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
model Notification {
|
|
381
|
-
id String @id @default(cuid())
|
|
382
|
-
userId String
|
|
383
|
-
type String
|
|
384
|
-
title String
|
|
385
|
-
body String?
|
|
386
|
-
read Boolean @default(false)
|
|
387
|
-
taskId String?
|
|
388
|
-
noteId String?
|
|
389
|
-
createdAt DateTime @default(now())
|
|
390
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
391
|
-
|
|
392
|
-
@@index([userId])
|
|
393
|
-
@@index([userId, read])
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/// A user's personal read-only calendar subscription (Google/Apple "secret
|
|
397
|
-
/// address in iCal format"). The URL is a credential — anyone with it can read
|
|
398
|
-
/// the calendar — so it's encrypted at rest with a per-row salt.
|
|
399
|
-
model CalendarFeed {
|
|
400
|
-
id String @id @default(cuid())
|
|
401
|
-
userId String
|
|
402
|
-
label String
|
|
403
|
-
encryptedUrl String @db.Text
|
|
404
|
-
urlSalt String
|
|
405
|
-
color String @default("sky")
|
|
406
|
-
enabled Boolean @default(true)
|
|
407
|
-
lastFetchedAt DateTime?
|
|
408
|
-
lastError String?
|
|
409
|
-
createdAt DateTime @default(now())
|
|
410
|
-
updatedAt DateTime @updatedAt
|
|
411
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
412
|
-
events CalendarFeedEvent[]
|
|
413
|
-
|
|
414
|
-
@@index([userId])
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/// Cached events parsed from a CalendarFeed's .ics source, including expanded
|
|
418
|
-
/// recurring-event occurrences within the sync window.
|
|
419
|
-
model CalendarFeedEvent {
|
|
420
|
-
id String @id @default(cuid())
|
|
421
|
-
feedId String
|
|
422
|
-
uid String
|
|
423
|
-
title String
|
|
424
|
-
start DateTime
|
|
425
|
-
end DateTime
|
|
426
|
-
allDay Boolean @default(false)
|
|
427
|
-
feed CalendarFeed @relation(fields: [feedId], references: [id], onDelete: Cascade)
|
|
428
|
-
|
|
429
|
-
@@unique([feedId, uid])
|
|
430
|
-
@@index([feedId, start])
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
/// Idempotency log for Stripe webhook events.
|
|
434
|
-
/// Stripe retries events on non-2xx responses for up to 3 days; storing the
|
|
435
|
-
/// event ID here ensures each event is processed exactly once.
|
|
436
|
-
model StripeWebhookEvent {
|
|
437
|
-
id String @id // Stripe event ID (evt_...)
|
|
438
|
-
type String // e.g. "checkout.session.completed"
|
|
439
|
-
processedAt DateTime @default(now())
|
|
440
|
-
|
|
441
|
-
@@index([processedAt])
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
/// User feedback and issue reports
|
|
446
|
-
model Feedback {
|
|
447
|
-
id String @id @default(cuid())
|
|
448
|
-
userId String
|
|
449
|
-
type String // "feedback", "bug", "feature_request"
|
|
450
|
-
subject String
|
|
451
|
-
message String @db.Text
|
|
452
|
-
createdAt DateTime @default(now())
|
|
453
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
454
|
-
|
|
455
|
-
@@index([userId])
|
|
456
|
-
@@index([createdAt])
|
|
457
|
-
}
|