Sistemato attività

This commit is contained in:
Lorenzo Sanesi
2026-07-26 03:19:11 +02:00
parent 8d1a3e0d18
commit de921abcd6
57 changed files with 3063 additions and 144 deletions
@@ -1,3 +1,9 @@
-- CreateEnum
CREATE TYPE "StatoTassonomia" AS ENUM ('CONFERMATA', 'DA_APPROVARE');
-- CreateEnum
CREATE TYPE "TipoNotifica" AS ENUM ('TASSONOMIA_PROPOSTA', 'ATTIVITA_IN_ATTESA', 'ATTIVITA_PUBBLICATA', 'ATTIVITA_BOZZA_NOTA');
-- CreateTable
CREATE TABLE "stato_attivita" (
"id" VARCHAR(2) NOT NULL,
@@ -56,6 +62,8 @@ CREATE TABLE "branca" (
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
"creato_da_id" TEXT,
"stato" "StatoTassonomia" NOT NULL DEFAULT 'CONFERMATA',
CONSTRAINT "branca_pkey" PRIMARY KEY ("id")
);
@@ -81,6 +89,8 @@ CREATE TABLE "periodo_anno" (
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
"creato_da_id" TEXT,
"stato" "StatoTassonomia" NOT NULL DEFAULT 'CONFERMATA',
CONSTRAINT "periodo_anno_pkey" PRIMARY KEY ("id")
);
@@ -121,6 +131,8 @@ CREATE TABLE "categoria" (
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
"creato_da_id" TEXT,
"stato" "StatoTassonomia" NOT NULL DEFAULT 'CONFERMATA',
CONSTRAINT "categoria_pkey" PRIMARY KEY ("id")
);
@@ -174,6 +186,34 @@ CREATE TABLE "categoria_materiale" (
CONSTRAINT "categoria_materiale_pkey" PRIMARY KEY ("materiale_id","categoria_id")
);
-- CreateTable
CREATE TABLE "notifica" (
"id" SERIAL NOT NULL,
"tipo" "TipoNotifica" NOT NULL,
"messaggio" TEXT NOT NULL,
"link" TEXT,
"destinatario_id" TEXT,
"letta" BOOLEAN NOT NULL DEFAULT false,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "notifica_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "notifica_destinatario_id_idx" ON "notifica"("destinatario_id");
-- CreateTable
CREATE TABLE "nota_attivita" (
"id" SERIAL NOT NULL,
"attivita_id" INTEGER NOT NULL,
"testo" VARCHAR(1000) NOT NULL,
"autore" TEXT NOT NULL,
"autore_id" TEXT NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "nota_attivita_pkey" PRIMARY KEY ("id")
);
-- AddForeignKey
ALTER TABLE "attivita" ADD CONSTRAINT "attivita_padre_fkey" FOREIGN KEY ("padre") REFERENCES "attivita"("id") ON DELETE SET NULL ON UPDATE CASCADE;
@@ -222,3 +262,6 @@ ALTER TABLE "categoria_materiale" ADD CONSTRAINT "categoria_materiale_materiale_
-- AddForeignKey
ALTER TABLE "categoria_materiale" ADD CONSTRAINT "categoria_materiale_categoria_id_fkey" FOREIGN KEY ("categoria_id") REFERENCES "categoria"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "nota_attivita" ADD CONSTRAINT "nota_attivita_attivita_id_fkey" FOREIGN KEY ("attivita_id") REFERENCES "attivita"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
@@ -1,3 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "postgresql"
provider = "postgresql"
+47
View File
@@ -7,6 +7,33 @@ datasource db {
url = env("DATABASE_URL")
}
enum StatoTassonomia {
CONFERMATA
DA_APPROVARE
}
enum TipoNotifica {
TASSONOMIA_PROPOSTA
ATTIVITA_IN_ATTESA
ATTIVITA_PUBBLICATA
ATTIVITA_BOZZA_NOTA
}
// destinatarioId null = notifica "broadcast" visibile a chiunque abbia ruolo admin/moderatore
// (usata per segnalare nuove proposte/attività da revisionare); altrimenti è personale.
model Notifica {
id Int @id @default(autoincrement())
tipo TipoNotifica
messaggio String
link String?
destinatarioId String? @map("destinatario_id")
letta Boolean @default(false)
dataCreazione DateTime @default(now()) @map("data_creazione")
@@index([destinatarioId])
@@map("notifica")
}
model StatoAttivita {
id String @id @db.VarChar(2)
nome String
@@ -63,16 +90,32 @@ model Attivita {
categoriaLinks CategoriaAttivita[]
materialeLinks MaterialeAttivita[]
periodoAnnoLinks PeriodoAnnoAttivita[]
noteList NotaAttivita[]
@@map("attivita")
}
model NotaAttivita {
id Int @id @default(autoincrement())
attivitaId Int @map("attivita_id")
testo String @db.VarChar(1000)
autore String
autoreId String @map("autore_id")
dataCreazione DateTime @default(now()) @map("data_creazione")
attivita Attivita @relation(fields: [attivitaId], references: [id])
@@map("nota_attivita")
}
model Branca {
id Int @id @default(autoincrement())
nome String
inizioEta Int? @map("inizio_eta")
fineEta Int? @map("fine_eta")
colore String? @db.VarChar(10)
stato StatoTassonomia @default(CONFERMATA)
creatoDaId String? @map("creato_da_id")
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
@@ -102,6 +145,8 @@ model PeriodoAnno {
nome String
inizioMese Int? @map("inizio_mese")
fineMese Int? @map("fine_mese")
stato StatoTassonomia @default(CONFERMATA)
creatoDaId String? @map("creato_da_id")
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
@@ -148,6 +193,8 @@ model Categoria {
nome String
padreId Int? @map("padre")
tipoId String @map("tipo")
stato StatoTassonomia @default(CONFERMATA)
creatoDaId String? @map("creato_da_id")
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
+14
View File
@@ -10,6 +10,7 @@ async function main() {
{ id: "PU", nome: "Pubblicato" },
{ id: "BO", nome: "Bozza" },
{ id: "PR", nome: "Privato" },
{ id: "IA", nome: "In attesa di approvazione" },
].map((stato) =>
prisma.statoAttivita.upsert({
where: { id: stato.id },
@@ -102,6 +103,19 @@ async function main() {
create: { ...categoria, utenteModifica: UTENTE_MODIFICA },
});
}
// Branca/Categoria/PeriodoAnno sopra sono inserite con id espliciti: l'upsert non passa
// mai dal DEFAULT della colonna, quindi la sequence Postgres dell'id non avanza e resta
// disallineata rispetto al MAX(id) reale. Se non la si risincronizza qui, la prima riga
// creata in seguito con id auto-generato (es. una tassonomia proposta da un utente) va in
// conflitto su un id già esistente.
await Promise.all(
["branca", "categoria", "periodo_anno", "materiale"].map((tabella) =>
prisma.$executeRawUnsafe(
`SELECT setval(pg_get_serial_sequence('"${tabella}"', 'id'), COALESCE((SELECT MAX(id) FROM "${tabella}"), 1))`
)
)
);
}
main()