improvement: notify counter badge added to treatment and tasks tabs for upadted and edited cases.

This commit is contained in:
2026-07-13 17:44:44 +03:30
parent 547457d637
commit 2ad572f4c8
33 changed files with 908 additions and 31 deletions

View File

@@ -0,0 +1,59 @@
-- Lab case activity feed + per-user read cursors for tab badges
CREATE TYPE "LabCaseActivityType" AS ENUM (
'CASE_SENT',
'CLINIC_COMMENT',
'LAB_COMMENT',
'CASE_IMPORTANT',
'CASE_AMENDED',
'TASK_COMPLETED'
);
CREATE TYPE "LabCaseTabReadTarget" AS ENUM ('CASES', 'TASKS', 'TREATMENT');
CREATE TABLE "lab_case_activities" (
"id" TEXT NOT NULL,
"labCaseId" TEXT NOT NULL,
"type" "LabCaseActivityType" NOT NULL,
"actorUserId" TEXT,
"payload" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "lab_case_activities_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "lab_case_user_read_states" (
"userId" TEXT NOT NULL,
"organizationId" TEXT NOT NULL,
"labCaseId" TEXT NOT NULL,
"lastReadAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "lab_case_user_read_states_pkey" PRIMARY KEY ("userId", "organizationId", "labCaseId")
);
CREATE TABLE "lab_case_user_tab_read_states" (
"userId" TEXT NOT NULL,
"organizationId" TEXT NOT NULL,
"tab" "LabCaseTabReadTarget" NOT NULL,
"lastReadAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "lab_case_user_tab_read_states_pkey" PRIMARY KEY ("userId", "organizationId", "tab")
);
ALTER TABLE "lab_case_activities"
ADD CONSTRAINT "lab_case_activities_labCaseId_fkey"
FOREIGN KEY ("labCaseId") REFERENCES "lab_cases"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "lab_case_activities"
ADD CONSTRAINT "lab_case_activities_actorUserId_fkey"
FOREIGN KEY ("actorUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "lab_case_user_read_states"
ADD CONSTRAINT "lab_case_user_read_states_labCaseId_fkey"
FOREIGN KEY ("labCaseId") REFERENCES "lab_cases"("id") ON DELETE CASCADE ON UPDATE CASCADE;
CREATE INDEX "lab_case_activities_labCaseId_createdAt_idx"
ON "lab_case_activities"("labCaseId", "createdAt");
CREATE INDEX "lab_case_activities_type_createdAt_idx"
ON "lab_case_activities"("type", "createdAt");
CREATE INDEX "lab_case_user_read_states_userId_organizationId_idx"
ON "lab_case_user_read_states"("userId", "organizationId");

View File

@@ -28,6 +28,7 @@ model User {
assignedLabCaseTasks LabCaseTask[] @relation("LabCaseTaskAssignee")
labCaseTaskStatusEvents LabCaseTaskStatusEvent[]
labCaseComments LabCaseComment[]
labCaseActivities LabCaseActivity[]
phoneVerificationCodes PhoneVerificationCode[]
createdAt DateTime @default(now())
@@ -224,6 +225,8 @@ model LabCase {
toothProsthesis LabCaseToothProsthesis[]
comments LabCaseComment[]
attachments LabCaseAttachment[]
activities LabCaseActivity[]
userReadStates LabCaseUserReadState[]
@@index([treatmentId, sortOrder])
@@map("lab_cases")
@@ -410,6 +413,60 @@ model LabCaseComment {
@@map("lab_case_comments")
}
enum LabCaseActivityType {
CASE_SENT
CLINIC_COMMENT
LAB_COMMENT
CASE_IMPORTANT
CASE_AMENDED
TASK_COMPLETED
}
enum LabCaseTabReadTarget {
CASES
TASKS
TREATMENT
}
model LabCaseActivity {
id String @id @default(uuid())
labCaseId String
type LabCaseActivityType
actorUserId String?
payload Json?
createdAt DateTime @default(now())
labCase LabCase @relation(fields: [labCaseId], references: [id], onDelete: Cascade)
actorUser User? @relation(fields: [actorUserId], references: [id], onDelete: SetNull)
@@index([labCaseId, createdAt])
@@index([type, createdAt])
@@map("lab_case_activities")
}
model LabCaseUserReadState {
userId String
organizationId String
labCaseId String
lastReadAt DateTime
labCase LabCase @relation(fields: [labCaseId], references: [id], onDelete: Cascade)
@@id([userId, organizationId, labCaseId])
@@index([userId, organizationId])
@@map("lab_case_user_read_states")
}
model LabCaseUserTabReadState {
userId String
organizationId String
tab LabCaseTabReadTarget
lastReadAt DateTime
@@id([userId, organizationId, tab])
@@map("lab_case_user_tab_read_states")
}
model Plan {
id String @id @default(uuid())
name String @unique // "Solo", "Small", "Medium", "Large", "Enterprise"