260322:1648 Correct Coresspondence / Doing RFA / Correct CI
CI Pipeline / build (push) Failing after 12m41s
Build and Deploy / deploy (push) Failing after 2m44s

This commit is contained in:
admin
2026-03-22 16:48:12 +07:00
parent e5deedb42e
commit 11984bfa29
683 changed files with 105251 additions and 29068 deletions
@@ -36,11 +36,7 @@ describe('use-correspondence hooks', () => {
it('should generate correct cache keys', () => {
expect(correspondenceKeys.all).toEqual(['correspondences']);
expect(correspondenceKeys.lists()).toEqual(['correspondences', 'list']);
expect(correspondenceKeys.list({ projectId: 1 })).toEqual([
'correspondences',
'list',
{ projectId: 1 },
]);
expect(correspondenceKeys.list({ projectId: 1 })).toEqual(['correspondences', 'list', { projectId: 1 }]);
expect(correspondenceKeys.details()).toEqual(['correspondences', 'detail']);
expect(correspondenceKeys.detail(1)).toEqual(['correspondences', 'detail', 1]);
});
@@ -123,7 +119,7 @@ describe('use-correspondence hooks', () => {
projectId: 1,
typeId: 1,
originatorId: 1,
recipients: []
recipients: [],
});
});
@@ -132,7 +128,7 @@ describe('use-correspondence hooks', () => {
projectId: 1,
typeId: 1,
originatorId: 1,
recipients: []
recipients: [],
});
expect(toast.success).toHaveBeenCalledWith('Correspondence created successfully');
});
@@ -154,7 +150,7 @@ describe('use-correspondence hooks', () => {
projectId: 1,
typeId: 1,
originatorId: 1,
recipients: []
recipients: [],
});
} catch {
// Expected to throw
+1 -6
View File
@@ -1,12 +1,7 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { renderHook, waitFor, act } from '@testing-library/react';
import { createTestQueryClient } from '@/lib/test-utils';
import {
useDrawings,
useDrawing,
useCreateDrawing,
drawingKeys,
} from '../use-drawing';
import { useDrawings, useDrawing, useCreateDrawing, drawingKeys } from '../use-drawing';
import { contractDrawingService } from '@/lib/services/contract-drawing.service';
import { shopDrawingService } from '@/lib/services/shop-drawing.service';
import { toast } from 'sonner';
+2 -12
View File
@@ -1,13 +1,7 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { renderHook, waitFor, act } from '@testing-library/react';
import { createTestQueryClient } from '@/lib/test-utils';
import {
useProjects,
useCreateProject,
useUpdateProject,
useDeleteProject,
projectKeys,
} from '../use-projects';
import { useProjects, useCreateProject, useUpdateProject, useDeleteProject, projectKeys } from '../use-projects';
import { projectService } from '@/lib/services/project.service';
import { toast } from 'sonner';
@@ -30,11 +24,7 @@ describe('use-projects hooks', () => {
describe('projectKeys', () => {
it('should generate correct cache keys', () => {
expect(projectKeys.all).toEqual(['projects']);
expect(projectKeys.list({ search: 'test' })).toEqual([
'projects',
'list',
{ search: 'test' },
]);
expect(projectKeys.list({ search: 'test' })).toEqual(['projects', 'list', { search: 'test' }]);
expect(projectKeys.detail(1)).toEqual(['projects', 'detail', 1]);
});
});
+3 -10
View File
@@ -1,14 +1,7 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { renderHook, waitFor, act } from '@testing-library/react';
import { createTestQueryClient } from '@/lib/test-utils';
import {
useRFAs,
useRFA,
useCreateRFA,
useUpdateRFA,
useProcessRFA,
rfaKeys,
} from '../use-rfa';
import { useRFAs, useRFA, useCreateRFA, useUpdateRFA, useProcessRFA, rfaKeys } from '../use-rfa';
import { rfaService } from '@/lib/services/rfa.service';
import { toast } from 'sonner';
@@ -111,7 +104,7 @@ describe('use-rfa hooks', () => {
projectId: 1,
subject: 'Test RFA',
rfaTypeId: 1,
toOrganizationId: 1
toOrganizationId: 1,
});
});
@@ -135,7 +128,7 @@ describe('use-rfa hooks', () => {
projectId: 1,
subject: '',
rfaTypeId: 1,
toOrganizationId: 1
toOrganizationId: 1,
});
} catch {
// Expected
+2 -13
View File
@@ -1,14 +1,7 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { renderHook, waitFor, act } from '@testing-library/react';
import { createTestQueryClient } from '@/lib/test-utils';
import {
useUsers,
useRoles,
useCreateUser,
useUpdateUser,
useDeleteUser,
userKeys,
} from '../use-users';
import { useUsers, useRoles, useCreateUser, useUpdateUser, useDeleteUser, userKeys } from '../use-users';
import { userService } from '@/lib/services/user.service';
import { toast } from 'sonner';
@@ -32,11 +25,7 @@ describe('use-users hooks', () => {
describe('userKeys', () => {
it('should generate correct cache keys', () => {
expect(userKeys.all).toEqual(['users']);
expect(userKeys.list({ search: 'john' })).toEqual([
'users',
'list',
{ search: 'john' },
]);
expect(userKeys.list({ search: 'john' })).toEqual(['users', 'list', { search: 'john' }]);
expect(userKeys.detail(1)).toEqual(['users', 'detail', 1]);
});
});
-1
View File
@@ -128,4 +128,3 @@ export function useProcessWorkflow() {
},
});
}
+23 -6
View File
@@ -2,9 +2,21 @@ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { contractDrawingService } from '@/lib/services/contract-drawing.service';
import { shopDrawingService } from '@/lib/services/shop-drawing.service';
import { asBuiltDrawingService } from '@/lib/services/asbuilt-drawing.service';
import { SearchContractDrawingDto, CreateContractDrawingDto, UpdateContractDrawingDto } from '@/types/dto/drawing/contract-drawing.dto';
import { SearchShopDrawingDto, CreateShopDrawingDto, CreateShopDrawingRevisionDto } from '@/types/dto/drawing/shop-drawing.dto';
import { SearchAsBuiltDrawingDto, CreateAsBuiltDrawingDto, CreateAsBuiltDrawingRevisionDto } from '@/types/dto/drawing/asbuilt-drawing.dto';
import {
SearchContractDrawingDto,
CreateContractDrawingDto,
UpdateContractDrawingDto,
} from '@/types/dto/drawing/contract-drawing.dto';
import {
SearchShopDrawingDto,
CreateShopDrawingDto,
CreateShopDrawingRevisionDto,
} from '@/types/dto/drawing/shop-drawing.dto';
import {
SearchAsBuiltDrawingDto,
CreateAsBuiltDrawingDto,
CreateAsBuiltDrawingRevisionDto,
} from '@/types/dto/drawing/asbuilt-drawing.dto';
import { toast } from 'sonner';
import { ContractDrawing, ShopDrawing, AsBuiltDrawing } from '@/types/drawing';
@@ -23,8 +35,7 @@ export const drawingKeys = {
// --- Queries ---
export function useDrawings(type: DrawingType, params: DrawingSearchParams) {
const shouldEnable =
'projectUuid' in params ? Boolean(params.projectUuid) : true;
const shouldEnable = 'projectUuid' in params ? Boolean(params.projectUuid) : true;
return useQuery({
queryKey: drawingKeys.list(type, params),
@@ -147,7 +158,13 @@ export function useUpdateContractDrawing() {
export function useUploadRevision(type: DrawingType) {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async ({ uuid, data }: { uuid: string; data: CreateShopDrawingRevisionDto | CreateAsBuiltDrawingRevisionDto }) => {
mutationFn: async ({
uuid,
data,
}: {
uuid: string;
data: CreateShopDrawingRevisionDto | CreateAsBuiltDrawingRevisionDto;
}) => {
if (type === 'SHOP') {
return shopDrawingService.createRevision(uuid, data as CreateShopDrawingRevisionDto);
} else {
+2 -2
View File
@@ -25,7 +25,7 @@ export function useMarkNotificationRead() {
queryClient.invalidateQueries({ queryKey: notificationKeys.unread() });
},
onError: () => {
toast.error("Failed to mark notification as read");
}
toast.error('Failed to mark notification as read');
},
});
}
+2 -1
View File
@@ -75,7 +75,8 @@ export const useCancelNumbering = () => {
export const useBulkImportNumbering = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: FormData | { documentNumber: string; projectId: number; sequenceNumber: number }[]) => documentNumberingService.bulkImport(data),
mutationFn: (data: FormData | { documentNumber: string; projectId: number; sequenceNumber: number }[]) =>
documentNumberingService.bulkImport(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: numberingKeys.all });
},
+12 -12
View File
@@ -22,14 +22,14 @@ export function useCreateProject() {
return useMutation({
mutationFn: (data: CreateProjectDto) => projectService.create(data),
onSuccess: () => {
toast.success("Project created successfully");
toast.success('Project created successfully');
queryClient.invalidateQueries({ queryKey: projectKeys.all });
},
onError: (error: unknown) => {
toast.error("Failed to create project", {
description: getApiErrorMessage(error, "Unknown error")
toast.error('Failed to create project', {
description: getApiErrorMessage(error, 'Unknown error'),
});
}
},
});
}
@@ -38,14 +38,14 @@ export function useUpdateProject() {
return useMutation({
mutationFn: ({ uuid, data }: { uuid: string; data: UpdateProjectDto }) => projectService.update(uuid, data),
onSuccess: () => {
toast.success("Project updated successfully");
toast.success('Project updated successfully');
queryClient.invalidateQueries({ queryKey: projectKeys.all });
},
onError: (error: unknown) => {
toast.error("Failed to update project", {
description: getApiErrorMessage(error, "Unknown error")
toast.error('Failed to update project', {
description: getApiErrorMessage(error, 'Unknown error'),
});
}
},
});
}
@@ -54,13 +54,13 @@ export function useDeleteProject() {
return useMutation({
mutationFn: (uuid: string) => projectService.delete(uuid),
onSuccess: () => {
toast.success("Project deleted successfully");
toast.success('Project deleted successfully');
queryClient.invalidateQueries({ queryKey: projectKeys.all });
},
onError: (error: unknown) => {
toast.error("Failed to delete project", {
description: getApiErrorMessage(error, "Unknown error")
toast.error('Failed to delete project', {
description: getApiErrorMessage(error, 'Unknown error'),
});
}
},
});
}
+6 -2
View File
@@ -2,7 +2,10 @@ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { masterDataService } from '@/lib/services/master-data.service';
import type { CreateDisciplineDto } from '@/types/dto/master/discipline.dto';
import type { CreateRfaTypeDto, UpdateRfaTypeDto } from '@/types/dto/master/rfa-type.dto';
import type { CreateCorrespondenceTypeDto, UpdateCorrespondenceTypeDto } from '@/types/dto/master/correspondence-type.dto';
import type {
CreateCorrespondenceTypeDto,
UpdateCorrespondenceTypeDto,
} from '@/types/dto/master/correspondence-type.dto';
export const referenceDataKeys = {
all: ['reference-data'] as const,
@@ -98,7 +101,8 @@ export const useCreateCorrespondenceType = () => {
export const useUpdateCorrespondenceType = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, data }: { id: number; data: UpdateCorrespondenceTypeDto }) => masterDataService.updateCorrespondenceType(id, data),
mutationFn: ({ id, data }: { id: number; data: UpdateCorrespondenceTypeDto }) =>
masterDataService.updateCorrespondenceType(id, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['reference-data', 'correspondenceTypes'] });
},
+2 -4
View File
@@ -55,8 +55,7 @@ export function useUpdateRFA() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ uuid, data }: { uuid: string; data: UpdateRfaDto }) =>
rfaService.update(uuid, data),
mutationFn: ({ uuid, data }: { uuid: string; data: UpdateRfaDto }) => rfaService.update(uuid, data),
onSuccess: (_, { uuid }) => {
toast.success('RFA updated successfully');
queryClient.invalidateQueries({ queryKey: rfaKeys.detail(uuid) });
@@ -74,8 +73,7 @@ export function useProcessRFA() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ uuid, data }: { uuid: string; data: WorkflowActionDto }) =>
rfaService.processWorkflow(uuid, data),
mutationFn: ({ uuid, data }: { uuid: string; data: WorkflowActionDto }) => rfaService.processWorkflow(uuid, data),
onSuccess: (_, { uuid }) => {
toast.success('Workflow status updated successfully');
queryClient.invalidateQueries({ queryKey: rfaKeys.detail(uuid) });
+15 -15
View File
@@ -29,14 +29,14 @@ export function useCreateUser() {
return useMutation({
mutationFn: (data: CreateUserDto) => userService.create(data),
onSuccess: () => {
toast.success("User created successfully");
toast.success('User created successfully');
queryClient.invalidateQueries({ queryKey: userKeys.all });
},
onError: (error: unknown) => {
toast.error("Failed to create user", {
description: getApiErrorMessage(error, "Unknown error")
});
}
toast.error('Failed to create user', {
description: getApiErrorMessage(error, 'Unknown error'),
});
},
});
}
@@ -45,14 +45,14 @@ export function useUpdateUser() {
return useMutation({
mutationFn: ({ uuid, data }: { uuid: string; data: UpdateUserDto }) => userService.update(uuid, data),
onSuccess: () => {
toast.success("User updated successfully");
toast.success('User updated successfully');
queryClient.invalidateQueries({ queryKey: userKeys.all });
},
onError: (error: unknown) => {
toast.error("Failed to update user", {
description: getApiErrorMessage(error, "Unknown error")
});
}
toast.error('Failed to update user', {
description: getApiErrorMessage(error, 'Unknown error'),
});
},
});
}
@@ -61,13 +61,13 @@ export function useDeleteUser() {
return useMutation({
mutationFn: (uuid: string) => userService.delete(uuid),
onSuccess: () => {
toast.success("User deleted successfully");
toast.success('User deleted successfully');
queryClient.invalidateQueries({ queryKey: userKeys.all });
},
onError: (error: unknown) => {
toast.error("Failed to delete user", {
description: getApiErrorMessage(error, "Unknown error")
});
}
toast.error('Failed to delete user', {
description: getApiErrorMessage(error, 'Unknown error'),
});
},
});
}