diff --git a/prisma/migrations/20260413180659_init/migration.sql b/prisma/migrations/20260413180659_init/migration.sql deleted file mode 100644 index 3a0a751..0000000 --- a/prisma/migrations/20260413180659_init/migration.sql +++ /dev/null @@ -1,505 +0,0 @@ --- CreateTable -CREATE TABLE "Appointment" ( - "id" TEXT NOT NULL PRIMARY KEY, - "clientId" TEXT NOT NULL, - "adminId" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "startTime" DATETIME NOT NULL, - "endTime" DATETIME NOT NULL, - "status" TEXT NOT NULL DEFAULT 'SCHEDULED', - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - CONSTRAINT "Appointment_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "user" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Appointment_adminId_fkey" FOREIGN KEY ("adminId") REFERENCES "user" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "client" ( - "id" TEXT NOT NULL PRIMARY KEY, - "userId" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'INCOMPLETE', - "therapyWeek" INTEGER, - "missedSessions" INTEGER NOT NULL DEFAULT 0, - CONSTRAINT "client_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "client_permission" ( - "id" TEXT NOT NULL PRIMARY KEY, - "clientId" TEXT NOT NULL, - "canViewScores" BOOLEAN NOT NULL DEFAULT false, - "canViewNotes" BOOLEAN NOT NULL DEFAULT false, - "canViewPlan" BOOLEAN NOT NULL DEFAULT false, - CONSTRAINT "client_permission_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "client" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "client_plan" ( - "id" TEXT NOT NULL PRIMARY KEY, - "clientId" TEXT NOT NULL, - "content" TEXT NOT NULL DEFAULT '', - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - CONSTRAINT "client_plan_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "client" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "change_audit" ( - "id" TEXT NOT NULL PRIMARY KEY, - "entityType" TEXT NOT NULL, - "entityId" TEXT NOT NULL, - "oldValue" TEXT, - "newValue" TEXT, - "reasoning" TEXT, - "documentationPath" TEXT, - "documentationName" TEXT, - "signatureData" TEXT NOT NULL, - "signedById" TEXT NOT NULL, - "signedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "change_audit_signedById_fkey" FOREIGN KEY ("signedById") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "ace_form" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "userId" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'IN_PROGRESS', - "totalScore" INTEGER, - "severity" TEXT, - "submittedAt" DATETIME, - CONSTRAINT "ace_form_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "ace_question" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "formId" INTEGER NOT NULL, - "userId" TEXT NOT NULL, - "a01" TEXT, - "a02" TEXT, - "a03" TEXT, - "a04" TEXT, - "a05" TEXT, - "a06" TEXT, - "a07" TEXT, - "a08" TEXT, - "a09" TEXT, - "a10" TEXT, - CONSTRAINT "ace_question_formId_fkey" FOREIGN KEY ("formId") REFERENCES "ace_form" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "ace_question_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "AppForm" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "userId" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'IN_PROGRESS', - "submittedAt" DATETIME, - CONSTRAINT "AppForm_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "AppQuestion" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "formId" INTEGER NOT NULL, - "userId" TEXT NOT NULL, - "q01" TEXT, - "q02" TEXT, - "q03" TEXT, - "q04" TEXT, - "q05" TEXT, - "q06" TEXT, - "q07" TEXT, - "q08" TEXT, - "q09" TEXT, - "q10" TEXT, - "q11" TEXT, - "q12" TEXT, - "q13" TEXT, - "q14" TEXT, - "q15" TEXT, - "q16" TEXT, - "q17" TEXT, - "q18" TEXT, - "q19" TEXT, - "q20" TEXT, - "q21" TEXT, - "q22" TEXT, - "q23" TEXT, - "q24" TEXT, - "q25" TEXT, - "q26" TEXT, - "q27" TEXT, - "q28" TEXT, - "q29" TEXT, - "q30" TEXT, - "q31" TEXT, - "q32" TEXT, - "q33" TEXT, - "q34" TEXT, - "q35" TEXT, - "q36" TEXT, - "q37" TEXT, - "q38" TEXT, - "q39" TEXT, - "q40" TEXT, - "q41" TEXT, - "q42" TEXT, - "q43" TEXT, - "q44" TEXT, - "q45" TEXT, - "q46" TEXT, - "q47" TEXT, - "q48" TEXT, - "q49" TEXT, - "q50" TEXT, - CONSTRAINT "AppQuestion_formId_fkey" FOREIGN KEY ("formId") REFERENCES "AppForm" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "AppQuestion_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "GadForm" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "userId" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'IN_PROGRESS', - "totalScore" INTEGER, - "severity" TEXT, - "submittedAt" DATETIME, - CONSTRAINT "GadForm_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "GadQuestion" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "formId" INTEGER NOT NULL, - "userId" TEXT NOT NULL, - "g01" INTEGER, - "g02" INTEGER, - "g03" INTEGER, - "g04" INTEGER, - "g05" INTEGER, - "g06" INTEGER, - "g07" INTEGER, - "g08" INTEGER, - CONSTRAINT "GadQuestion_formId_fkey" FOREIGN KEY ("formId") REFERENCES "GadForm" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "GadQuestion_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "PhqForm" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "userId" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'IN_PROGRESS', - "totalScore" INTEGER, - "severity" TEXT, - "submittedAt" DATETIME, - CONSTRAINT "PhqForm_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "PhqQuestion" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "formId" INTEGER NOT NULL, - "userId" TEXT NOT NULL, - "q1" INTEGER, - "q2" INTEGER, - "q3" INTEGER, - "q4" INTEGER, - "q5" INTEGER, - "q6" INTEGER, - "q7" INTEGER, - "q8" INTEGER, - "q9" INTEGER, - "q10" INTEGER, - CONSTRAINT "PhqQuestion_formId_fkey" FOREIGN KEY ("formId") REFERENCES "PhqForm" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "PhqQuestion_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "PclForm" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "userId" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'IN_PROGRESS', - "totalScore" INTEGER, - "severity" TEXT, - "submittedAt" DATETIME, - CONSTRAINT "PclForm_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "PclQuestion" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "formId" INTEGER NOT NULL, - "userId" TEXT NOT NULL, - "worstEvent" TEXT, - "q01" INTEGER, - "q02" INTEGER, - "q03" INTEGER, - "q04" INTEGER, - "q05" INTEGER, - "q06" INTEGER, - "q07" INTEGER, - "q08" INTEGER, - "q09" INTEGER, - "q10" INTEGER, - "q11" INTEGER, - "q12" INTEGER, - "q13" INTEGER, - "q14" INTEGER, - "q15" INTEGER, - "q16" INTEGER, - "q17" INTEGER, - "q18" INTEGER, - "q19" INTEGER, - "q20" INTEGER, - CONSTRAINT "PclQuestion_formId_fkey" FOREIGN KEY ("formId") REFERENCES "PclForm" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "PclQuestion_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "PhysicianStatementForm" ( - "id" TEXT NOT NULL PRIMARY KEY, - "userId" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'NOT_SUBMITTED', - "originalFileName" TEXT, - "storedFileName" TEXT, - "mimeType" TEXT, - "uploadedAt" DATETIME, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - CONSTRAINT "PhysicianStatementForm_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "ReleaseOfInformationAuthorizationForm" ( - "id" TEXT NOT NULL PRIMARY KEY, - "userId" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'NOT_SUBMITTED', - "originalFileName" TEXT, - "storedFileName" TEXT, - "mimeType" TEXT, - "uploadedAt" DATETIME, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - CONSTRAINT "ReleaseOfInformationAuthorizationForm_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "session_note" ( - "id" TEXT NOT NULL PRIMARY KEY, - "clientId" TEXT NOT NULL, - "content" TEXT NOT NULL, - "attended" BOOLEAN NOT NULL DEFAULT true, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "session_note_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "client" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "session_note_edit" ( - "id" TEXT NOT NULL PRIMARY KEY, - "sessionNoteId" TEXT NOT NULL, - "originalContent" TEXT, - "reason" TEXT, - "signature" TEXT, - "editedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "session_note_edit_sessionNoteId_fkey" FOREIGN KEY ("sessionNoteId") REFERENCES "session_note" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "declaration_template" ( - "id" TEXT NOT NULL PRIMARY KEY, - "requestKind" TEXT NOT NULL, - "version" INTEGER NOT NULL, - "content" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -); - --- CreateTable -CREATE TABLE "session_notes_request" ( - "id" TEXT NOT NULL PRIMARY KEY, - "clientId" TEXT NOT NULL, - "requestKind" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'PENDING', - "signatureData" TEXT NOT NULL, - "declarationTemplateId" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "decidedAt" DATETIME, - "decidedByUserId" TEXT, - "rejectionReason" TEXT, - "approvedSummaryText" TEXT, - CONSTRAINT "session_notes_request_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "client" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "session_notes_request_declarationTemplateId_fkey" FOREIGN KEY ("declarationTemplateId") REFERENCES "declaration_template" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "session_notes_request_decidedByUserId_fkey" FOREIGN KEY ("decidedByUserId") REFERENCES "user" ("id") ON DELETE SET NULL ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "user" ( - "id" TEXT NOT NULL PRIMARY KEY, - "name" TEXT NOT NULL, - "email" TEXT NOT NULL, - "emailVerified" BOOLEAN NOT NULL DEFAULT false, - "image" TEXT, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "role" TEXT NOT NULL DEFAULT 'CLIENT', - "phoneNumber" INTEGER -); - --- CreateTable -CREATE TABLE "session" ( - "id" TEXT NOT NULL PRIMARY KEY, - "expiresAt" DATETIME NOT NULL, - "token" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "ipAddress" TEXT, - "userAgent" TEXT, - "userId" TEXT NOT NULL, - CONSTRAINT "session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "account" ( - "id" TEXT NOT NULL PRIMARY KEY, - "accountId" TEXT NOT NULL, - "providerId" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "accessToken" TEXT, - "refreshToken" TEXT, - "idToken" TEXT, - "accessTokenExpiresAt" DATETIME, - "refreshTokenExpiresAt" DATETIME, - "scope" TEXT, - "password" TEXT, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - CONSTRAINT "account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "verification" ( - "id" TEXT NOT NULL PRIMARY KEY, - "identifier" TEXT NOT NULL, - "value" TEXT NOT NULL, - "expiresAt" DATETIME NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL -); - --- CreateIndex -CREATE INDEX "Appointment_clientId_idx" ON "Appointment"("clientId"); - --- CreateIndex -CREATE INDEX "Appointment_adminId_idx" ON "Appointment"("adminId"); - --- CreateIndex -CREATE UNIQUE INDEX "client_userId_key" ON "client"("userId"); - --- CreateIndex -CREATE INDEX "client_status_idx" ON "client"("status"); - --- CreateIndex -CREATE UNIQUE INDEX "client_permission_clientId_key" ON "client_permission"("clientId"); - --- CreateIndex -CREATE UNIQUE INDEX "client_plan_clientId_key" ON "client_plan"("clientId"); - --- CreateIndex -CREATE INDEX "change_audit_entityType_entityId_idx" ON "change_audit"("entityType", "entityId"); - --- CreateIndex -CREATE UNIQUE INDEX "ace_form_userId_key" ON "ace_form"("userId"); - --- CreateIndex -CREATE INDEX "ace_form_userId_idx" ON "ace_form"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "ace_question_formId_key" ON "ace_question"("formId"); - --- CreateIndex -CREATE INDEX "ace_question_userId_idx" ON "ace_question"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "AppForm_userId_key" ON "AppForm"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "AppQuestion_formId_key" ON "AppQuestion"("formId"); - --- CreateIndex -CREATE INDEX "AppQuestion_userId_idx" ON "AppQuestion"("userId"); - --- CreateIndex -CREATE INDEX "GadForm_userId_idx" ON "GadForm"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "GadQuestion_formId_key" ON "GadQuestion"("formId"); - --- CreateIndex -CREATE INDEX "GadQuestion_userId_idx" ON "GadQuestion"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "PhqForm_userId_key" ON "PhqForm"("userId"); - --- CreateIndex -CREATE INDEX "PhqForm_userId_idx" ON "PhqForm"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "PhqQuestion_formId_key" ON "PhqQuestion"("formId"); - --- CreateIndex -CREATE INDEX "PhqQuestion_userId_idx" ON "PhqQuestion"("userId"); - --- CreateIndex -CREATE INDEX "PclForm_userId_idx" ON "PclForm"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "PclQuestion_formId_key" ON "PclQuestion"("formId"); - --- CreateIndex -CREATE INDEX "PclQuestion_userId_idx" ON "PclQuestion"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "PhysicianStatementForm_userId_key" ON "PhysicianStatementForm"("userId"); - --- CreateIndex -CREATE INDEX "PhysicianStatementForm_status_idx" ON "PhysicianStatementForm"("status"); - --- CreateIndex -CREATE UNIQUE INDEX "ReleaseOfInformationAuthorizationForm_userId_key" ON "ReleaseOfInformationAuthorizationForm"("userId"); - --- CreateIndex -CREATE INDEX "ReleaseOfInformationAuthorizationForm_status_idx" ON "ReleaseOfInformationAuthorizationForm"("status"); - --- CreateIndex -CREATE INDEX "session_note_clientId_idx" ON "session_note"("clientId"); - --- CreateIndex -CREATE INDEX "session_note_edit_sessionNoteId_idx" ON "session_note_edit"("sessionNoteId"); - --- CreateIndex -CREATE UNIQUE INDEX "declaration_template_requestKind_version_key" ON "declaration_template"("requestKind", "version"); - --- CreateIndex -CREATE INDEX "session_notes_request_clientId_idx" ON "session_notes_request"("clientId"); - --- CreateIndex -CREATE INDEX "session_notes_request_status_idx" ON "session_notes_request"("status"); - --- CreateIndex -CREATE INDEX "session_notes_request_declarationTemplateId_idx" ON "session_notes_request"("declarationTemplateId"); - --- CreateIndex -CREATE UNIQUE INDEX "user_email_key" ON "user"("email"); - --- CreateIndex -CREATE INDEX "session_userId_idx" ON "session"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "session_token_key" ON "session"("token"); - --- CreateIndex -CREATE INDEX "account_userId_idx" ON "account"("userId"); - --- CreateIndex -CREATE INDEX "verification_identifier_idx" ON "verification"("identifier"); diff --git a/prisma/migrations/20260426215909_add_client_clinician_user_id/migration.sql b/prisma/migrations/20260426215909_add_client_clinician_user_id/migration.sql new file mode 100644 index 0000000..edb850a --- /dev/null +++ b/prisma/migrations/20260426215909_add_client_clinician_user_id/migration.sql @@ -0,0 +1,194 @@ +/* + Warnings: + + - You are about to drop the `ace_form` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `ace_question` table. If the table is not empty, all the data it contains will be lost. + - Added the required column `sessionName` to the `Appointment` table without a default value. This is not possible if the table is not empty. + - Added the required column `sessionNumber` to the `Appointment` table without a default value. This is not possible if the table is not empty. + - Added the required column `sessionName` to the `session_note` table without a default value. This is not possible if the table is not empty. + - Added the required column `sessionNumber` to the `session_note` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropIndex +DROP INDEX "PhqForm_userId_key"; + +-- DropIndex +DROP INDEX "ace_form_userId_idx"; + +-- DropIndex +DROP INDEX "ace_form_userId_key"; + +-- DropIndex +DROP INDEX "ace_question_userId_idx"; + +-- DropIndex +DROP INDEX "ace_question_formId_key"; + +-- AlterTable +ALTER TABLE "session_notes_request" ADD COLUMN "approvalReason" TEXT; +ALTER TABLE "session_notes_request" ADD COLUMN "endDate" DATETIME; +ALTER TABLE "session_notes_request" ADD COLUMN "startDate" DATETIME; + +-- DropTable +PRAGMA foreign_keys=off; +DROP TABLE "ace_form"; +PRAGMA foreign_keys=on; + +-- DropTable +PRAGMA foreign_keys=off; +DROP TABLE "ace_question"; +PRAGMA foreign_keys=on; + +-- CreateTable +CREATE TABLE "client_form_score_history" ( + "id" TEXT NOT NULL PRIMARY KEY, + "userId" TEXT NOT NULL, + "formKey" TEXT NOT NULL, + "score" INTEGER, + "severity" TEXT, + "recordedAt" DATETIME NOT NULL, + "answersJson" TEXT, + CONSTRAINT "client_form_score_history_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "AceForm" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "userId" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'IN_PROGRESS', + "totalScore" INTEGER, + "severity" TEXT, + "submittedAt" DATETIME, + CONSTRAINT "AceForm_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "AceQuestion" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "formId" INTEGER NOT NULL, + "userId" TEXT NOT NULL, + "a01" TEXT, + "a02" TEXT, + "a03" TEXT, + "a04" TEXT, + "a05" TEXT, + "a06" TEXT, + "a07" TEXT, + "a08" TEXT, + "a09" TEXT, + "a10" TEXT, + CONSTRAINT "AceQuestion_formId_fkey" FOREIGN KEY ("formId") REFERENCES "AceForm" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT "AceQuestion_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "notification" ( + "id" TEXT NOT NULL PRIMARY KEY, + "userId" TEXT NOT NULL, + "type" TEXT NOT NULL, + "title" TEXT NOT NULL, + "message" TEXT NOT NULL, + "sessionNoteId" TEXT, + "readAt" DATETIME, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT "notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT "notification_sessionNoteId_fkey" FOREIGN KEY ("sessionNoteId") REFERENCES "session_note" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +-- RedefineTables +PRAGMA defer_foreign_keys=ON; +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_Appointment" ( + "id" TEXT NOT NULL PRIMARY KEY, + "clientId" TEXT NOT NULL, + "adminId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "sessionName" TEXT NOT NULL, + "sessionNumber" INTEGER NOT NULL, + "description" TEXT, + "startTime" DATETIME NOT NULL, + "endTime" DATETIME NOT NULL, + "status" TEXT NOT NULL DEFAULT 'SCHEDULED', + "videoProvider" TEXT, + "videoJoinUrl" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + CONSTRAINT "Appointment_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "user" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT "Appointment_adminId_fkey" FOREIGN KEY ("adminId") REFERENCES "user" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); +INSERT INTO "new_Appointment" ("adminId", "clientId", "createdAt", "description", "endTime", "id", "startTime", "status", "title", "updatedAt") SELECT "adminId", "clientId", "createdAt", "description", "endTime", "id", "startTime", "status", "title", "updatedAt" FROM "Appointment"; +DROP TABLE "Appointment"; +ALTER TABLE "new_Appointment" RENAME TO "Appointment"; +CREATE INDEX "Appointment_clientId_idx" ON "Appointment"("clientId"); +CREATE INDEX "Appointment_adminId_idx" ON "Appointment"("adminId"); +CREATE UNIQUE INDEX "Appointment_clientId_sessionNumber_key" ON "Appointment"("clientId", "sessionNumber"); +CREATE TABLE "new_client" ( + "id" TEXT NOT NULL PRIMARY KEY, + "userId" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'INCOMPLETE', + "waitlistedAt" DATETIME, + "archivedAt" DATETIME, + "therapyWeek" INTEGER, + "missedSessions" INTEGER NOT NULL DEFAULT 0, + "clinicianUserId" TEXT, + CONSTRAINT "client_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT "client_clinicianUserId_fkey" FOREIGN KEY ("clinicianUserId") REFERENCES "user" ("id") ON DELETE SET NULL ON UPDATE CASCADE +); +INSERT INTO "new_client" ("id", "missedSessions", "status", "therapyWeek", "userId") SELECT "id", "missedSessions", "status", "therapyWeek", "userId" FROM "client"; +DROP TABLE "client"; +ALTER TABLE "new_client" RENAME TO "client"; +CREATE UNIQUE INDEX "client_userId_key" ON "client"("userId"); +CREATE INDEX "client_status_idx" ON "client"("status"); +CREATE INDEX "client_clinicianUserId_idx" ON "client"("clinicianUserId"); +CREATE TABLE "new_session_note" ( + "id" TEXT NOT NULL PRIMARY KEY, + "clientId" TEXT NOT NULL, + "sessionName" TEXT NOT NULL, + "sessionNumber" INTEGER NOT NULL, + "appointmentId" TEXT, + "kind" TEXT NOT NULL DEFAULT 'PROGRESS', + "status" TEXT NOT NULL DEFAULT 'DRAFT', + "content" TEXT NOT NULL, + "attended" BOOLEAN NOT NULL DEFAULT true, + "signatureData" TEXT, + "clinicianSignedAt" DATETIME, + "clinicianSignedById" TEXT, + "clinicianSignatureData" TEXT, + "adminSignedAt" DATETIME, + "adminSignedById" TEXT, + "adminSignatureData" TEXT, + "adminApprovalNote" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT "session_note_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "client" ("id") ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT "session_note_appointmentId_fkey" FOREIGN KEY ("appointmentId") REFERENCES "Appointment" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT "session_note_clinicianSignedById_fkey" FOREIGN KEY ("clinicianSignedById") REFERENCES "user" ("id") ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT "session_note_adminSignedById_fkey" FOREIGN KEY ("adminSignedById") REFERENCES "user" ("id") ON DELETE SET NULL ON UPDATE CASCADE +); +INSERT INTO "new_session_note" ("clientId", "content", "createdAt", "id") SELECT "clientId", "content", "createdAt", "id" FROM "session_note"; +DROP TABLE "session_note"; +ALTER TABLE "new_session_note" RENAME TO "session_note"; +CREATE INDEX "session_note_clientId_idx" ON "session_note"("clientId"); +CREATE INDEX "session_note_appointmentId_idx" ON "session_note"("appointmentId"); +CREATE INDEX "session_note_status_idx" ON "session_note"("status"); +CREATE INDEX "session_note_kind_idx" ON "session_note"("kind"); +PRAGMA foreign_keys=ON; +PRAGMA defer_foreign_keys=OFF; + +-- CreateIndex +CREATE INDEX "client_form_score_history_userId_recordedAt_idx" ON "client_form_score_history"("userId", "recordedAt"); + +-- CreateIndex +CREATE INDEX "AceForm_userId_idx" ON "AceForm"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "AceQuestion_formId_key" ON "AceQuestion"("formId"); + +-- CreateIndex +CREATE INDEX "AceQuestion_userId_idx" ON "AceQuestion"("userId"); + +-- CreateIndex +CREATE INDEX "notification_userId_readAt_idx" ON "notification"("userId", "readAt"); + +-- CreateIndex +CREATE INDEX "notification_userId_createdAt_idx" ON "notification"("userId", "createdAt"); diff --git a/prisma/seed.ts b/prisma/seed.ts index 37c53db..174a085 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -10,6 +10,122 @@ const connectionString = process.env.DATABASE_URL ?? 'file:./dev.db' const adapter = new PrismaBetterSqlite3({ url: connectionString }) const prisma = new PrismaClient({ adapter }) +async function ensureLatestGadForm(userId: string) { + const existing = await prisma.gadForm.findFirst({ + where: { userId }, + orderBy: { id: 'desc' }, + }) + + if (existing) { + return prisma.gadForm.update({ + where: { id: existing.id }, + data: { + status: 'COMPLETE', + totalScore: 12, + severity: 'Moderate', + submittedAt: new Date(), + }, + }) + } + + return prisma.gadForm.create({ + data: { + userId, + status: 'COMPLETE', + totalScore: 12, + severity: 'Moderate', + submittedAt: new Date(), + }, + }) +} + +async function ensureLatestPhqForm(userId: string) { + const existing = await prisma.phqForm.findFirst({ + where: { userId }, + orderBy: { id: 'desc' }, + }) + + if (existing) { + return prisma.phqForm.update({ + where: { id: existing.id }, + data: { + status: 'COMPLETE', + totalScore: 14, + severity: 'Moderate depression', + submittedAt: new Date(), + }, + }) + } + + return prisma.phqForm.create({ + data: { + userId, + status: 'COMPLETE', + totalScore: 14, + severity: 'Moderate depression', + submittedAt: new Date(), + }, + }) +} + +async function ensureLatestPclForm(userId: string) { + const existing = await prisma.pclForm.findFirst({ + where: { userId }, + orderBy: { id: 'desc' }, + }) + + if (existing) { + return prisma.pclForm.update({ + where: { id: existing.id }, + data: { + status: 'COMPLETE', + totalScore: 45, + severity: 'Moderate', + submittedAt: new Date(), + }, + }) + } + + return prisma.pclForm.create({ + data: { + userId, + status: 'COMPLETE', + totalScore: 45, + severity: 'Moderate', + submittedAt: new Date(), + }, + }) +} + +async function ensureLatestAceForm(userId: string) { + const existing = await prisma.aceForm.findFirst({ + where: { userId }, + orderBy: { id: 'desc' }, + }) + + if (existing) { + return prisma.aceForm.update({ + where: { id: existing.id }, + data: { + status: 'COMPLETE', + totalScore: 2, + severity: 'Low', + submittedAt: new Date(), + }, + }) + } + + return prisma.aceForm.create({ + data: { + userId, + status: 'COMPLETE', + totalScore: 2, + severity: 'Low', + submittedAt: new Date(), + }, + }) +} + async function seedForms(userId: string) { // 1. AppForm (Application) const appForm = await prisma.appForm.upsert({ @@ -35,18 +151,22 @@ async function seedForms(userId: string) { }) // 2. GAD-7 - const gadForm = await prisma.gadForm.create({ - data: { + const gadForm = await ensureLatestGadForm(userId) + + await prisma.gadQuestion.upsert({ + where: { formId: gadForm.id }, + update: { userId, - status: 'COMPLETE', - totalScore: 12, - severity: 'Moderate', - submittedAt: new Date(), + g01: 2, + g02: 1, + g03: 2, + g04: 1, + g05: 2, + g06: 2, + g07: 2, + g08: 1, }, - }) - - await prisma.gadQuestion.create({ - data: { + create: { formId: gadForm.id, userId, g01: 2, @@ -61,21 +181,23 @@ async function seedForms(userId: string) { }) // 3. PHQ-9 - const phqForm = await prisma.phqForm.upsert({ - where: { userId }, - update: {}, - create: { - userId, - status: 'COMPLETE', - totalScore: 14, - severity: 'Moderate depression', - submittedAt: new Date(), - }, - }) + const phqForm = await ensureLatestPhqForm(userId) await prisma.phqQuestion.upsert({ where: { formId: phqForm.id }, - update: {}, + update: { + userId, + q1: 2, + q2: 1, + q3: 2, + q4: 1, + q5: 2, + q6: 2, + q7: 2, + q8: 1, + q9: 1, + q10: 1, + }, create: { formId: phqForm.id, userId, @@ -93,18 +215,34 @@ async function seedForms(userId: string) { }) // 4. PCL-5 - const pclForm = await prisma.pclForm.create({ - data: { + const pclForm = await ensureLatestPclForm(userId) + + await prisma.pclQuestion.upsert({ + where: { formId: pclForm.id }, + update: { userId, - status: 'COMPLETE', - totalScore: 45, - severity: 'Moderate', - submittedAt: new Date(), + q01: 3, + q02: 2, + q03: 3, + q04: 2, + q05: 2, + q06: 3, + q07: 2, + q08: 2, + q09: 2, + q10: 2, + q11: 2, + q12: 2, + q13: 2, + q14: 2, + q15: 2, + q16: 2, + q17: 2, + q18: 2, + q19: 2, + q20: 2, }, - }) - - await prisma.pclQuestion.create({ - data: { + create: { formId: pclForm.id, userId, q01: 3, @@ -131,21 +269,23 @@ async function seedForms(userId: string) { }) // 5. ACE (Hardcoded Form) - const aceForm = await prisma.aceForm.upsert({ - where: { userId }, - update: {}, - create: { - userId, - status: 'COMPLETE', - totalScore: 2, - severity: 'Low', - submittedAt: new Date(), - }, - }) + const aceForm = await ensureLatestAceForm(userId) await prisma.aceQuestion.upsert({ where: { formId: aceForm.id }, - update: {}, + update: { + userId, + a01: 'Yes', + a02: 'Yes', + a03: 'No', + a04: 'No', + a05: 'No', + a06: 'No', + a07: 'No', + a08: 'No', + a09: 'No', + a10: 'No', + }, create: { formId: aceForm.id, userId, @@ -234,8 +374,7 @@ async function seedApprovalWorkflowNotes( userId: adminUserId, type: 'NOTE_READY_FOR_APPROVAL', title: 'Note awaiting approval', - message: - 'Carl Karl signed a progress note for Bob Builder. Please review and countersign.', + message: 'Carl Karl signed a progress note for Bob Builder. Please review and countersign.', sessionNoteId: pendingNote.id, }, })