Add scouthub-attivit-be

This commit is contained in:
Lorenzo Sanesi
2026-07-23 19:34:00 +02:00
parent 904cd2ee9b
commit 2ee7d402b6
55 changed files with 9783 additions and 0 deletions
@@ -0,0 +1,223 @@
-- CreateTable
CREATE TABLE "stato_attivita" (
"id" VARCHAR(2) NOT NULL,
"nome" TEXT NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "stato_attivita_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "tipo_categoria" (
"id" TEXT NOT NULL,
"nome" TEXT NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "tipo_categoria_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "tipo_paragrafo" (
"id" TEXT NOT NULL,
"nome" TEXT NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "tipo_paragrafo_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "attivita" (
"id" SERIAL NOT NULL,
"nome" TEXT NOT NULL,
"autore" TEXT NOT NULL,
"padre" INTEGER,
"stato" TEXT NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "attivita_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "branca" (
"id" SERIAL NOT NULL,
"nome" TEXT NOT NULL,
"inizio_eta" INTEGER,
"fine_eta" INTEGER,
"colore" VARCHAR(10),
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "branca_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "branca_attivita" (
"attivita_id" INTEGER NOT NULL,
"branca_id" INTEGER NOT NULL,
"cancellato" BOOLEAN NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "branca_attivita_pkey" PRIMARY KEY ("attivita_id","branca_id")
);
-- CreateTable
CREATE TABLE "periodo_anno" (
"id" SERIAL NOT NULL,
"nome" TEXT NOT NULL,
"inizio_mese" INTEGER,
"fine_mese" INTEGER,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "periodo_anno_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "periodo_anno_attivita" (
"attivita_id" INTEGER NOT NULL,
"periodo_anno_id" INTEGER NOT NULL,
"cancellato" BOOLEAN NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "periodo_anno_attivita_pkey" PRIMARY KEY ("attivita_id","periodo_anno_id")
);
-- CreateTable
CREATE TABLE "paragrafo" (
"id" SERIAL NOT NULL,
"attivita_id" INTEGER NOT NULL,
"corpo" VARCHAR(500) NOT NULL,
"autore" TEXT NOT NULL,
"tipo" TEXT NOT NULL,
"ordine" INTEGER NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "paragrafo_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "categoria" (
"id" SERIAL NOT NULL,
"nome" TEXT NOT NULL,
"padre" INTEGER,
"tipo" TEXT NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "categoria_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "categoria_attivita" (
"attivita_id" INTEGER NOT NULL,
"categoria_id" INTEGER NOT NULL,
"cancellato" BOOLEAN NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "categoria_attivita_pkey" PRIMARY KEY ("attivita_id","categoria_id")
);
-- CreateTable
CREATE TABLE "materiale" (
"id" SERIAL NOT NULL,
"nome" TEXT NOT NULL,
"proprieta" JSONB,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "materiale_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "materiale_attivita" (
"attivita_id" INTEGER NOT NULL,
"materiale_id" INTEGER NOT NULL,
"proprieta" JSONB,
"cancellato" BOOLEAN NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "materiale_attivita_pkey" PRIMARY KEY ("attivita_id","materiale_id")
);
-- CreateTable
CREATE TABLE "categoria_materiale" (
"materiale_id" INTEGER NOT NULL,
"categoria_id" INTEGER NOT NULL,
"cancellato" BOOLEAN NOT NULL,
"data_creazione" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data_modifica" TIMESTAMP(3) NOT NULL,
"utente_modifica" TEXT NOT NULL,
CONSTRAINT "categoria_materiale_pkey" PRIMARY KEY ("materiale_id","categoria_id")
);
-- AddForeignKey
ALTER TABLE "attivita" ADD CONSTRAINT "attivita_padre_fkey" FOREIGN KEY ("padre") REFERENCES "attivita"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "attivita" ADD CONSTRAINT "attivita_stato_fkey" FOREIGN KEY ("stato") REFERENCES "stato_attivita"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "branca_attivita" ADD CONSTRAINT "branca_attivita_attivita_id_fkey" FOREIGN KEY ("attivita_id") REFERENCES "attivita"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "branca_attivita" ADD CONSTRAINT "branca_attivita_branca_id_fkey" FOREIGN KEY ("branca_id") REFERENCES "branca"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "periodo_anno_attivita" ADD CONSTRAINT "periodo_anno_attivita_attivita_id_fkey" FOREIGN KEY ("attivita_id") REFERENCES "attivita"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "periodo_anno_attivita" ADD CONSTRAINT "periodo_anno_attivita_periodo_anno_id_fkey" FOREIGN KEY ("periodo_anno_id") REFERENCES "periodo_anno"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "paragrafo" ADD CONSTRAINT "paragrafo_attivita_id_fkey" FOREIGN KEY ("attivita_id") REFERENCES "attivita"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "paragrafo" ADD CONSTRAINT "paragrafo_tipo_fkey" FOREIGN KEY ("tipo") REFERENCES "tipo_paragrafo"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "categoria" ADD CONSTRAINT "categoria_padre_fkey" FOREIGN KEY ("padre") REFERENCES "categoria"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "categoria" ADD CONSTRAINT "categoria_tipo_fkey" FOREIGN KEY ("tipo") REFERENCES "tipo_categoria"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "categoria_attivita" ADD CONSTRAINT "categoria_attivita_attivita_id_fkey" FOREIGN KEY ("attivita_id") REFERENCES "attivita"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "categoria_attivita" ADD CONSTRAINT "categoria_attivita_categoria_id_fkey" FOREIGN KEY ("categoria_id") REFERENCES "categoria"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "materiale_attivita" ADD CONSTRAINT "materiale_attivita_attivita_id_fkey" FOREIGN KEY ("attivita_id") REFERENCES "attivita"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "materiale_attivita" ADD CONSTRAINT "materiale_attivita_materiale_id_fkey" FOREIGN KEY ("materiale_id") REFERENCES "materiale"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "categoria_materiale" ADD CONSTRAINT "categoria_materiale_materiale_id_fkey" FOREIGN KEY ("materiale_id") REFERENCES "materiale"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- 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;
@@ -0,0 +1,7 @@
-- AlterTable
-- Le righe esistenti (dati di sviluppo/seed, precedenti all'introduzione
-- dell'autenticazione Keycloak) non hanno un autore reale: valorizzate con
-- stringa vuota, poi il default viene rimosso perche' da qui in avanti
-- autoreId e' sempre valorizzato dal token (sub) al momento della creazione.
ALTER TABLE "attivita" ADD COLUMN "autore_id" TEXT NOT NULL DEFAULT '';
ALTER TABLE "attivita" ALTER COLUMN "autore_id" DROP DEFAULT;
@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "postgresql"
+223
View File
@@ -0,0 +1,223 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model StatoAttivita {
id String @id @db.VarChar(2)
nome String
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivita Attivita[]
@@map("stato_attivita")
}
model TipoCategoria {
id String @id
nome String
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
categorie Categoria[]
@@map("tipo_categoria")
}
model TipoParagrafo {
id String @id
nome String
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
paragrafi Paragrafo[]
@@map("tipo_paragrafo")
}
model Attivita {
id Int @id @default(autoincrement())
nome String
autore String
autoreId String @map("autore_id")
padreId Int? @map("padre")
statoId String @map("stato")
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
padre Attivita? @relation("AttivitaPadre", fields: [padreId], references: [id])
figli Attivita[] @relation("AttivitaPadre")
stato StatoAttivita @relation(fields: [statoId], references: [id])
paragrafi Paragrafo[]
brancaLinks BrancaAttivita[]
categoriaLinks CategoriaAttivita[]
materialeLinks MaterialeAttivita[]
periodoAnnoLinks PeriodoAnnoAttivita[]
@@map("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)
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivitaLinks BrancaAttivita[]
@@map("branca")
}
model BrancaAttivita {
attivitaId Int @map("attivita_id")
brancaId Int @map("branca_id")
cancellato Boolean
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivita Attivita @relation(fields: [attivitaId], references: [id])
branca Branca @relation(fields: [brancaId], references: [id])
@@id([attivitaId, brancaId])
@@map("branca_attivita")
}
model PeriodoAnno {
id Int @id @default(autoincrement())
nome String
inizioMese Int? @map("inizio_mese")
fineMese Int? @map("fine_mese")
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivitaLinks PeriodoAnnoAttivita[]
@@map("periodo_anno")
}
model PeriodoAnnoAttivita {
attivitaId Int @map("attivita_id")
periodoAnnoId Int @map("periodo_anno_id")
cancellato Boolean
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivita Attivita @relation(fields: [attivitaId], references: [id])
periodoAnno PeriodoAnno @relation(fields: [periodoAnnoId], references: [id])
@@id([attivitaId, periodoAnnoId])
@@map("periodo_anno_attivita")
}
model Paragrafo {
id Int @id @default(autoincrement())
attivitaId Int @map("attivita_id")
corpo String @db.VarChar(500)
autore String
tipoId String @map("tipo")
ordine Int
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivita Attivita @relation(fields: [attivitaId], references: [id])
tipo TipoParagrafo @relation(fields: [tipoId], references: [id])
@@map("paragrafo")
}
model Categoria {
id Int @id @default(autoincrement())
nome String
padreId Int? @map("padre")
tipoId String @map("tipo")
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
padre Categoria? @relation("CategoriaPadre", fields: [padreId], references: [id])
figli Categoria[] @relation("CategoriaPadre")
tipo TipoCategoria @relation(fields: [tipoId], references: [id])
attivitaLinks CategoriaAttivita[]
materialeLinks CategoriaMateriale[]
@@map("categoria")
}
model CategoriaAttivita {
attivitaId Int @map("attivita_id")
categoriaId Int @map("categoria_id")
cancellato Boolean
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivita Attivita @relation(fields: [attivitaId], references: [id])
categoria Categoria @relation(fields: [categoriaId], references: [id])
@@id([attivitaId, categoriaId])
@@map("categoria_attivita")
}
model Materiale {
id Int @id @default(autoincrement())
nome String
proprieta Json?
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivitaLinks MaterialeAttivita[]
categoriaLinks CategoriaMateriale[]
@@map("materiale")
}
model MaterialeAttivita {
attivitaId Int @map("attivita_id")
materialeId Int @map("materiale_id")
proprieta Json?
cancellato Boolean
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
attivita Attivita @relation(fields: [attivitaId], references: [id])
materiale Materiale @relation(fields: [materialeId], references: [id])
@@id([attivitaId, materialeId])
@@map("materiale_attivita")
}
model CategoriaMateriale {
materialeId Int @map("materiale_id")
categoriaId Int @map("categoria_id")
cancellato Boolean
dataCreazione DateTime @default(now()) @map("data_creazione")
dataModifica DateTime @updatedAt @map("data_modifica")
utenteModifica String @map("utente_modifica")
materiale Materiale @relation(fields: [materialeId], references: [id])
categoria Categoria @relation(fields: [categoriaId], references: [id])
@@id([materialeId, categoriaId])
@@map("categoria_materiale")
}
+114
View File
@@ -0,0 +1,114 @@
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
const UTENTE_MODIFICA = "MANUALE";
async function main() {
await Promise.all(
[
{ id: "PU", nome: "Pubblicato" },
{ id: "BO", nome: "Bozza" },
{ id: "PR", nome: "Privato" },
].map((stato) =>
prisma.statoAttivita.upsert({
where: { id: stato.id },
update: { nome: stato.nome, utenteModifica: UTENTE_MODIFICA },
create: { ...stato, utenteModifica: UTENTE_MODIFICA },
})
)
);
await Promise.all(
[
{ id: "A", nome: "Attività" },
{ id: "M", nome: "Materiale" },
].map((tipo) =>
prisma.tipoCategoria.upsert({
where: { id: tipo.id },
update: { nome: tipo.nome, utenteModifica: UTENTE_MODIFICA },
create: { ...tipo, utenteModifica: UTENTE_MODIFICA },
})
)
);
await Promise.all(
[
{ id: "TITOLO", nome: "Titolo attività" },
{ id: "PARAGRAFO", nome: "Paragrafo attività" },
].map((tipo) =>
prisma.tipoParagrafo.upsert({
where: { id: tipo.id },
update: { nome: tipo.nome, utenteModifica: UTENTE_MODIFICA },
create: { ...tipo, utenteModifica: UTENTE_MODIFICA },
})
)
);
await Promise.all(
[
{ id: 1, nome: "L/C", inizioEta: 8, fineEta: 10, colore: "#FDD835" },
{ id: 2, nome: "E/G", inizioEta: 11, fineEta: 16, colore: "#43A047" },
{ id: 3, nome: "R/S", inizioEta: 17, fineEta: 21, colore: "#E53935" },
{ id: 4, nome: "Co.Ca.", inizioEta: 22, fineEta: 99, colore: "#8E24AA" },
].map((branca) =>
prisma.branca.upsert({
where: { id: branca.id },
update: { ...branca, utenteModifica: UTENTE_MODIFICA },
create: { ...branca, utenteModifica: UTENTE_MODIFICA },
})
)
);
await Promise.all(
[
{ id: 1, nome: "promessa", inizioMese: 1, fineMese: 3 },
{ id: 2, nome: "campo estivo", inizioMese: 6, fineMese: 9 },
{ id: 3, nome: "campo invernale", inizioMese: 12, fineMese: 1 },
].map((periodo) =>
prisma.periodoAnno.upsert({
where: { id: periodo.id },
update: { ...periodo, utenteModifica: UTENTE_MODIFICA },
create: { ...periodo, utenteModifica: UTENTE_MODIFICA },
})
)
);
const categorieSenzaPadre = [
{ id: 1, nome: "attività", tipoId: "A" },
{ id: 2, nome: "gioco", tipoId: "A" },
{ id: 3, nome: "danza", tipoId: "A" },
];
for (const categoria of categorieSenzaPadre) {
await prisma.categoria.upsert({
where: { id: categoria.id },
update: { ...categoria, padreId: null, utenteModifica: UTENTE_MODIFICA },
create: { ...categoria, utenteModifica: UTENTE_MODIFICA },
});
}
const categorieConPadre = [
{ id: 4, nome: "gioco d'acqua", tipoId: "A", padreId: 2 },
{ id: 5, nome: "gioco notturno", tipoId: "A", padreId: 2 },
{ id: 6, nome: "grande gioco", tipoId: "A", padreId: 2 },
{ id: 7, nome: "torneo", tipoId: "A", padreId: 2 },
{ id: 8, nome: "olimpiadi", tipoId: "A", padreId: 2 },
{ id: 9, nome: "gioco giungla", tipoId: "A", padreId: 2 },
];
for (const categoria of categorieConPadre) {
await prisma.categoria.upsert({
where: { id: categoria.id },
update: { ...categoria, utenteModifica: UTENTE_MODIFICA },
create: { ...categoria, utenteModifica: UTENTE_MODIFICA },
});
}
}
main()
.catch((error) => {
console.error(error);
process.exitCode = 1;
})
.finally(async () => {
await prisma.$disconnect();
});