Add 21 files, update 16 files, rename 1 file
This commit is contained in:
1 parent
b9e4ed4dfc
commit
278293b397
39 files changed
+2434
-61
No files matched your search
@@ -1,15 +1,39 @@
|
||||
ALTER TABLE "communication_rooms"
|
||||
ADD COLUMN "audienceType" TEXT NOT NULL DEFAULT 'direct',
|
||||
ADD COLUMN "classGroupId" TEXT,
|
||||
ADD COLUMN "escalationEligibleAt" TIMESTAMP(3),
|
||||
ADD COLUMN "escalatedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "resolvedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "resolutionStatus" TEXT NOT NULL DEFAULT 'open';
|
||||
ALTER TABLE "communication_rooms" ADD COLUMN "audienceType" TEXT NOT NULL DEFAULT 'direct';
|
||||
ALTER TABLE "communication_rooms" ADD COLUMN "classGroupId" TEXT;
|
||||
ALTER TABLE "communication_rooms" ADD COLUMN "escalationEligibleAt" TIMESTAMP(3);
|
||||
ALTER TABLE "communication_rooms" ADD COLUMN "escalatedAt" TIMESTAMP(3);
|
||||
ALTER TABLE "communication_rooms" ADD COLUMN "resolvedAt" TIMESTAMP(3);
|
||||
ALTER TABLE "communication_rooms" ADD COLUMN "resolutionStatus" TEXT NOT NULL DEFAULT 'open';
|
||||
|
||||
ALTER TABLE "communication_rooms"
|
||||
ADD CONSTRAINT "communication_rooms_classGroupId_fkey"
|
||||
FOREIGN KEY ("classGroupId") REFERENCES "ClassGroup"("id")
|
||||
ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
PRAGMA foreign_keys=OFF;
|
||||
CREATE TABLE "new_communication_rooms" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"schoolId" TEXT NOT NULL,
|
||||
"studentId" TEXT NOT NULL,
|
||||
"teacherId" TEXT NOT NULL,
|
||||
"roomType" TEXT NOT NULL DEFAULT 'chat',
|
||||
"audienceType" TEXT NOT NULL DEFAULT 'direct',
|
||||
"classGroupId" TEXT,
|
||||
"status" TEXT NOT NULL DEFAULT 'requested',
|
||||
"requestedBy" TEXT NOT NULL,
|
||||
"escalationEligibleAt" DATETIME,
|
||||
"escalatedAt" DATETIME,
|
||||
"resolvedAt" DATETIME,
|
||||
"resolutionStatus" TEXT NOT NULL DEFAULT 'open',
|
||||
"acceptedAt" DATETIME,
|
||||
"closedAt" DATETIME,
|
||||
"closeReason" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "communication_rooms_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "communication_rooms_studentId_fkey" FOREIGN KEY ("studentId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "communication_rooms_teacherId_fkey" FOREIGN KEY ("teacherId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "communication_rooms_classGroupId_fkey" FOREIGN KEY ("classGroupId") REFERENCES "ClassGroup" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_communication_rooms" ("id", "schoolId", "studentId", "teacherId", "roomType", "audienceType", "classGroupId", "status", "requestedBy", "escalationEligibleAt", "escalatedAt", "resolvedAt", "resolutionStatus", "acceptedAt", "closedAt", "closeReason", "createdAt", "updatedAt") SELECT "id", "schoolId", "studentId", "teacherId", "roomType", "audienceType", "classGroupId", "status", "requestedBy", "escalationEligibleAt", "escalatedAt", "resolvedAt", "resolutionStatus", "acceptedAt", "closedAt", "closeReason", "createdAt", "updatedAt" FROM "communication_rooms";
|
||||
DROP TABLE "communication_rooms";
|
||||
ALTER TABLE "new_communication_rooms" RENAME TO "communication_rooms";
|
||||
PRAGMA foreign_keys=ON;
|
||||
|
||||
CREATE INDEX "communication_rooms_classGroupId_idx" ON "communication_rooms"("classGroupId");
|
||||
CREATE INDEX "communication_rooms_escalationEligibleAt_idx" ON "communication_rooms"("escalationEligibleAt");
|
||||
@@ -1,21 +1,49 @@
|
||||
ALTER TABLE "illness_reports"
|
||||
ADD COLUMN "leaveType" TEXT NOT NULL DEFAULT 'illness',
|
||||
ADD COLUMN "teacherNotifiedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "adminApprovalStatus" TEXT NOT NULL DEFAULT 'pending',
|
||||
ADD COLUMN "adminApprovedBy" TEXT,
|
||||
ADD COLUMN "adminApprovedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "adminNotes" TEXT,
|
||||
ADD COLUMN "calendarEventId" TEXT;
|
||||
ALTER TABLE "illness_reports" ADD COLUMN "leaveType" TEXT NOT NULL DEFAULT 'illness';
|
||||
ALTER TABLE "illness_reports" ADD COLUMN "teacherNotifiedAt" TIMESTAMP(3);
|
||||
ALTER TABLE "illness_reports" ADD COLUMN "adminApprovalStatus" TEXT NOT NULL DEFAULT 'pending';
|
||||
ALTER TABLE "illness_reports" ADD COLUMN "adminApprovedBy" TEXT;
|
||||
ALTER TABLE "illness_reports" ADD COLUMN "adminApprovedAt" TIMESTAMP(3);
|
||||
ALTER TABLE "illness_reports" ADD COLUMN "adminNotes" TEXT;
|
||||
ALTER TABLE "illness_reports" ADD COLUMN "calendarEventId" TEXT;
|
||||
|
||||
ALTER TABLE "illness_reports"
|
||||
ADD CONSTRAINT "illness_reports_adminApprovedBy_fkey"
|
||||
FOREIGN KEY ("adminApprovedBy") REFERENCES "User"("id")
|
||||
ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE "illness_reports"
|
||||
ADD CONSTRAINT "illness_reports_calendarEventId_fkey"
|
||||
FOREIGN KEY ("calendarEventId") REFERENCES "CalendarEvent"("id")
|
||||
ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
PRAGMA foreign_keys=OFF;
|
||||
CREATE TABLE "new_illness_reports" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"schoolId" TEXT NOT NULL,
|
||||
"studentId" TEXT NOT NULL,
|
||||
"reportedBy" TEXT NOT NULL,
|
||||
"reporterType" TEXT NOT NULL,
|
||||
"reason" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"startDate" DATETIME NOT NULL,
|
||||
"endDate" DATETIME,
|
||||
"documentUrl" TEXT,
|
||||
"leaveType" TEXT NOT NULL DEFAULT 'illness',
|
||||
"status" TEXT NOT NULL DEFAULT 'pending',
|
||||
"parentApprovalStatus" TEXT NOT NULL DEFAULT 'pending',
|
||||
"parentApprovedBy" TEXT,
|
||||
"parentApprovedAt" DATETIME,
|
||||
"isVisibleToTeacher" BOOLEAN NOT NULL DEFAULT false,
|
||||
"isVisibleToAdmin" BOOLEAN NOT NULL DEFAULT false,
|
||||
"teacherNotifiedAt" DATETIME,
|
||||
"adminApprovalStatus" TEXT NOT NULL DEFAULT 'pending',
|
||||
"adminApprovedBy" TEXT,
|
||||
"adminApprovedAt" DATETIME,
|
||||
"adminNotes" TEXT,
|
||||
"calendarEventId" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "illness_reports_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "illness_reports_studentId_fkey" FOREIGN KEY ("studentId") REFERENCES "Student" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "illness_reports_reportedBy_fkey" FOREIGN KEY ("reportedBy") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "illness_reports_parentApprovedBy_fkey" FOREIGN KEY ("parentApprovedBy") REFERENCES "User" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT "illness_reports_adminApprovedBy_fkey" FOREIGN KEY ("adminApprovedBy") REFERENCES "User" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT "illness_reports_calendarEventId_fkey" FOREIGN KEY ("calendarEventId") REFERENCES "CalendarEvent" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_illness_reports" ("id", "schoolId", "studentId", "reportedBy", "reporterType", "reason", "description", "startDate", "endDate", "documentUrl", "leaveType", "status", "parentApprovalStatus", "parentApprovedBy", "parentApprovedAt", "isVisibleToTeacher", "isVisibleToAdmin", "teacherNotifiedAt", "adminApprovalStatus", "adminApprovedBy", "adminApprovedAt", "adminNotes", "calendarEventId", "createdAt", "updatedAt") SELECT "id", "schoolId", "studentId", "reportedBy", "reporterType", "reason", "description", "startDate", "endDate", "documentUrl", "leaveType", "status", "parentApprovalStatus", "parentApprovedBy", "parentApprovedAt", "isVisibleToTeacher", "isVisibleToAdmin", "teacherNotifiedAt", "adminApprovalStatus", "adminApprovedBy", "adminApprovedAt", "adminNotes", "calendarEventId", "createdAt", "updatedAt" FROM "illness_reports";
|
||||
DROP TABLE "illness_reports";
|
||||
ALTER TABLE "new_illness_reports" RENAME TO "illness_reports";
|
||||
PRAGMA foreign_keys=ON;
|
||||
|
||||
CREATE UNIQUE INDEX "illness_reports_calendarEventId_key" ON "illness_reports"("calendarEventId");
|
||||
CREATE INDEX "illness_reports_adminApprovalStatus_idx" ON "illness_reports"("adminApprovalStatus");
|
||||
@@ -1,20 +1,38 @@
|
||||
ALTER TABLE "teacher_absences"
|
||||
ADD COLUMN "approvalStatus" TEXT NOT NULL DEFAULT 'pending',
|
||||
ADD COLUMN "approvedBy" TEXT,
|
||||
ADD COLUMN "approvedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "privateAdminNotes" TEXT,
|
||||
ADD COLUMN "documentUrl" TEXT,
|
||||
ADD COLUMN "calendarEventId" TEXT;
|
||||
ALTER TABLE "teacher_absences" ADD COLUMN "approvalStatus" TEXT NOT NULL DEFAULT 'pending';
|
||||
ALTER TABLE "teacher_absences" ADD COLUMN "approvedBy" TEXT;
|
||||
ALTER TABLE "teacher_absences" ADD COLUMN "approvedAt" TIMESTAMP(3);
|
||||
ALTER TABLE "teacher_absences" ADD COLUMN "privateAdminNotes" TEXT;
|
||||
ALTER TABLE "teacher_absences" ADD COLUMN "documentUrl" TEXT;
|
||||
ALTER TABLE "teacher_absences" ADD COLUMN "calendarEventId" TEXT;
|
||||
|
||||
ALTER TABLE "teacher_absences"
|
||||
ADD CONSTRAINT "teacher_absences_approvedBy_fkey"
|
||||
FOREIGN KEY ("approvedBy") REFERENCES "User"("id")
|
||||
ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE "teacher_absences"
|
||||
ADD CONSTRAINT "teacher_absences_calendarEventId_fkey"
|
||||
FOREIGN KEY ("calendarEventId") REFERENCES "CalendarEvent"("id")
|
||||
ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
PRAGMA foreign_keys=OFF;
|
||||
CREATE TABLE "new_teacher_absences" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"schoolId" TEXT NOT NULL,
|
||||
"teacherId" TEXT NOT NULL,
|
||||
"startDate" DATETIME NOT NULL,
|
||||
"endDate" DATETIME NOT NULL,
|
||||
"type" TEXT NOT NULL,
|
||||
"reason" TEXT,
|
||||
"status" TEXT NOT NULL DEFAULT 'reported',
|
||||
"notes" TEXT,
|
||||
"approvalStatus" TEXT NOT NULL DEFAULT 'pending',
|
||||
"approvedBy" TEXT,
|
||||
"approvedAt" DATETIME,
|
||||
"privateAdminNotes" TEXT,
|
||||
"documentUrl" TEXT,
|
||||
"calendarEventId" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "teacher_absences_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "teacher_absences_teacherId_fkey" FOREIGN KEY ("teacherId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "teacher_absences_approvedBy_fkey" FOREIGN KEY ("approvedBy") REFERENCES "User" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT "teacher_absences_calendarEventId_fkey" FOREIGN KEY ("calendarEventId") REFERENCES "CalendarEvent" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_teacher_absences" ("id", "schoolId", "teacherId", "startDate", "endDate", "type", "reason", "status", "notes", "approvalStatus", "approvedBy", "approvedAt", "privateAdminNotes", "documentUrl", "calendarEventId", "createdAt", "updatedAt") SELECT "id", "schoolId", "teacherId", "startDate", "endDate", "type", "reason", "status", "notes", "approvalStatus", "approvedBy", "approvedAt", "privateAdminNotes", "documentUrl", "calendarEventId", "createdAt", "updatedAt" FROM "teacher_absences";
|
||||
DROP TABLE "teacher_absences";
|
||||
ALTER TABLE "new_teacher_absences" RENAME TO "teacher_absences";
|
||||
PRAGMA foreign_keys=ON;
|
||||
|
||||
CREATE UNIQUE INDEX "teacher_absences_calendarEventId_key" ON "teacher_absences"("calendarEventId");
|
||||
CREATE INDEX "teacher_absences_approvalStatus_idx" ON "teacher_absences"("approvalStatus");
|
||||
@@ -0,0 +1,15 @@
|
||||
ALTER TABLE "User" ADD COLUMN "emailVerifiedAt" DATETIME;
|
||||
|
||||
CREATE TABLE "PasswordResetToken" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"tokenHash" TEXT NOT NULL,
|
||||
"expiresAt" DATETIME NOT NULL,
|
||||
"usedAt" DATETIME,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "PasswordResetToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX "PasswordResetToken_tokenHash_key" ON "PasswordResetToken"("tokenHash");
|
||||
CREATE INDEX "PasswordResetToken_userId_idx" ON "PasswordResetToken"("userId");
|
||||
CREATE INDEX "PasswordResetToken_expiresAt_idx" ON "PasswordResetToken"("expiresAt");
|
||||
@@ -148,6 +148,7 @@ model User {
|
||||
role String @default("TEACHER") // TEACHER, SCHOOL_ADMIN, SUPER_ADMIN, STUDENT, PARENT, VICE_PRINCIPAL, DPO
|
||||
locale String @default("de")
|
||||
twoFactorSecret String?
|
||||
emailVerifiedAt DateTime?
|
||||
isDemo Boolean @default(false)
|
||||
isTeacher Boolean @default(false) // civil-servant status for Personalrat rights
|
||||
createdAt DateTime @default(now())
|
||||
@@ -243,6 +244,21 @@ model User {
|
||||
// Module J widgets relations
|
||||
dashboardWidgets DashboardWidget[]
|
||||
dashboardLayouts DashboardLayout[]
|
||||
passwordResetTokens PasswordResetToken[]
|
||||
}
|
||||
|
||||
model PasswordResetToken {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
tokenHash String @unique
|
||||
expiresAt DateTime
|
||||
usedAt DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([userId])
|
||||
@@index([expiresAt])
|
||||
}
|
||||
|
||||
model SchoolYear {
|
||||
|
||||
+7
-2
@@ -1,5 +1,5 @@
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
import bcrypt from 'bcryptjs'
|
||||
import argon2 from 'argon2'
|
||||
|
||||
const prisma = new PrismaClient()
|
||||
const password = 'Demo2025!'
|
||||
@@ -13,7 +13,12 @@ const demoUsers = [
|
||||
]
|
||||
|
||||
async function main() {
|
||||
const passwordHash = await bcrypt.hash(password, 10)
|
||||
const passwordHash = await argon2.hash(password, {
|
||||
type: argon2.argon2id,
|
||||
memoryCost: 19 * 1024,
|
||||
timeCost: 2,
|
||||
parallelism: 1,
|
||||
})
|
||||
|
||||
for (const user of demoUsers) {
|
||||
await prisma.user.upsert({
|
||||
|
||||
+7
-2
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
import bcrypt from 'bcryptjs'
|
||||
import argon2 from 'argon2'
|
||||
|
||||
const prisma = new PrismaClient()
|
||||
|
||||
@@ -96,7 +96,12 @@ async function main() {
|
||||
|
||||
// ─── 3. Demo Users ──────────────────────────────────────────────────
|
||||
console.log(' 👩🏫 Creating demo users...')
|
||||
const passwordHash = await bcrypt.hash('Demo2025!', 10)
|
||||
const passwordHash = await argon2.hash('Demo2025!', {
|
||||
type: argon2.argon2id,
|
||||
memoryCost: 19 * 1024,
|
||||
timeCost: 2,
|
||||
parallelism: 1,
|
||||
})
|
||||
const teacher = await prisma.user.create({
|
||||
data: {
|
||||
schoolId: school.id,
|
||||
|
||||
Reference in new issue
Block a user