From ddae60cf4c2fd37617796174523bcd3dbe023067 Mon Sep 17 00:00:00 2001 From: jiwanska0 Date: Wed, 3 Dec 2025 10:32:49 +0100 Subject: [PATCH 1/2] fix: autorUser populated --- server/src/services/admin/admin.service.ts | 11 +++++++++-- .../validators/repositories/comment.schema.ts | 10 +++++----- .../repositories/reports.validator.ts | 18 +++++++++++++----- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/server/src/services/admin/admin.service.ts b/server/src/services/admin/admin.service.ts index 9a4c3a3..5fd184d 100644 --- a/server/src/services/admin/admin.service.ts +++ b/server/src/services/admin/admin.service.ts @@ -51,14 +51,21 @@ export default ({ strapi }: StrapiContext) => { pageSize, _q, ); + const defaultAuthorUserPopulate = getDefaultAuthorPopulate(strapi); const { pagination, results } = await getReportCommentRepository(strapi).findPage({ ...params, - populate: ['related'], + populate: + { + related: { + populate: { + authorUser: defaultAuthorUserPopulate, + } + } + }, }); const reportCommentsIds = results.map((entity) => typeof entity.related === 'object' ? entity.related.id : null).filter(Boolean); - const defaultAuthorUserPopulate = getDefaultAuthorPopulate(strapi); const commentsThreads = await getCommentRepository(strapi).findMany({ where: { threadOf: reportCommentsIds, diff --git a/server/src/validators/repositories/comment.schema.ts b/server/src/validators/repositories/comment.schema.ts index a793a1f..019467f 100644 --- a/server/src/validators/repositories/comment.schema.ts +++ b/server/src/validators/repositories/comment.schema.ts @@ -6,7 +6,7 @@ const fileInfoSchema = z.object({ hash: z.string(), }); -const avatarSchema = z.object({ +export const avatarSchema = z.object({ id: z.number(), ...fileInfoSchema.shape, formats: z @@ -38,10 +38,10 @@ export const dbBaseCommentSchema = z.object({ authorEmail: z.string().email().nullable(), authorAvatar: z.string().nullable(), authorUser: z.union([ - z.string(), - z.object({ - id: z.number(), - username: z.string(), + z.string(), + z.object({ + id: z.number(), + username: z.string(), email: z.string().email(), avatar: avatarSchema, }) diff --git a/server/src/validators/repositories/reports.validator.ts b/server/src/validators/repositories/reports.validator.ts index 12cfa4f..8841dc1 100644 --- a/server/src/validators/repositories/reports.validator.ts +++ b/server/src/validators/repositories/reports.validator.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; -import { dbBaseCommentSchema } from './comment.schema'; - +import { dbBaseCommentSchema, avatarSchema } from './comment.schema'; import { paginationSchema } from './utils'; const relatedSchema = z.object({ @@ -10,10 +9,19 @@ const relatedSchema = z.object({ blocked: z.boolean(), blockedThread: z.boolean(), blockReason: z.string().nullable(), - authorId: z.string(), - authorName: z.string(), - authorEmail: z.string(), + authorId: z.string().nullable(), + authorName: z.string().nullable(), + authorEmail: z.string().nullable(), authorAvatar: z.string().nullable(), + authorUser: z.union([ + z.string(), + z.object({ + id: z.number(), + username: z.string(), + email: z.string().email(), + avatar: avatarSchema, + }) + ]).optional().nullable(), isAdminComment: z.boolean().nullable(), removed: z.boolean().nullable(), approvalStatus: z.string().nullable(), From 2d2620fa72a0fa6ae8f190de6f0fd90ecc13746a Mon Sep 17 00:00:00 2001 From: jiwanska0 Date: Wed, 3 Dec 2025 11:09:10 +0100 Subject: [PATCH 2/2] fix: failed tests fixed --- .../services/__tests__/admin.service.test.ts | 136 ++++++++++-------- 1 file changed, 74 insertions(+), 62 deletions(-) diff --git a/server/src/services/__tests__/admin.service.test.ts b/server/src/services/__tests__/admin.service.test.ts index 24a992c..844c59d 100644 --- a/server/src/services/__tests__/admin.service.test.ts +++ b/server/src/services/__tests__/admin.service.test.ts @@ -41,7 +41,7 @@ describe('admin.service', () => { findMany: jest.fn(), update: jest.fn(), updateMany: jest.fn(), - delete: jest.fn(), + delete: jest.fn(), }; const mockFindOne = jest.fn(); @@ -53,15 +53,16 @@ describe('admin.service', () => { caster(getReportCommentRepository).mockReturnValue(mockReportCommentRepository); }); - const getStrapi = () => caster({ - strapi: { - contentType: jest.fn().mockReturnValue({ attributes: {} }), - contentTypes: {}, - documents: jest.fn().mockReturnValue({ - findOne: mockFindOne, - }), - }, - }); + const getStrapi = () => + caster({ + strapi: { + contentType: jest.fn().mockReturnValue({ attributes: {} }), + contentTypes: {}, + documents: jest.fn().mockReturnValue({ + findOne: mockFindOne, + }), + }, + }); const getService = (strapi: StrapiContext) => adminService(strapi); @@ -73,21 +74,19 @@ describe('admin.service', () => { { id: 1, content: 'Comment 1' }, { id: 2, content: 'Comment 2' }, ]; - const mockRelatedEntities = [ - { uid: 'api::test.test', documentId: '1', title: 'Test 1' }, - ]; + const mockRelatedEntities = [{ uid: 'api::test.test', documentId: '1', title: 'Test 1' }]; mockCommentRepository.findWithCount.mockResolvedValue({ results: mockComments, pagination: { page: 1, pageSize: 10, total: 2 }, }); mockCommonService.findRelatedEntitiesFor.mockResolvedValue(mockRelatedEntities); - mockCommonService.sanitizeCommentEntity.mockImplementation(comment => comment); - mockCommonService.mergeRelatedEntityTo.mockImplementation(comment => comment); + mockCommonService.sanitizeCommentEntity.mockImplementation((comment) => comment); + mockCommonService.mergeRelatedEntityTo.mockImplementation((comment) => comment); - const result = await service.findAll({ - page: 1, - pageSize: 10, + const result = await service.findAll({ + page: 1, + pageSize: 10, orderBy: 'created:DESC', _q: 'test search', }); @@ -133,10 +132,10 @@ describe('admin.service', () => { pagination: { page: 1, pageSize: 10, total: 2 }, }); mockCommentRepository.findMany.mockResolvedValue([]); - mockCommonService.sanitizeCommentEntity.mockImplementation(comment => comment); + mockCommonService.sanitizeCommentEntity.mockImplementation((comment) => comment); - const result = await service.findReports({ - page: 1, + const result = await service.findReports({ + page: 1, pageSize: 10, orderBy: 'custoOrder:DESC', }); @@ -147,7 +146,13 @@ describe('admin.service', () => { orderBy: { custoOrder: 'DESC' }, page: 1, pageSize: 10, - populate: ['related'], + populate: { + related: { + populate: { + authorUser: true, + }, + }, + }, where: { resolved: { $notNull: true, @@ -169,10 +174,10 @@ describe('admin.service', () => { pagination: { page: 1, pageSize: 10, total: 2 }, }); mockCommentRepository.findMany.mockResolvedValue([]); - mockCommonService.sanitizeCommentEntity.mockImplementation(comment => comment); + mockCommonService.sanitizeCommentEntity.mockImplementation((comment) => comment); - const result = await service.findReports({ - page: 1, + const result = await service.findReports({ + page: 1, pageSize: 10, orderBy: 'resolved:ASC', }); @@ -182,7 +187,13 @@ describe('admin.service', () => { orderBy: { resolved: 'ASC' }, page: 1, pageSize: 10, - populate: ['related'], + populate: { + related: { + populate: { + authorUser: true, + }, + }, + }, where: { resolved: { $notNull: true, @@ -196,8 +207,8 @@ describe('admin.service', () => { it('should return comment with its thread', async () => { const strapi = getStrapi(); const service = getService(strapi); - const mockComment = { - id: 1, + const mockComment = { + id: 1, content: 'Test comment', related: 'api::test.test:1', threadOf: null, @@ -205,10 +216,13 @@ describe('admin.service', () => { const mockRelatedEntity = { id: 1, title: 'Test', uid: 'api::test.test' }; mockCommentRepository.findOne.mockResolvedValue(mockComment); - mockCommonService.parseRelationString.mockReturnValue({ uid: 'api::test.test', relatedId: '1' }); + mockCommonService.parseRelationString.mockReturnValue({ + uid: 'api::test.test', + relatedId: '1', + }); mockFindOne.mockResolvedValue(mockRelatedEntity); mockCommonService.findAllInHierarchy.mockResolvedValue([]); - mockCommonService.sanitizeCommentEntity.mockImplementation(comment => comment); + mockCommonService.sanitizeCommentEntity.mockImplementation((comment) => comment); const result = await service.findOneAndThread({ id: 1 }); @@ -239,10 +253,7 @@ describe('admin.service', () => { const result = await service.changeBlockedComment(1); expect(result.blocked).toBe(true); - expect(mockCommonService.updateComment).toHaveBeenCalledWith( - { id: 1 }, - { blocked: true } - ); + expect(mockCommonService.updateComment).toHaveBeenCalledWith({ id: 1 }, { blocked: true }); }); }); @@ -253,13 +264,13 @@ describe('admin.service', () => { const mockComment = { id: 1, blocked: false, blockedThread: false }; mockCommonService.findOne.mockResolvedValue(mockComment); - mockCommonService.updateComment.mockResolvedValue({ - ...mockComment, - blocked: true, - blockedThread: true + mockCommonService.updateComment.mockResolvedValue({ + ...mockComment, + blocked: true, + blockedThread: true, }); mockCommonService.modifiedNestedNestedComments.mockResolvedValue(true); - mockCommonService.sanitizeCommentEntity.mockImplementation(comment => comment); + mockCommonService.sanitizeCommentEntity.mockImplementation((comment) => comment); const result = await service.blockCommentThread(1); @@ -279,7 +290,7 @@ describe('admin.service', () => { ...mockComment, approvalStatus: APPROVAL_STATUS.APPROVED, }); - mockCommonService.sanitizeCommentEntity.mockImplementation(comment => comment); + mockCommonService.sanitizeCommentEntity.mockImplementation((comment) => comment); const result = await service.approveComment(1); @@ -353,11 +364,13 @@ describe('admin.service', () => { mockCommentRepository.findOne.mockResolvedValue(null); - await expect(service.postComment({ - id: 1, - content: 'Admin reply', - author: { id: 1, email: 'admin@test.com' }, - })).rejects.toThrow('Not found'); + await expect( + service.postComment({ + id: 1, + content: 'Admin reply', + author: { id: 1, email: 'admin@test.com' }, + }) + ).rejects.toThrow('Not found'); }); }); @@ -407,7 +420,7 @@ describe('admin.service', () => { ...mockComment, approvalStatus: APPROVAL_STATUS.REJECTED, }); - mockCommonService.sanitizeCommentEntity.mockImplementation(comment => comment); + mockCommonService.sanitizeCommentEntity.mockImplementation((comment) => comment); const result = await service.rejectComment(1); @@ -438,7 +451,7 @@ describe('admin.service', () => { ...mockComment, content: 'Updated content', }); - mockCommonService.sanitizeCommentEntity.mockImplementation(comment => comment); + mockCommonService.sanitizeCommentEntity.mockImplementation((comment) => comment); const result = await service.updateComment({ id: 1, @@ -458,10 +471,12 @@ describe('admin.service', () => { mockCommentRepository.update.mockResolvedValue(null); - await expect(service.updateComment({ - id: 1, - content: 'Updated content', - })).rejects.toThrow('Not found'); + await expect( + service.updateComment({ + id: 1, + content: 'Updated content', + }) + ).rejects.toThrow('Not found'); }); }); @@ -503,16 +518,16 @@ describe('admin.service', () => { it('should throw error when reports have invalid comment relation', async () => { const strapi = getStrapi(); const service = getService(strapi); - const mockReports = [ - { id: 1, related: { id: 1 } }, - ]; + const mockReports = [{ id: 1, related: { id: 1 } }]; mockReportCommentRepository.findMany.mockResolvedValue(mockReports); - await expect(service.resolveCommentMultipleAbuseReports({ - id: 1, - reportIds: [1, 2], - })).rejects.toThrow('At least one of selected reports got invalid comment entity relation'); + await expect( + service.resolveCommentMultipleAbuseReports({ + id: 1, + reportIds: [1, 2], + }) + ).rejects.toThrow('At least one of selected reports got invalid comment entity relation'); }); }); @@ -551,10 +566,7 @@ describe('admin.service', () => { it('should resolve all abuse reports for a comment thread', async () => { const strapi = getStrapi(); const service = getService(strapi); - const mockThreadComments = [ - { id: 2 }, - { id: 3 }, - ]; + const mockThreadComments = [{ id: 2 }, { id: 3 }]; mockCommentRepository.findMany.mockResolvedValue(mockThreadComments); mockReportCommentRepository.updateMany.mockResolvedValue({ count: 3 });