Initial commit: digital reception monorepo (M1-M11 + demo extensions)
This commit is contained in:
@@ -0,0 +1,266 @@
|
||||
-- CreateExtension
|
||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
|
||||
-- CreateExtension
|
||||
CREATE EXTENSION IF NOT EXISTS "vector";
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "Role" AS ENUM ('MANAGER', 'SENIOR_ADMIN', 'SECURITY', 'SYSADMIN');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ConsentAction" AS ENUM ('GRANTED', 'REVOKED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ZoneCode" AS ENUM ('A', 'B', 'C');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "TrackStatus" AS ENUM ('UNMATCHED', 'MATCHED', 'ANONYMIZED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "TrackEventType" AS ENUM ('arrived', 'waiting', 'service_started', 'service_ended', 'left_without_service');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ConsentRevocationStatus" AS ENUM ('PENDING', 'DONE');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "users" (
|
||||
"id" UUID NOT NULL,
|
||||
"email" TEXT NOT NULL,
|
||||
"full_name" TEXT NOT NULL,
|
||||
"password_hash" TEXT NOT NULL,
|
||||
"role" "Role" NOT NULL,
|
||||
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "refresh_tokens" (
|
||||
"id" UUID NOT NULL,
|
||||
"user_id" UUID NOT NULL,
|
||||
"token_hash" TEXT NOT NULL,
|
||||
"expires_at" TIMESTAMP(3) NOT NULL,
|
||||
"revoked_at" TIMESTAMP(3),
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "refresh_tokens_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "patients" (
|
||||
"id" UUID NOT NULL,
|
||||
"polimed_patient_id" TEXT,
|
||||
"full_name" TEXT,
|
||||
"consent_received_at" TIMESTAMP(3),
|
||||
"consent_revoked_at" TIMESTAMP(3),
|
||||
"pending_deletion_at" TIMESTAMP(3),
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "patients_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "patient_consents" (
|
||||
"id" UUID NOT NULL,
|
||||
"patient_id" UUID NOT NULL,
|
||||
"action" "ConsentAction" NOT NULL,
|
||||
"paper_ref" TEXT,
|
||||
"actor_user_id" UUID NOT NULL,
|
||||
"occurred_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "patient_consents_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "zones" (
|
||||
"id" UUID NOT NULL,
|
||||
"code" "ZoneCode" NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
|
||||
CONSTRAINT "zones_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "cameras" (
|
||||
"id" UUID NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"rtsp_url" TEXT,
|
||||
"zone_id" UUID NOT NULL,
|
||||
|
||||
CONSTRAINT "cameras_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "tracks" (
|
||||
"id" UUID NOT NULL,
|
||||
"patient_id" UUID,
|
||||
"status" "TrackStatus" NOT NULL DEFAULT 'UNMATCHED',
|
||||
"first_seen_at" TIMESTAMP(3) NOT NULL,
|
||||
"last_seen_at" TIMESTAMP(3) NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "tracks_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "track_events" (
|
||||
"id" UUID NOT NULL,
|
||||
"track_id" UUID NOT NULL,
|
||||
"type" "TrackEventType" NOT NULL,
|
||||
"camera_id" UUID NOT NULL,
|
||||
"zone_id" UUID NOT NULL,
|
||||
"occurred_at" TIMESTAMP(3) NOT NULL,
|
||||
"evidence_key" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "track_events_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "face_embeddings" (
|
||||
"id" UUID NOT NULL,
|
||||
"embedding" vector(512) NOT NULL,
|
||||
"patient_id" UUID,
|
||||
"track_id" UUID,
|
||||
"camera_id" UUID NOT NULL,
|
||||
"quality" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
||||
"captured_at" TIMESTAMP(3) NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "face_embeddings_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "visits" (
|
||||
"id" UUID NOT NULL,
|
||||
"patient_id" UUID NOT NULL,
|
||||
"polimed_appointment_id" TEXT,
|
||||
"arrived_at" TIMESTAMP(3) NOT NULL,
|
||||
"service_started_at" TIMESTAMP(3),
|
||||
"service_ended_at" TIMESTAMP(3),
|
||||
"left_without_service" BOOLEAN NOT NULL DEFAULT false,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "visits_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "biometry_access_log" (
|
||||
"id" UUID NOT NULL,
|
||||
"actor_user_id" UUID,
|
||||
"subject_patient_id" UUID,
|
||||
"action" TEXT NOT NULL,
|
||||
"request_path" TEXT,
|
||||
"occurred_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "biometry_access_log_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "consent_revocation_jobs" (
|
||||
"id" UUID NOT NULL,
|
||||
"patient_id" UUID NOT NULL,
|
||||
"revoked_at" TIMESTAMP(3) NOT NULL,
|
||||
"scheduled_for" TIMESTAMP(3) NOT NULL,
|
||||
"status" "ConsentRevocationStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"completed_at" TIMESTAMP(3),
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "consent_revocation_jobs_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "refresh_tokens_token_hash_key" ON "refresh_tokens"("token_hash");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "refresh_tokens_user_id_idx" ON "refresh_tokens"("user_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "patients_polimed_patient_id_key" ON "patients"("polimed_patient_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "patient_consents_patient_id_idx" ON "patient_consents"("patient_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "zones_code_key" ON "zones"("code");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "cameras_name_key" ON "cameras"("name");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "tracks_status_first_seen_at_idx" ON "tracks"("status", "first_seen_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "tracks_patient_id_idx" ON "tracks"("patient_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "track_events_track_id_occurred_at_idx" ON "track_events"("track_id", "occurred_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "face_embeddings_track_id_idx" ON "face_embeddings"("track_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "face_embeddings_patient_id_idx" ON "face_embeddings"("patient_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "face_embeddings_captured_at_idx" ON "face_embeddings"("captured_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "visits_patient_id_arrived_at_idx" ON "visits"("patient_id", "arrived_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "biometry_access_log_occurred_at_idx" ON "biometry_access_log"("occurred_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "biometry_access_log_subject_patient_id_idx" ON "biometry_access_log"("subject_patient_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "consent_revocation_jobs_status_scheduled_for_idx" ON "consent_revocation_jobs"("status", "scheduled_for");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "refresh_tokens" ADD CONSTRAINT "refresh_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "patient_consents" ADD CONSTRAINT "patient_consents_patient_id_fkey" FOREIGN KEY ("patient_id") REFERENCES "patients"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "patient_consents" ADD CONSTRAINT "patient_consents_actor_user_id_fkey" FOREIGN KEY ("actor_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "cameras" ADD CONSTRAINT "cameras_zone_id_fkey" FOREIGN KEY ("zone_id") REFERENCES "zones"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "tracks" ADD CONSTRAINT "tracks_patient_id_fkey" FOREIGN KEY ("patient_id") REFERENCES "patients"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "track_events" ADD CONSTRAINT "track_events_track_id_fkey" FOREIGN KEY ("track_id") REFERENCES "tracks"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "track_events" ADD CONSTRAINT "track_events_camera_id_fkey" FOREIGN KEY ("camera_id") REFERENCES "cameras"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "track_events" ADD CONSTRAINT "track_events_zone_id_fkey" FOREIGN KEY ("zone_id") REFERENCES "zones"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "face_embeddings" ADD CONSTRAINT "face_embeddings_track_id_fkey" FOREIGN KEY ("track_id") REFERENCES "tracks"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "face_embeddings" ADD CONSTRAINT "face_embeddings_camera_id_fkey" FOREIGN KEY ("camera_id") REFERENCES "cameras"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "visits" ADD CONSTRAINT "visits_patient_id_fkey" FOREIGN KEY ("patient_id") REFERENCES "patients"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "biometry_access_log" ADD CONSTRAINT "biometry_access_log_actor_user_id_fkey" FOREIGN KEY ("actor_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "consent_revocation_jobs" ADD CONSTRAINT "consent_revocation_jobs_patient_id_fkey" FOREIGN KEY ("patient_id") REFERENCES "patients"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
Reference in New Issue
Block a user