From 005509598c26d9643f1443de982e00f19bd207b3 Mon Sep 17 00:00:00 2001 From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com> Date: Wed, 21 Jan 2026 19:38:55 +0100 Subject: [PATCH] Include Profile log in renamed penalty model -> Audit log --- apps/hub/app/(app)/admin/user/action.ts | 5 ++- apps/hub/app/(app)/events/page.tsx | 3 ++ apps/hub/app/api/auth/[...nextauth]/auth.ts | 2 ++ packages/database/prisma/json/User.ts | 22 +++++++++++++ .../database/prisma/schema/penalty.prisma | 13 +++++--- packages/database/prisma/schema/report.prisma | 8 ++--- packages/database/prisma/schema/user.prisma | 31 +++++++++++-------- 7 files changed, 62 insertions(+), 22 deletions(-) diff --git a/apps/hub/app/(app)/admin/user/action.ts b/apps/hub/app/(app)/admin/user/action.ts index 5b623291..b3b9613e 100644 --- a/apps/hub/app/(app)/admin/user/action.ts +++ b/apps/hub/app/(app)/admin/user/action.ts @@ -58,10 +58,13 @@ export const deletePilotHistory = async (id: number) => { }); }; export const deleteUser = async (id: string) => { - return await prisma.user.delete({ + return await prisma.user.update({ where: { id: id, }, + data: { + isDeleted: true, + }, }); }; diff --git a/apps/hub/app/(app)/events/page.tsx b/apps/hub/app/(app)/events/page.tsx index cdfbd3d4..fb67df39 100644 --- a/apps/hub/app/(app)/events/page.tsx +++ b/apps/hub/app/(app)/events/page.tsx @@ -10,6 +10,9 @@ const page = async () => { if (!user) return null; const events = await prisma.event.findMany({ + orderBy: { + id: "desc", + }, where: { hidden: false, }, diff --git a/apps/hub/app/api/auth/[...nextauth]/auth.ts b/apps/hub/app/api/auth/[...nextauth]/auth.ts index 07201dec..8a4e530d 100644 --- a/apps/hub/app/api/auth/[...nextauth]/auth.ts +++ b/apps/hub/app/api/auth/[...nextauth]/auth.ts @@ -23,6 +23,7 @@ export const options: AuthOptions = { contains: credentials.email, mode: "insensitive", }, + isDeleted: false, }, }); const v1User = (oldUser as OldUser[]).find( @@ -87,6 +88,7 @@ export const options: AuthOptions = { const dbUser = await prisma.user.findUnique({ where: { id: token?.sub, + isDeleted: false, }, }); if (!dbUser) { diff --git a/packages/database/prisma/json/User.ts b/packages/database/prisma/json/User.ts index 1756f152..3dbbc5d6 100644 --- a/packages/database/prisma/json/User.ts +++ b/packages/database/prisma/json/User.ts @@ -1,5 +1,27 @@ import { User } from "../../generated/client"; +// USer History + +interface UserDeletedEvent { + type: "USER_DELETED"; + reason: string; + date: string; + by: string; +} + +interface UserProfileUpdatedEvent { + type: "USER_PROFILE_UPDATED"; + changes: { + field: string; + oldValue: string; + newValue: string; + }; + date: string; + by: string; +} + +export type UserHistoryEvent = UserDeletedEvent | UserProfileUpdatedEvent; + export interface PublicUser { firstname: string; lastname: string; diff --git a/packages/database/prisma/schema/penalty.prisma b/packages/database/prisma/schema/penalty.prisma index 27a163f4..8a208b9a 100644 --- a/packages/database/prisma/schema/penalty.prisma +++ b/packages/database/prisma/schema/penalty.prisma @@ -1,11 +1,12 @@ -model Penalty { +model AuditLog { id Int @id @default(autoincrement()) userId String createdUserId String? reportId Int? - type PenaltyType - reason String + // Generalized action type to cover penalties and user history events + action AuditLogAction? + reason String? until DateTime? suspended Boolean @default(false) @@ -18,9 +19,13 @@ model Penalty { Report Report? @relation(fields: [reportId], references: [id]) } -enum PenaltyType { +enum AuditLogAction { + // Penalty actions KICK TIME_BAN PERMISSIONS_REVOCED BAN + // User history events + USER_DELETED + USER_PROFILE_UPDATED } diff --git a/packages/database/prisma/schema/report.prisma b/packages/database/prisma/schema/report.prisma index 7bcd0bdd..33c0e9a8 100644 --- a/packages/database/prisma/schema/report.prisma +++ b/packages/database/prisma/schema/report.prisma @@ -10,8 +10,8 @@ model Report { reviewerUserId String? // relations: - Sender User? @relation("SentReports", fields: [senderUserId], references: [id]) - Reported User @relation("ReceivedReports", fields: [reportedUserId], references: [id], onDelete: Cascade) - Reviewer User? @relation("ReviewedReports", fields: [reviewerUserId], references: [id]) - Penalty Penalty[] + Sender User? @relation("SentReports", fields: [senderUserId], references: [id]) + Reported User @relation("ReceivedReports", fields: [reportedUserId], references: [id], onDelete: Cascade) + Reviewer User? @relation("ReviewedReports", fields: [reviewerUserId], references: [id]) + AuditLog AuditLog[] } diff --git a/packages/database/prisma/schema/user.prisma b/packages/database/prisma/schema/user.prisma index 244b0c62..f8023cb3 100644 --- a/packages/database/prisma/schema/user.prisma +++ b/packages/database/prisma/schema/user.prisma @@ -54,18 +54,21 @@ model User { emailVerificationExpiresAt DateTime? @map(name: "email_verification_expires_at") emailVerified Boolean @default(false) - image String? - badges BADGES[] @default([]) - permissions PERMISSION[] @default([]) - createdAt DateTime @default(now()) @map(name: "created_at") - updatedAt DateTime @default(now()) @map(name: "updated_at") - isBanned Boolean @default(false) @map(name: "is_banned") + image String? + badges BADGES[] @default([]) + permissions PERMISSION[] @default([]) + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @default(now()) @map(name: "updated_at") + isBanned Boolean @default(false) @map(name: "is_banned") // Duplicate handling: - canonicalUserId String? @map(name: "canonical_user_id") - CanonicalUser User? @relation("CanonicalUser", fields: [canonicalUserId], references: [id]) - Duplicates User[] @relation("CanonicalUser") - duplicateDetectedAt DateTime? @map(name: "duplicate_detected_at") - duplicateReason String? @map(name: "duplicate_reason") + canonicalUserId String? @map(name: "canonical_user_id") + CanonicalUser User? @relation("CanonicalUser", fields: [canonicalUserId], references: [id]) + Duplicates User[] @relation("CanonicalUser") + duplicateDetectedAt DateTime? @map(name: "duplicate_detected_at") + duplicateReason String? @map(name: "duplicate_reason") + + isDeleted Boolean @default(false) @map(name: "is_deleted") + // relations: oauthTokens OAuthToken[] participants Participant[] @@ -79,12 +82,14 @@ model User { ConnectedDispatcher ConnectedDispatcher[] ConnectedAircraft ConnectedAircraft[] PositionLog PositionLog[] - Penaltys Penalty[] - CreatedPenalties Penalty[] @relation("CreatedPenalties") + Penaltys AuditLog[] + CreatedAuditLogEntrys AuditLog[] @relation("CreatedAuditLogEntrys") Bookings Booking[] + auditLogs AuditLog[] DiscordAccount DiscordAccount? FormerDiscordAccounts FormerDiscordAccount[] + auditLogs AuditLog[] @@map(name: "users") }