From 3ea7c05ac78f8f2242d921a7478eaffe3cdad1ab Mon Sep 17 00:00:00 2001 From: Shane <66246046+shanegrouber@users.noreply.github.com> Date: Wed, 12 Feb 2025 16:22:32 +0200 Subject: [PATCH] refactor(documents): update query key naming and structure - Rename documentsQueryKey to documentsQueryKeys for consistency - Adjust import paths for better organization of document hooks - Simplify conditional checks in unit tests for better readability (Your code is cleaner than a whistle, but I still wouldn't recommend using it to clean the house) --- .../hooks/useDocumentTracker.tsx | 4 +- .../domains/documents/{hooks => }/fetchers.ts | 2 +- .../mutations/useRequestDocumentsMutation.tsx | 2 +- .../queries/useDocumentsTrackerItemsQuery.ts | 4 +- .../src/domains/documents/hooks/query-keys.ts | 4 +- .../src/document/document.service.ts | 8 +- .../src/document/document.unit.test.ts | 78 ++++++++----------- 7 files changed, 46 insertions(+), 56 deletions(-) rename apps/backoffice-v2/src/domains/documents/{hooks => }/fetchers.ts (92%) diff --git a/apps/backoffice-v2/src/common/components/molecules/DocumentTracker/hooks/useDocumentTracker.tsx b/apps/backoffice-v2/src/common/components/molecules/DocumentTracker/hooks/useDocumentTracker.tsx index 9494a3cf59..e1785e143d 100644 --- a/apps/backoffice-v2/src/common/components/molecules/DocumentTracker/hooks/useDocumentTracker.tsx +++ b/apps/backoffice-v2/src/common/components/molecules/DocumentTracker/hooks/useDocumentTracker.tsx @@ -5,7 +5,7 @@ import { titleCase } from 'string-ts'; import { useRequestDocumentsMutation } from '@/domains/documents/hooks/mutations/useRequestDocumentsMutation'; import { useDocumentsTrackerItemsQuery } from '@/domains/documents/hooks/queries/useDocumentsTrackerItemsQuery'; -import { documentsQueryKey } from '@/domains/documents/hooks/query-keys'; +import { documentsQueryKeys } from '@/domains/documents/hooks/query-keys'; import { TrackedDocument } from '@/domains/documents/hooks/schemas/document'; import { documentStatusToIcon, Icon } from '../constants'; @@ -22,7 +22,7 @@ export const useDocumentTracker = ({ workflowId }: { workflowId: string }) => { onSuccess: () => { setSelectedIdsToRequest([]); onOpenChange(false); - void queryClient.invalidateQueries(documentsQueryKey.trackerItems({ workflowId })); + void queryClient.invalidateQueries(documentsQueryKeys.trackerItems({ workflowId })); }, }); diff --git a/apps/backoffice-v2/src/domains/documents/hooks/fetchers.ts b/apps/backoffice-v2/src/domains/documents/fetchers.ts similarity index 92% rename from apps/backoffice-v2/src/domains/documents/hooks/fetchers.ts rename to apps/backoffice-v2/src/domains/documents/fetchers.ts index 77ed678b65..70a725b4e6 100644 --- a/apps/backoffice-v2/src/domains/documents/hooks/fetchers.ts +++ b/apps/backoffice-v2/src/domains/documents/fetchers.ts @@ -1,7 +1,7 @@ import { apiClient } from '@/common/api-client/api-client'; import { Method } from '@/common/enums'; import { handleZodError } from '@/common/utils/handle-zod-error/handle-zod-error'; -import { DocumentsTrackerSchema } from './schemas/document'; +import { DocumentsTrackerSchema } from './hooks/schemas/document'; export const fetchDocumentsTrackerItems = async ({ workflowId }: { workflowId: string }) => { const [documentsTrackerItems, error] = await apiClient({ diff --git a/apps/backoffice-v2/src/domains/documents/hooks/mutations/useRequestDocumentsMutation.tsx b/apps/backoffice-v2/src/domains/documents/hooks/mutations/useRequestDocumentsMutation.tsx index 6e36cd915e..0310f31da9 100644 --- a/apps/backoffice-v2/src/domains/documents/hooks/mutations/useRequestDocumentsMutation.tsx +++ b/apps/backoffice-v2/src/domains/documents/hooks/mutations/useRequestDocumentsMutation.tsx @@ -4,7 +4,7 @@ import { t } from 'i18next'; import { toast } from 'sonner'; import { HttpError } from '@/common/errors/http-error'; -import { requestDocumentsUpload } from '../fetchers'; +import { requestDocumentsUpload } from '../../fetchers'; export const useRequestDocumentsMutation = (options?: { onSuccess?: (data: TData) => void; diff --git a/apps/backoffice-v2/src/domains/documents/hooks/queries/useDocumentsTrackerItemsQuery.ts b/apps/backoffice-v2/src/domains/documents/hooks/queries/useDocumentsTrackerItemsQuery.ts index 76332eb749..9d151bc27a 100644 --- a/apps/backoffice-v2/src/domains/documents/hooks/queries/useDocumentsTrackerItemsQuery.ts +++ b/apps/backoffice-v2/src/domains/documents/hooks/queries/useDocumentsTrackerItemsQuery.ts @@ -2,14 +2,14 @@ import { useIsAuthenticated } from '@/domains/auth/context/AuthProvider/hooks/us import { useQuery } from '@tanstack/react-query'; import { useLocation } from 'react-router-dom'; import { titleCase } from 'string-ts'; -import { documentsQueryKey } from '@/domains/documents/hooks/query-keys'; +import { documentsQueryKeys } from '@/domains/documents/hooks/query-keys'; export const useDocumentsTrackerItemsQuery = ({ workflowId }: { workflowId: string }) => { const isAuthenticated = useIsAuthenticated(); const { search, pathname } = useLocation(); return useQuery({ - ...documentsQueryKey.trackerItems({ workflowId }), + ...documentsQueryKeys.trackerItems({ workflowId }), enabled: isAuthenticated, select: data => { return { diff --git a/apps/backoffice-v2/src/domains/documents/hooks/query-keys.ts b/apps/backoffice-v2/src/domains/documents/hooks/query-keys.ts index 50ea0561f6..12bd29ee47 100644 --- a/apps/backoffice-v2/src/domains/documents/hooks/query-keys.ts +++ b/apps/backoffice-v2/src/domains/documents/hooks/query-keys.ts @@ -1,7 +1,7 @@ import { createQueryKeys } from '@lukemorales/query-key-factory'; -import { fetchDocumentsTrackerItems } from '@/domains/documents/hooks/fetchers'; +import { fetchDocumentsTrackerItems } from '@/domains/documents/fetchers'; -export const documentsQueryKey = createQueryKeys('documents', { +export const documentsQueryKeys = createQueryKeys('documents', { trackerItems: ({ workflowId }: { workflowId: string }) => ({ queryKey: ['documents-tracker-items', workflowId], queryFn: () => fetchDocumentsTrackerItems({ workflowId }), diff --git a/services/workflows-service/src/document/document.service.ts b/services/workflows-service/src/document/document.service.ts index 59539f6bbb..6c09947b0c 100644 --- a/services/workflows-service/src/document/document.service.ts +++ b/services/workflows-service/src/document/document.service.ts @@ -276,7 +276,11 @@ export class DocumentService { [projectId], ); - if (!isObject(uiDefinition.uiSchema)) { + const uiSchemaValidation = z + .object({ elements: z.array(z.record(z.string(), z.any())) }) + .safeParse(uiDefinition.uiSchema); + + if (!uiSchemaValidation.success) { return { business: [], individuals: { @@ -286,7 +290,7 @@ export class DocumentService { }; } - const uiSchema = uiDefinition.uiSchema as { elements: Array> }; + const uiSchema = uiSchemaValidation.data; const parsedUIDocuments = this.parseDocumentsFromUISchema(uiSchema.elements); diff --git a/services/workflows-service/src/document/document.unit.test.ts b/services/workflows-service/src/document/document.unit.test.ts index 7fd830bbd7..8e03a65aca 100644 --- a/services/workflows-service/src/document/document.unit.test.ts +++ b/services/workflows-service/src/document/document.unit.test.ts @@ -38,17 +38,15 @@ describe('DocumentService', () => { const businessDoc = result.business[0]; expect(businessDoc).toBeDefined(); - if (businessDoc) { - expect(businessDoc).toEqual({ - entityType: 'business', - type: 'bank_statement', - templateId: 'bank-statement-document', - category: 'financial_information', - issuingCountry: 'ZZ', - issuingVersion: '1', - version: '1', - }); - } + expect(businessDoc).toEqual({ + entityType: 'business', + type: 'bank_statement', + templateId: 'bank-statement-document', + category: 'financial_information', + issuingCountry: 'ZZ', + issuingVersion: '1', + version: '1', + }); }); it('should parse business documents with explicit business destination', () => { @@ -79,17 +77,15 @@ describe('DocumentService', () => { const businessDoc = result.business[0]; expect(businessDoc).toBeDefined(); - if (businessDoc) { - expect(businessDoc).toEqual({ - entityType: 'business', - type: 'general_document', - templateId: 'proof-of-address-document', - category: 'proof_of_address', - issuingCountry: 'ZZ', - issuingVersion: '1', - version: '1', - }); - } + expect(businessDoc).toEqual({ + entityType: 'business', + type: 'general_document', + templateId: 'proof-of-address-document', + category: 'proof_of_address', + issuingCountry: 'ZZ', + issuingVersion: '1', + version: '1', + }); }); }); @@ -122,17 +118,15 @@ describe('DocumentService', () => { const uboDoc = result.individuals.ubos[0]; expect(uboDoc).toBeDefined(); - if (uboDoc) { - expect(uboDoc).toEqual({ - entityType: 'ubo', - type: 'general_document', - templateId: 'proof-of-address-document', - category: 'proof_of_address', - issuingCountry: 'ZZ', - issuingVersion: '1', - version: '1', - }); - } + expect(uboDoc).toEqual({ + entityType: 'ubo', + type: 'general_document', + templateId: 'proof-of-address-document', + category: 'proof_of_address', + issuingCountry: 'ZZ', + issuingVersion: '1', + version: '1', + }); }); it('should handle multiple UBO documents for different UBOs', () => { @@ -179,10 +173,8 @@ describe('DocumentService', () => { expect(firstUbo).toBeDefined(); expect(secondUbo).toBeDefined(); - if (firstUbo && secondUbo) { - expect(firstUbo.issuingCountry).toBe('US'); - expect(secondUbo.issuingCountry).toBe('UK'); - } + expect(firstUbo?.issuingCountry).toBe('US'); + expect(secondUbo?.issuingCountry).toBe('UK'); }); }); @@ -221,9 +213,7 @@ describe('DocumentService', () => { const businessDoc = result.business[0]; expect(businessDoc).toBeDefined(); - if (businessDoc) { - expect(businessDoc.templateId).toBe('pci-certification-document'); - } + expect(businessDoc?.templateId).toBe('pci-certification-document'); }); it('should handle documents with validation rules', () => { @@ -264,9 +254,7 @@ describe('DocumentService', () => { const businessDoc = result.business[0]; expect(businessDoc).toBeDefined(); - if (businessDoc) { - expect(businessDoc.templateId).toBe('proof-of-address-document'); - } + expect(businessDoc?.templateId).toBe('proof-of-address-document'); }); }); @@ -325,9 +313,7 @@ describe('DocumentService', () => { const businessDoc = result.business[0]; expect(businessDoc).toBeDefined(); - if (businessDoc) { - expect(businessDoc.templateId).toBe('nested-doc'); - } + expect(businessDoc?.templateId).toBe('nested-doc'); }); it('should ignore document fields without template params', () => {