diff --git a/src/api/routes/guilds/#guild_id/audit-logs.ts b/src/api/routes/guilds/#guild_id/audit-logs.ts index 2f99aea00..f7a4ab9c1 100644 --- a/src/api/routes/guilds/#guild_id/audit-logs.ts +++ b/src/api/routes/guilds/#guild_id/audit-logs.ts @@ -18,7 +18,9 @@ import { Router, Response, Request } from "express"; import { route } from "@spacebar/api/middlewares"; -import { AuditLogResponse } from "@spacebar/schemas"; +import { AuditLogEntry, AuditLogEvents, AuditLogResponse } from "@spacebar/schemas"; +import { AuditLog, User } from "@spacebar/database"; +import { FindManyOptions, FindOptionsWhere, In, LessThan, MoreThan } from "typeorm"; const router = Router({ mergeParams: true }); //TODO: implement audit logs @@ -65,17 +67,48 @@ router.get( }, }, }), - (req: Request, res: Response) => { - res.json({ - audit_log_entries: [], + async (req: Request, res: Response) => { + const guildId = req.params.guild_id as string; + const limit = Math.min(100, Number(req.query.limit ?? "50")); + const direction = req.query.before ? "DESC" : req.query.after ? "ASC" : "DESC"; + const directionality = req.query.before ? { id: LessThan(req.query.before as string) } : req.query.after ? { id: MoreThan(req.query.after as string) } : undefined; + + const query = { + where: { + guild_id: guildId, + ...(directionality ?? {}), + }, + order: { + id: direction, + }, + take: limit, + } satisfies FindManyOptions; + + if (req.query.user_id) (query.where as FindOptionsWhere).user_id = req.query.user_id as string; + if (req.query.target_id) (query.where as FindOptionsWhere).target_id = req.query.target_id as string; + if (req.query.action_type) (query.where as FindOptionsWhere).action_type = Number(req.query.action_type as string) as AuditLogEvents; + + const auditLogEntries: AuditLogEntry[] = (await AuditLog.find(query)).map((x) => x.toAuditLogEntry()); + const resp: AuditLogResponse = { + audit_log_entries: auditLogEntries, users: [], - integrations: [], - webhooks: [], - guild_scheduled_events: [], - threads: [], - application_commands: [], - auto_moderation_rules: [], - } satisfies AuditLogResponse); + integrations: [], // TODO once schemas exist + webhooks: [], // TODO once schemas exist + guild_scheduled_events: [], // TODO once schemas exist + threads: [], // TODO once schemas exist + application_commands: [], // TODO once schemas exist + auto_moderation_rules: [], // TODO once schemas exist + }; + + resp.users = ( + await User.find({ + where: { + id: In(auditLogEntries.flatMap((ale) => [ale.user_id, ale.target_id]).filter((x) => x != null)), + }, + }) + ).map((x) => x.toPartialUser()); + + res.json(resp); }, ); export default router;