From 9f0132db34656c96dc73331b307157413196857a Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Wed, 4 Feb 2026 22:36:26 -0800 Subject: [PATCH] chore: lints --- api/jest.config.cts | 1 + api/src/app/app.spec.ts | 2 +- api/src/app/app.ts | 8 +- api/src/app/plugins/auth.ts | 4 +- api/src/app/plugins/rate-limit.ts | 4 +- api/src/app/routes/art/index.ts | 24 +-- api/src/app/routes/auth/index.ts | 12 +- api/src/app/routes/books/index.ts | 24 +-- api/src/app/routes/games/index.ts | 24 +-- api/src/app/routes/manga/index.ts | 24 +-- api/src/app/routes/music/index.ts | 24 +-- api/src/app/routes/shows/index.ts | 24 +-- api/src/app/routes/suggestions/index.ts | 20 +- api/src/app/routes/users/index.ts | 8 +- api/src/app/services/audit.service.ts | 2 +- api/src/app/services/like.service.ts | 8 +- api/src/test-setup.ts | 15 ++ .../admin/admin-suggestions.component.ts | 8 +- .../components/art/art-gallery.component.ts | 20 +- .../components/books/books-list.component.ts | 15 +- .../components/games/games-list.component.ts | 12 +- .../components/manga/manga-list.component.ts | 12 +- .../components/music/music-list.component.ts | 12 +- .../components/shows/shows-list.component.ts | 12 +- .../src/app/interceptors/auth.interceptor.ts | 8 +- apps/frontend/src/app/services/art.service.ts | 5 +- .../frontend/src/app/services/auth.service.ts | 12 +- .../src/app/services/books.service.ts | 5 +- .../src/app/services/comments.service.ts | 5 +- .../src/app/services/games.service.ts | 5 +- .../src/app/services/manga.service.ts | 5 +- .../src/app/services/music.service.ts | 5 +- .../src/app/services/shows.service.ts | 5 +- shared-types/src/index.ts | 22 +- shared-types/src/lib/art.types.ts | 41 ++-- shared-types/src/lib/audit.types.ts | 104 +++++----- shared-types/src/lib/auth.types.ts | 41 ++-- shared-types/src/lib/book.types.ts | 26 +-- shared-types/src/lib/comment.types.ts | 44 ++-- shared-types/src/lib/common.types.ts | 8 +- shared-types/src/lib/game.types.ts | 26 +-- shared-types/src/lib/like.types.ts | 36 ++-- shared-types/src/lib/manga.types.ts | 25 ++- shared-types/src/lib/music.types.ts | 29 +-- shared-types/src/lib/show.types.ts | 27 +-- shared-types/src/lib/suggestion.types.ts | 191 ++++++++++-------- 46 files changed, 531 insertions(+), 463 deletions(-) create mode 100644 api/src/test-setup.ts diff --git a/api/jest.config.cts b/api/jest.config.cts index 91a829a..b892916 100644 --- a/api/jest.config.cts +++ b/api/jest.config.cts @@ -7,4 +7,5 @@ module.exports = { }, moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../coverage/api', + setupFilesAfterEnv: ['/src/test-setup.ts'], }; diff --git a/api/src/app/app.spec.ts b/api/src/app/app.spec.ts index b6b1947..31c73ce 100644 --- a/api/src/app/app.spec.ts +++ b/api/src/app/app.spec.ts @@ -15,6 +15,6 @@ describe('GET /', () => { url: '/', }); - expect(response.json()).toEqual({ message: 'Hello API' }); + expect(response.json()).toEqual({ version: expect.any(String) }); }); }); diff --git a/api/src/app/app.ts b/api/src/app/app.ts index 37d7d4e..b248ef1 100644 --- a/api/src/app/app.ts +++ b/api/src/app/app.ts @@ -13,8 +13,8 @@ export async function app(fastify: FastifyInstance, opts: AppOptions) { // Log CSRF validation failures if (error.code === 'FST_CSRF_INVALID_TOKEN' || error.code === 'FST_CSRF_MISSING_SECRET') { await AuditService.log({ - action: AuditAction.CSRF_VALIDATION_FAILED, - category: AuditCategory.SECURITY, + action: AuditAction.csrfValidationFailed, + category: AuditCategory.security, details: `CSRF validation failed: ${error.message}, URL: ${request.url}`, success: false, }, request).catch(() => { @@ -25,8 +25,8 @@ export async function app(fastify: FastifyInstance, opts: AppOptions) { // Log unauthorized access attempts if (error.statusCode === 401 || error.statusCode === 403) { await AuditService.log({ - action: AuditAction.UNAUTHORIZED_ACCESS, - category: AuditCategory.SECURITY, + action: AuditAction.unauthorizedAccess, + category: AuditCategory.security, details: `Unauthorized access attempt: ${error.message}, URL: ${request.url}`, success: false, }, request).catch(() => { diff --git a/api/src/app/plugins/auth.ts b/api/src/app/plugins/auth.ts index c3929bb..4843b37 100644 --- a/api/src/app/plugins/auth.ts +++ b/api/src/app/plugins/auth.ts @@ -82,7 +82,9 @@ const authPlugin: FastifyPluginAsync = async (app) => { try { await request.jwtVerify(); } catch (err) { - throw app.httpErrors.unauthorized("Invalid token"); + const error = new Error("Invalid token"); + (error as any).statusCode = 401; + throw error; } }); }; diff --git a/api/src/app/plugins/rate-limit.ts b/api/src/app/plugins/rate-limit.ts index 3f2ba5f..8343a14 100644 --- a/api/src/app/plugins/rate-limit.ts +++ b/api/src/app/plugins/rate-limit.ts @@ -17,8 +17,8 @@ const rateLimitPlugin: FastifyPluginAsync = async (app) => { errorResponseBuilder: (request) => { // Log rate limit exceeded event AuditService.log({ - action: AuditAction.RATE_LIMIT_EXCEEDED, - category: AuditCategory.SECURITY, + action: AuditAction.rateLimitExceeded, + category: AuditCategory.security, details: `Rate limit exceeded for URL: ${request.url}`, success: false, }, request).catch(() => { diff --git a/api/src/app/routes/art/index.ts b/api/src/app/routes/art/index.ts index 4c32b73..3c24820 100644 --- a/api/src/app/routes/art/index.ts +++ b/api/src/app/routes/art/index.ts @@ -46,8 +46,8 @@ const artRoutes: FastifyPluginAsync = async (app) => { async (request) => { const art = await artService.createArt(request.body); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryCreate, + category: AuditCategory.content, resourceType: "art", resourceId: art.id, details: `Created art: ${art.title}`, @@ -74,8 +74,8 @@ const artRoutes: FastifyPluginAsync = async (app) => { const art = await artService.updateArt(id, request.body); if (art) { await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryUpdate, + category: AuditCategory.content, resourceType: "art", resourceId: id, details: `Updated art: ${art.title}`, @@ -98,8 +98,8 @@ const artRoutes: FastifyPluginAsync = async (app) => { const { id } = request.params; await artService.deleteArt(id); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_DELETE, - category: AuditCategory.CONTENT, + action: AuditAction.entryDelete, + category: AuditCategory.content, resourceType: "art", resourceId: id, details: `Deleted art with ID: ${id}`, @@ -133,8 +133,8 @@ const artRoutes: FastifyPluginAsync = async (app) => { const userId = request.user.id; const comment = await commentService.createCommentForArt(id, userId, request.body); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentCreate, + category: AuditCategory.content, resourceType: "art", resourceId: id, details: `Added comment to art`, @@ -169,8 +169,8 @@ const artRoutes: FastifyPluginAsync = async (app) => { const comment = await commentService.updateComment(commentId, request.body.content); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentUpdate, + category: AuditCategory.content, resourceType: "art", resourceId: id, details: `Updated comment ${commentId} on art`, @@ -205,8 +205,8 @@ const artRoutes: FastifyPluginAsync = async (app) => { await commentService.deleteComment(commentId); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_DELETE, - category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.ADMIN : AuditCategory.CONTENT, + action: AuditAction.commentDelete, + category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.admin : AuditCategory.content, resourceType: "art", resourceId: id, details: `Deleted comment ${commentId} from art`, diff --git a/api/src/app/routes/auth/index.ts b/api/src/app/routes/auth/index.ts index d666cf8..3bdadb9 100644 --- a/api/src/app/routes/auth/index.ts +++ b/api/src/app/routes/auth/index.ts @@ -85,8 +85,8 @@ const authRoutes: FastifyPluginAsync = async (app) => { // Log successful login await AuditService.log({ - action: AuditAction.LOGIN, - category: AuditCategory.AUTH, + action: AuditAction.login, + category: AuditCategory.auth, userId: user.id, details: `User ${user.username} logged in via Discord`, success: true, @@ -114,8 +114,8 @@ const authRoutes: FastifyPluginAsync = async (app) => { } catch (error) { // Log failed login attempt await AuditService.log({ - action: AuditAction.LOGIN_FAILED, - category: AuditCategory.SECURITY, + action: AuditAction.loginFailed, + category: AuditCategory.security, details: error instanceof Error ? error.message : String(error), success: false, }, request); @@ -229,8 +229,8 @@ const authRoutes: FastifyPluginAsync = async (app) => { const user = request.user as { id?: string; username?: string }; if (user?.id) { await AuditService.log({ - action: AuditAction.LOGOUT, - category: AuditCategory.AUTH, + action: AuditAction.logout, + category: AuditCategory.auth, userId: user.id, details: `User ${user.username ?? "unknown"} logged out`, success: true, diff --git a/api/src/app/routes/books/index.ts b/api/src/app/routes/books/index.ts index 5e8a818..f22cfa2 100644 --- a/api/src/app/routes/books/index.ts +++ b/api/src/app/routes/books/index.ts @@ -46,8 +46,8 @@ const booksRoutes: FastifyPluginAsync = async (app) => { async (request) => { const book = await bookService.createBook(request.body); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryCreate, + category: AuditCategory.content, resourceType: "book", resourceId: book.id, details: `Created book: ${book.title}`, @@ -74,8 +74,8 @@ const booksRoutes: FastifyPluginAsync = async (app) => { const book = await bookService.updateBook(id, request.body); if (book) { await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryUpdate, + category: AuditCategory.content, resourceType: "book", resourceId: id, details: `Updated book: ${book.title}`, @@ -98,8 +98,8 @@ const booksRoutes: FastifyPluginAsync = async (app) => { const { id } = request.params; await bookService.deleteBook(id); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_DELETE, - category: AuditCategory.CONTENT, + action: AuditAction.entryDelete, + category: AuditCategory.content, resourceType: "book", resourceId: id, details: `Deleted book with ID: ${id}`, @@ -133,8 +133,8 @@ const booksRoutes: FastifyPluginAsync = async (app) => { const userId = request.user.id; const comment = await commentService.createCommentForBook(id, userId, request.body); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentCreate, + category: AuditCategory.content, resourceType: "book", resourceId: id, details: `Added comment to book`, @@ -169,8 +169,8 @@ const booksRoutes: FastifyPluginAsync = async (app) => { const comment = await commentService.updateComment(commentId, request.body.content); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentUpdate, + category: AuditCategory.content, resourceType: "book", resourceId: id, details: `Updated comment ${commentId} on book`, @@ -205,8 +205,8 @@ const booksRoutes: FastifyPluginAsync = async (app) => { await commentService.deleteComment(commentId); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_DELETE, - category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.ADMIN : AuditCategory.CONTENT, + action: AuditAction.commentDelete, + category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.admin : AuditCategory.content, resourceType: "book", resourceId: id, details: `Deleted comment ${commentId} from book`, diff --git a/api/src/app/routes/games/index.ts b/api/src/app/routes/games/index.ts index 5b5b66a..53e2e15 100644 --- a/api/src/app/routes/games/index.ts +++ b/api/src/app/routes/games/index.ts @@ -40,8 +40,8 @@ const gamesRoutes: FastifyPluginAsync = async (app) => { async (request) => { const game = await gameService.createGame(request.body); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryCreate, + category: AuditCategory.content, resourceType: "game", resourceId: game.id, details: `Created game: ${game.title}`, @@ -66,8 +66,8 @@ const gamesRoutes: FastifyPluginAsync = async (app) => { const game = await gameService.updateGame(id, request.body); if (game) { await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryUpdate, + category: AuditCategory.content, resourceType: "game", resourceId: id, details: `Updated game: ${game.title}`, @@ -88,8 +88,8 @@ const gamesRoutes: FastifyPluginAsync = async (app) => { const { id } = request.params; await gameService.deleteGame(id); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_DELETE, - category: AuditCategory.CONTENT, + action: AuditAction.entryDelete, + category: AuditCategory.content, resourceType: "game", resourceId: id, details: `Deleted game with ID: ${id}`, @@ -119,8 +119,8 @@ const gamesRoutes: FastifyPluginAsync = async (app) => { const userId = request.user.id; const comment = await commentService.createCommentForGame(id, userId, request.body); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentCreate, + category: AuditCategory.content, resourceType: "game", resourceId: id, details: `Added comment to game`, @@ -153,8 +153,8 @@ const gamesRoutes: FastifyPluginAsync = async (app) => { const comment = await commentService.updateComment(commentId, request.body.content); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentUpdate, + category: AuditCategory.content, resourceType: "game", resourceId: id, details: `Updated comment ${commentId} on game`, @@ -187,8 +187,8 @@ const gamesRoutes: FastifyPluginAsync = async (app) => { await commentService.deleteComment(commentId); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_DELETE, - category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.ADMIN : AuditCategory.CONTENT, + action: AuditAction.commentDelete, + category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.admin : AuditCategory.content, resourceType: "game", resourceId: id, details: `Deleted comment ${commentId} from game`, diff --git a/api/src/app/routes/manga/index.ts b/api/src/app/routes/manga/index.ts index 1f46d63..3909744 100644 --- a/api/src/app/routes/manga/index.ts +++ b/api/src/app/routes/manga/index.ts @@ -37,8 +37,8 @@ const mangaRoutes: FastifyPluginAsync = async (app) => { async (request) => { const manga = await mangaService.createManga(request.body); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryCreate, + category: AuditCategory.content, resourceType: "manga", resourceId: manga.id, details: `Created manga: ${manga.title}`, @@ -62,8 +62,8 @@ const mangaRoutes: FastifyPluginAsync = async (app) => { const manga = await mangaService.updateManga(id, request.body); if (manga) { await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryUpdate, + category: AuditCategory.content, resourceType: "manga", resourceId: id, details: `Updated manga: ${manga.title}`, @@ -83,8 +83,8 @@ const mangaRoutes: FastifyPluginAsync = async (app) => { const { id } = request.params; await mangaService.deleteManga(id); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_DELETE, - category: AuditCategory.CONTENT, + action: AuditAction.entryDelete, + category: AuditCategory.content, resourceType: "manga", resourceId: id, details: `Deleted manga with ID: ${id}`, @@ -112,8 +112,8 @@ const mangaRoutes: FastifyPluginAsync = async (app) => { const userId = request.user.id; const comment = await commentService.createCommentForManga(id, userId, request.body); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentCreate, + category: AuditCategory.content, resourceType: "manga", resourceId: id, details: `Added comment to manga`, @@ -145,8 +145,8 @@ const mangaRoutes: FastifyPluginAsync = async (app) => { const comment = await commentService.updateComment(commentId, request.body.content); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentUpdate, + category: AuditCategory.content, resourceType: "manga", resourceId: id, details: `Updated comment ${commentId} on manga`, @@ -178,8 +178,8 @@ const mangaRoutes: FastifyPluginAsync = async (app) => { await commentService.deleteComment(commentId); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_DELETE, - category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.ADMIN : AuditCategory.CONTENT, + action: AuditAction.commentDelete, + category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.admin : AuditCategory.content, resourceType: "manga", resourceId: id, details: `Deleted comment ${commentId} from manga`, diff --git a/api/src/app/routes/music/index.ts b/api/src/app/routes/music/index.ts index eae0662..5f63553 100644 --- a/api/src/app/routes/music/index.ts +++ b/api/src/app/routes/music/index.ts @@ -46,8 +46,8 @@ const musicRoutes: FastifyPluginAsync = async (app) => { async (request) => { const music = await musicService.createMusic(request.body); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryCreate, + category: AuditCategory.content, resourceType: "music", resourceId: music.id, details: `Created music: ${music.title}`, @@ -74,8 +74,8 @@ const musicRoutes: FastifyPluginAsync = async (app) => { const music = await musicService.updateMusic(id, request.body); if (music) { await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryUpdate, + category: AuditCategory.content, resourceType: "music", resourceId: id, details: `Updated music: ${music.title}`, @@ -98,8 +98,8 @@ const musicRoutes: FastifyPluginAsync = async (app) => { const { id } = request.params; await musicService.deleteMusic(id); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_DELETE, - category: AuditCategory.CONTENT, + action: AuditAction.entryDelete, + category: AuditCategory.content, resourceType: "music", resourceId: id, details: `Deleted music with ID: ${id}`, @@ -133,8 +133,8 @@ const musicRoutes: FastifyPluginAsync = async (app) => { const userId = request.user.id; const comment = await commentService.createCommentForMusic(id, userId, request.body); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentCreate, + category: AuditCategory.content, resourceType: "music", resourceId: id, details: `Added comment to music`, @@ -169,8 +169,8 @@ const musicRoutes: FastifyPluginAsync = async (app) => { const comment = await commentService.updateComment(commentId, request.body.content); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentUpdate, + category: AuditCategory.content, resourceType: "music", resourceId: id, details: `Updated comment ${commentId} on music`, @@ -205,8 +205,8 @@ const musicRoutes: FastifyPluginAsync = async (app) => { await commentService.deleteComment(commentId); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_DELETE, - category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.ADMIN : AuditCategory.CONTENT, + action: AuditAction.commentDelete, + category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.admin : AuditCategory.content, resourceType: "music", resourceId: id, details: `Deleted comment ${commentId} from music`, diff --git a/api/src/app/routes/shows/index.ts b/api/src/app/routes/shows/index.ts index 2512ea3..a41c422 100644 --- a/api/src/app/routes/shows/index.ts +++ b/api/src/app/routes/shows/index.ts @@ -37,8 +37,8 @@ const showsRoutes: FastifyPluginAsync = async (app) => { async (request) => { const show = await showService.createShow(request.body); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryCreate, + category: AuditCategory.content, resourceType: "show", resourceId: show.id, details: `Created show: ${show.title}`, @@ -62,8 +62,8 @@ const showsRoutes: FastifyPluginAsync = async (app) => { const show = await showService.updateShow(id, request.body); if (show) { await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryUpdate, + category: AuditCategory.content, resourceType: "show", resourceId: id, details: `Updated show: ${show.title}`, @@ -83,8 +83,8 @@ const showsRoutes: FastifyPluginAsync = async (app) => { const { id } = request.params; await showService.deleteShow(id); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_DELETE, - category: AuditCategory.CONTENT, + action: AuditAction.entryDelete, + category: AuditCategory.content, resourceType: "show", resourceId: id, details: `Deleted show with ID: ${id}`, @@ -112,8 +112,8 @@ const showsRoutes: FastifyPluginAsync = async (app) => { const userId = request.user.id; const comment = await commentService.createCommentForShow(id, userId, request.body); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentCreate, + category: AuditCategory.content, resourceType: "show", resourceId: id, details: `Added comment to show`, @@ -145,8 +145,8 @@ const showsRoutes: FastifyPluginAsync = async (app) => { const comment = await commentService.updateComment(commentId, request.body.content); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_UPDATE, - category: AuditCategory.CONTENT, + action: AuditAction.commentUpdate, + category: AuditCategory.content, resourceType: "show", resourceId: id, details: `Updated comment ${commentId} on show`, @@ -178,8 +178,8 @@ const showsRoutes: FastifyPluginAsync = async (app) => { await commentService.deleteComment(commentId); await AuditService.logFromRequest(request, { - action: AuditAction.COMMENT_DELETE, - category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.ADMIN : AuditCategory.CONTENT, + action: AuditAction.commentDelete, + category: isAdmin && verification.comment?.userId !== userId ? AuditCategory.admin : AuditCategory.content, resourceType: "show", resourceId: id, details: `Deleted comment ${commentId} from show`, diff --git a/api/src/app/routes/suggestions/index.ts b/api/src/app/routes/suggestions/index.ts index 35d04cc..569deb4 100644 --- a/api/src/app/routes/suggestions/index.ts +++ b/api/src/app/routes/suggestions/index.ts @@ -85,8 +85,8 @@ export default async function (app: FastifyInstance): Promise { ); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_CREATE, - category: AuditCategory.CONTENT, + action: AuditAction.entryCreate, + category: AuditCategory.content, resourceType: "Suggestion", resourceId: suggestion.id, details: `Created ${suggestion.entityType} suggestion: ${suggestion.title}`, @@ -115,8 +115,8 @@ export default async function (app: FastifyInstance): Promise { const suggestion = await SuggestionService.acceptSuggestion(id); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.ADMIN, + action: AuditAction.entryUpdate, + category: AuditCategory.admin, resourceType: "Suggestion", resourceId: suggestion.id, details: `Accepted ${suggestion.entityType} suggestion: ${suggestion.title}`, @@ -146,8 +146,8 @@ export default async function (app: FastifyInstance): Promise { const suggestion = await SuggestionService.acceptSuggestionWithEdits(id, editedData); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.ADMIN, + action: AuditAction.entryUpdate, + category: AuditCategory.admin, resourceType: "Suggestion", resourceId: suggestion.id, details: `Accepted ${suggestion.entityType} suggestion with edits: ${suggestion.title}`, @@ -177,8 +177,8 @@ export default async function (app: FastifyInstance): Promise { const suggestion = await SuggestionService.declineSuggestion(id, reason); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_UPDATE, - category: AuditCategory.ADMIN, + action: AuditAction.entryUpdate, + category: AuditCategory.admin, resourceType: "Suggestion", resourceId: suggestion.id, details: `Declined ${suggestion.entityType} suggestion: ${suggestion.title}${reason ? ` (Reason: ${reason})` : ""}`, @@ -209,8 +209,8 @@ export default async function (app: FastifyInstance): Promise { const suggestion = await SuggestionService.deleteSuggestion(id, userId, isAdmin); await AuditService.logFromRequest(request, { - action: AuditAction.ENTRY_DELETE, - category: isAdmin ? AuditCategory.ADMIN : AuditCategory.CONTENT, + action: AuditAction.entryDelete, + category: isAdmin ? AuditCategory.admin : AuditCategory.content, resourceType: "Suggestion", resourceId: suggestion.id, details: `Deleted ${suggestion.entityType} suggestion: ${suggestion.title}`, diff --git a/api/src/app/routes/users/index.ts b/api/src/app/routes/users/index.ts index 485fd56..710f765 100644 --- a/api/src/app/routes/users/index.ts +++ b/api/src/app/routes/users/index.ts @@ -54,8 +54,8 @@ const usersRoutes: FastifyPluginAsync = async (app) => { } await AuditService.logFromRequest(request, { - action: AuditAction.USER_BAN, - category: AuditCategory.ADMIN, + action: AuditAction.userBan, + category: AuditCategory.admin, targetUserId: id, details: `Banned user: ${user.username}`, }); @@ -78,8 +78,8 @@ const usersRoutes: FastifyPluginAsync = async (app) => { } await AuditService.logFromRequest(request, { - action: AuditAction.USER_UNBAN, - category: AuditCategory.ADMIN, + action: AuditAction.userUnban, + category: AuditCategory.admin, targetUserId: id, details: `Unbanned user: ${user.username}`, }); diff --git a/api/src/app/services/audit.service.ts b/api/src/app/services/audit.service.ts index c45b117..1461692 100644 --- a/api/src/app/services/audit.service.ts +++ b/api/src/app/services/audit.service.ts @@ -36,7 +36,7 @@ export const AuditService = { request: FastifyRequest, data: Omit ) { - const userId = (request.user as { id?: string } | undefined)?.id; + const userId = ((request as any).user as { id?: string } | undefined)?.id; return this.log( { diff --git a/api/src/app/services/like.service.ts b/api/src/app/services/like.service.ts index 8c48d2d..7875836 100644 --- a/api/src/app/services/like.service.ts +++ b/api/src/app/services/like.service.ts @@ -32,8 +32,8 @@ export class LikeService { }); await AuditService.logFromRequest(req, { - action: AuditAction.UNLIKE, - category: AuditCategory.CONTENT, + action: AuditAction.unlike, + category: AuditCategory.content, resourceType: entityType, resourceId: entityId, details: `Unliked ${entityType}` @@ -52,8 +52,8 @@ export class LikeService { }); await AuditService.logFromRequest(req, { - action: AuditAction.LIKE, - category: AuditCategory.CONTENT, + action: AuditAction.like, + category: AuditCategory.content, resourceType: entityType, resourceId: entityId, details: `Liked ${entityType}` diff --git a/api/src/test-setup.ts b/api/src/test-setup.ts new file mode 100644 index 0000000..944fa54 --- /dev/null +++ b/api/src/test-setup.ts @@ -0,0 +1,15 @@ +/** + * @copyright NHCarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +// Set required environment variables for tests +process.env.JWT_SECRET = 'test-secret'; +process.env.DISCORD_CLIENT_ID = 'test-client-id'; +process.env.DISCORD_CLIENT_SECRET = 'test-client-secret'; +process.env.DOMAIN = 'http://localhost:3000'; +process.env.API_URL = 'http://localhost:3000/api'; +process.env.DATABASE_URL = 'postgresql://test:test@localhost:5432/test'; +process.env.BASE_URL = 'http://localhost:4200'; +process.env.NODE_ENV = 'test'; \ No newline at end of file diff --git a/apps/frontend/src/app/components/admin/admin-suggestions.component.ts b/apps/frontend/src/app/components/admin/admin-suggestions.component.ts index 2a7b175..9194581 100644 --- a/apps/frontend/src/app/components/admin/admin-suggestions.component.ts +++ b/apps/frontend/src/app/components/admin/admin-suggestions.component.ts @@ -206,8 +206,8 @@ import { Suggestion, SuggestionStatus, SuggestionEntity } from '@library/shared- } @if (showDeclineModal()) { -