generated from nhcarrigan/template
feat: audit logs show user info
This commit is contained in:
@@ -83,17 +83,14 @@ export default async function (app: FastifyInstance): Promise<void> {
|
||||
request.body
|
||||
);
|
||||
|
||||
await AuditService.log(
|
||||
{
|
||||
action: AuditAction.ENTRY_CREATE,
|
||||
category: AuditCategory.CONTENT,
|
||||
resourceType: "Suggestion",
|
||||
resourceId: suggestion.id,
|
||||
details: `Created ${suggestion.entityType} suggestion: ${suggestion.title}`,
|
||||
success: true,
|
||||
},
|
||||
request
|
||||
);
|
||||
await AuditService.logFromRequest(request, {
|
||||
action: AuditAction.ENTRY_CREATE,
|
||||
category: AuditCategory.CONTENT,
|
||||
resourceType: "Suggestion",
|
||||
resourceId: suggestion.id,
|
||||
details: `Created ${suggestion.entityType} suggestion: ${suggestion.title}`,
|
||||
success: true,
|
||||
});
|
||||
|
||||
reply.send(suggestion);
|
||||
} catch (error) {
|
||||
@@ -116,17 +113,14 @@ export default async function (app: FastifyInstance): Promise<void> {
|
||||
try {
|
||||
const suggestion = await SuggestionService.acceptSuggestion(id);
|
||||
|
||||
await AuditService.log(
|
||||
{
|
||||
action: AuditAction.ENTRY_UPDATE,
|
||||
category: AuditCategory.ADMIN,
|
||||
resourceType: "Suggestion",
|
||||
resourceId: suggestion.id,
|
||||
details: `Accepted ${suggestion.entityType} suggestion: ${suggestion.title}`,
|
||||
success: true,
|
||||
},
|
||||
request
|
||||
);
|
||||
await AuditService.logFromRequest(request, {
|
||||
action: AuditAction.ENTRY_UPDATE,
|
||||
category: AuditCategory.ADMIN,
|
||||
resourceType: "Suggestion",
|
||||
resourceId: suggestion.id,
|
||||
details: `Accepted ${suggestion.entityType} suggestion: ${suggestion.title}`,
|
||||
success: true,
|
||||
});
|
||||
|
||||
reply.send(suggestion);
|
||||
} catch (error) {
|
||||
@@ -150,17 +144,14 @@ export default async function (app: FastifyInstance): Promise<void> {
|
||||
try {
|
||||
const suggestion = await SuggestionService.acceptSuggestionWithEdits(id, editedData);
|
||||
|
||||
await AuditService.log(
|
||||
{
|
||||
action: AuditAction.ENTRY_UPDATE,
|
||||
category: AuditCategory.ADMIN,
|
||||
resourceType: "Suggestion",
|
||||
resourceId: suggestion.id,
|
||||
details: `Accepted ${suggestion.entityType} suggestion with edits: ${suggestion.title}`,
|
||||
success: true,
|
||||
},
|
||||
request
|
||||
);
|
||||
await AuditService.logFromRequest(request, {
|
||||
action: AuditAction.ENTRY_UPDATE,
|
||||
category: AuditCategory.ADMIN,
|
||||
resourceType: "Suggestion",
|
||||
resourceId: suggestion.id,
|
||||
details: `Accepted ${suggestion.entityType} suggestion with edits: ${suggestion.title}`,
|
||||
success: true,
|
||||
});
|
||||
|
||||
reply.send(suggestion);
|
||||
} catch (error) {
|
||||
@@ -184,17 +175,14 @@ export default async function (app: FastifyInstance): Promise<void> {
|
||||
try {
|
||||
const suggestion = await SuggestionService.declineSuggestion(id, reason);
|
||||
|
||||
await AuditService.log(
|
||||
{
|
||||
action: AuditAction.ENTRY_UPDATE,
|
||||
category: AuditCategory.ADMIN,
|
||||
resourceType: "Suggestion",
|
||||
resourceId: suggestion.id,
|
||||
details: `Declined ${suggestion.entityType} suggestion: ${suggestion.title}${reason ? ` (Reason: ${reason})` : ""}`,
|
||||
success: true,
|
||||
},
|
||||
request
|
||||
);
|
||||
await AuditService.logFromRequest(request, {
|
||||
action: AuditAction.ENTRY_UPDATE,
|
||||
category: AuditCategory.ADMIN,
|
||||
resourceType: "Suggestion",
|
||||
resourceId: suggestion.id,
|
||||
details: `Declined ${suggestion.entityType} suggestion: ${suggestion.title}${reason ? ` (Reason: ${reason})` : ""}`,
|
||||
success: true,
|
||||
});
|
||||
|
||||
reply.send(suggestion);
|
||||
} catch (error) {
|
||||
|
||||
@@ -74,7 +74,7 @@ export const AuditService = {
|
||||
}
|
||||
}
|
||||
|
||||
const [logs, total] = await Promise.all([
|
||||
const [rawLogs, total] = await Promise.all([
|
||||
prisma.auditLog.findMany({
|
||||
where,
|
||||
orderBy: { createdAt: "desc" },
|
||||
@@ -84,6 +84,45 @@ export const AuditService = {
|
||||
prisma.auditLog.count({ where }),
|
||||
]);
|
||||
|
||||
// Collect all unique user IDs to fetch
|
||||
const userIds = new Set<string>();
|
||||
for (const log of rawLogs) {
|
||||
if (log.userId) {
|
||||
userIds.add(log.userId);
|
||||
}
|
||||
if (log.targetUserId) {
|
||||
userIds.add(log.targetUserId);
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch all users in one query
|
||||
const users = userIds.size > 0
|
||||
? await prisma.user.findMany({
|
||||
where: { id: { in: Array.from(userIds) } },
|
||||
select: { id: true, username: true, avatar: true },
|
||||
})
|
||||
: [];
|
||||
|
||||
// Create a lookup map
|
||||
const userMap = new Map(users.map(u => [u.id, { id: u.id, username: u.username, avatar: u.avatar ?? undefined }]));
|
||||
|
||||
// Map logs with user info
|
||||
const logs = rawLogs.map(log => ({
|
||||
id: log.id,
|
||||
action: log.action,
|
||||
category: log.category,
|
||||
userId: log.userId ?? undefined,
|
||||
user: log.userId ? userMap.get(log.userId) : undefined,
|
||||
targetUserId: log.targetUserId ?? undefined,
|
||||
targetUser: log.targetUserId ? userMap.get(log.targetUserId) : undefined,
|
||||
resourceType: log.resourceType ?? undefined,
|
||||
resourceId: log.resourceId ?? undefined,
|
||||
details: log.details ?? undefined,
|
||||
userAgent: log.userAgent ?? undefined,
|
||||
success: log.success,
|
||||
createdAt: log.createdAt,
|
||||
}));
|
||||
|
||||
return {
|
||||
logs,
|
||||
total,
|
||||
|
||||
Reference in New Issue
Block a user