Include Profile log in renamed penalty model -> Audit log

This commit is contained in:
PxlLoewe
2026-01-21 19:38:55 +01:00
parent b250fa46c2
commit 005509598c
7 changed files with 62 additions and 22 deletions

View File

@@ -58,10 +58,13 @@ export const deletePilotHistory = async (id: number) => {
}); });
}; };
export const deleteUser = async (id: string) => { export const deleteUser = async (id: string) => {
return await prisma.user.delete({ return await prisma.user.update({
where: { where: {
id: id, id: id,
}, },
data: {
isDeleted: true,
},
}); });
}; };

View File

@@ -10,6 +10,9 @@ const page = async () => {
if (!user) return null; if (!user) return null;
const events = await prisma.event.findMany({ const events = await prisma.event.findMany({
orderBy: {
id: "desc",
},
where: { where: {
hidden: false, hidden: false,
}, },

View File

@@ -23,6 +23,7 @@ export const options: AuthOptions = {
contains: credentials.email, contains: credentials.email,
mode: "insensitive", mode: "insensitive",
}, },
isDeleted: false,
}, },
}); });
const v1User = (oldUser as OldUser[]).find( const v1User = (oldUser as OldUser[]).find(
@@ -87,6 +88,7 @@ export const options: AuthOptions = {
const dbUser = await prisma.user.findUnique({ const dbUser = await prisma.user.findUnique({
where: { where: {
id: token?.sub, id: token?.sub,
isDeleted: false,
}, },
}); });
if (!dbUser) { if (!dbUser) {

View File

@@ -1,5 +1,27 @@
import { User } from "../../generated/client"; 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 { export interface PublicUser {
firstname: string; firstname: string;
lastname: string; lastname: string;

View File

@@ -1,11 +1,12 @@
model Penalty { model AuditLog {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
userId String userId String
createdUserId String? createdUserId String?
reportId Int? reportId Int?
type PenaltyType // Generalized action type to cover penalties and user history events
reason String action AuditLogAction?
reason String?
until DateTime? until DateTime?
suspended Boolean @default(false) suspended Boolean @default(false)
@@ -18,9 +19,13 @@ model Penalty {
Report Report? @relation(fields: [reportId], references: [id]) Report Report? @relation(fields: [reportId], references: [id])
} }
enum PenaltyType { enum AuditLogAction {
// Penalty actions
KICK KICK
TIME_BAN TIME_BAN
PERMISSIONS_REVOCED PERMISSIONS_REVOCED
BAN BAN
// User history events
USER_DELETED
USER_PROFILE_UPDATED
} }

View File

@@ -10,8 +10,8 @@ model Report {
reviewerUserId String? reviewerUserId String?
// relations: // relations:
Sender User? @relation("SentReports", fields: [senderUserId], references: [id]) Sender User? @relation("SentReports", fields: [senderUserId], references: [id])
Reported User @relation("ReceivedReports", fields: [reportedUserId], references: [id], onDelete: Cascade) Reported User @relation("ReceivedReports", fields: [reportedUserId], references: [id], onDelete: Cascade)
Reviewer User? @relation("ReviewedReports", fields: [reviewerUserId], references: [id]) Reviewer User? @relation("ReviewedReports", fields: [reviewerUserId], references: [id])
Penalty Penalty[] AuditLog AuditLog[]
} }

View File

@@ -54,18 +54,21 @@ model User {
emailVerificationExpiresAt DateTime? @map(name: "email_verification_expires_at") emailVerificationExpiresAt DateTime? @map(name: "email_verification_expires_at")
emailVerified Boolean @default(false) emailVerified Boolean @default(false)
image String? image String?
badges BADGES[] @default([]) badges BADGES[] @default([])
permissions PERMISSION[] @default([]) permissions PERMISSION[] @default([])
createdAt DateTime @default(now()) @map(name: "created_at") createdAt DateTime @default(now()) @map(name: "created_at")
updatedAt DateTime @default(now()) @map(name: "updated_at") updatedAt DateTime @default(now()) @map(name: "updated_at")
isBanned Boolean @default(false) @map(name: "is_banned") isBanned Boolean @default(false) @map(name: "is_banned")
// Duplicate handling: // Duplicate handling:
canonicalUserId String? @map(name: "canonical_user_id") canonicalUserId String? @map(name: "canonical_user_id")
CanonicalUser User? @relation("CanonicalUser", fields: [canonicalUserId], references: [id]) CanonicalUser User? @relation("CanonicalUser", fields: [canonicalUserId], references: [id])
Duplicates User[] @relation("CanonicalUser") Duplicates User[] @relation("CanonicalUser")
duplicateDetectedAt DateTime? @map(name: "duplicate_detected_at") duplicateDetectedAt DateTime? @map(name: "duplicate_detected_at")
duplicateReason String? @map(name: "duplicate_reason") duplicateReason String? @map(name: "duplicate_reason")
isDeleted Boolean @default(false) @map(name: "is_deleted")
// relations: // relations:
oauthTokens OAuthToken[] oauthTokens OAuthToken[]
participants Participant[] participants Participant[]
@@ -79,12 +82,14 @@ model User {
ConnectedDispatcher ConnectedDispatcher[] ConnectedDispatcher ConnectedDispatcher[]
ConnectedAircraft ConnectedAircraft[] ConnectedAircraft ConnectedAircraft[]
PositionLog PositionLog[] PositionLog PositionLog[]
Penaltys Penalty[] Penaltys AuditLog[]
CreatedPenalties Penalty[] @relation("CreatedPenalties") CreatedAuditLogEntrys AuditLog[] @relation("CreatedAuditLogEntrys")
Bookings Booking[] Bookings Booking[]
auditLogs AuditLog[]
DiscordAccount DiscordAccount? DiscordAccount DiscordAccount?
FormerDiscordAccounts FormerDiscordAccount[] FormerDiscordAccounts FormerDiscordAccount[]
auditLogs AuditLog[]
@@map(name: "users") @@map(name: "users")
} }