Sistemato attività
This commit is contained in:
@@ -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"
|
||||
@@ -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")
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user