diff --git a/apps/hub/app/(app)/admin/user/action.ts b/apps/hub/app/(app)/admin/user/action.ts index 8de43981..201a8ba8 100644 --- a/apps/hub/app/(app)/admin/user/action.ts +++ b/apps/hub/app/(app)/admin/user/action.ts @@ -57,10 +57,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 fbd72617..22b2c86f 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 1f09f3f0..6998cbd3 100644 --- a/packages/database/prisma/schema/user.prisma +++ b/packages/database/prisma/schema/user.prisma @@ -54,12 +54,14 @@ 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") + isDeleted Boolean @default(false) @map(name: "is_deleted") + // relations: oauthTokens OAuthToken[] discordAccounts DiscordAccount[] @@ -76,9 +78,10 @@ model User { ConnectedDispatcher ConnectedDispatcher[] ConnectedAircraft ConnectedAircraft[] PositionLog PositionLog[] - Penaltys Penalty[] - CreatedPenalties Penalty[] @relation("CreatedPenalties") + Penaltys AuditLog[] + CreatedAuditLogEntrys AuditLog[] @relation("CreatedAuditLogEntrys") Bookings Booking[] + auditLogs AuditLog[] @@map(name: "users") }