260316:1319 Refactor to NestJS 11 #1
Build and Deploy / deploy (push) Successful in 3m25s

This commit is contained in:
admin
2026-03-16 13:19:01 +07:00
parent 25c50792e7
commit a75ba3105f
5 changed files with 39 additions and 38 deletions
@@ -44,7 +44,7 @@ export default function DisciplinesPage() {
]; ];
const contractOptions = contracts.map((c) => ({ const contractOptions = contracts.map((c) => ({
label: `${c.contractName} (${c.contractNo})`, label: `${c.contractName} (${c.contractCode})`,
value: c.id, value: c.id,
})); }));
@@ -57,7 +57,7 @@ export default function DisciplinesPage() {
queryKey={['disciplines', selectedContractId ?? 'all']} queryKey={['disciplines', selectedContractId ?? 'all']}
fetchFn={() => masterDataService.getDisciplines(selectedContractId ? parseInt(selectedContractId) : undefined)} fetchFn={() => masterDataService.getDisciplines(selectedContractId ? parseInt(selectedContractId) : undefined)}
createFn={(data: Record<string, unknown>) => masterDataService.createDiscipline(data as unknown as Parameters<typeof masterDataService.createDiscipline>[0])} createFn={(data: Record<string, unknown>) => masterDataService.createDiscipline(data as unknown as Parameters<typeof masterDataService.createDiscipline>[0])}
updateFn={(id, data) => Promise.reject('Not implemented yet')} // Update endpoint needs to be verified/added if missing updateFn={(id, data) => Promise.reject('Not implemented yet')}
deleteFn={(id) => masterDataService.deleteDiscipline(id)} deleteFn={(id) => masterDataService.deleteDiscipline(id)}
columns={columns} columns={columns}
filters={ filters={
@@ -73,7 +73,7 @@ export default function DisciplinesPage() {
<SelectItem value="all">All Contracts</SelectItem> <SelectItem value="all">All Contracts</SelectItem>
{contracts.map((c) => ( {contracts.map((c) => (
<SelectItem key={c.id} value={c.id.toString()}> <SelectItem key={c.id} value={c.id.toString()}>
{c.contractName} ({c.contractNo}) {c.contractName} ({c.contractCode})
</SelectItem> </SelectItem>
))} ))}
</SelectContent> </SelectContent>
@@ -48,7 +48,7 @@ export default function RfaTypesPage() {
]; ];
const contractOptions = contracts.map((c) => ({ const contractOptions = contracts.map((c) => ({
label: `${c.contractName} (${c.contractNo})`, label: `${c.contractName} (${c.contractCode})`,
value: c.id, value: c.id,
})); }));
@@ -76,7 +76,7 @@ export default function RfaTypesPage() {
<SelectItem value="all">All Contracts</SelectItem> <SelectItem value="all">All Contracts</SelectItem>
{contracts.map((c) => ( {contracts.map((c) => (
<SelectItem key={c.id} value={c.id.toString()}> <SelectItem key={c.id} value={c.id.toString()}>
{c.contractName} ({c.contractNo}) {c.contractName} ({c.contractCode})
</SelectItem> </SelectItem>
))} ))}
</SelectContent> </SelectContent>
@@ -57,6 +57,7 @@ export default function TagsPage() {
const formatPayload = (data: Record<string, unknown>) => { const formatPayload = (data: Record<string, unknown>) => {
const payload = { ...data }; const payload = { ...data };
// Backend entity uses project_id (underscore) per ADR-017/018 schema
if (!payload.project_id || payload.project_id === "") { if (!payload.project_id || payload.project_id === "") {
payload.project_id = null; payload.project_id = null;
} else { } else {
+22 -22
View File
@@ -125,18 +125,18 @@ export const numberingApi = {
* Get all templates * Get all templates
*/ */
getTemplates: async (): Promise<NumberingTemplate[]> => { getTemplates: async (): Promise<NumberingTemplate[]> => {
const res = await apiClient.get<NumberingTemplate[]>('/admin/document-numbering/templates'); const res = await apiClient.get<any>('/admin/document-numbering/templates');
return res.data; return res.data.data || res.data;
}, },
/** /**
* Get templates for a specific project * Get templates for a specific project
*/ */
getTemplatesByProject: async (projectId: number): Promise<NumberingTemplate[]> => { getTemplatesByProject: async (projectId: number): Promise<NumberingTemplate[]> => {
const res = await apiClient.get<NumberingTemplate[]>( const res = await apiClient.get<any>(
`/admin/document-numbering/templates?projectId=${projectId}` `/admin/document-numbering/templates?projectId=${projectId}`
); );
return res.data; return res.data.data || res.data;
}, },
/** /**
@@ -151,11 +151,11 @@ export const numberingApi = {
* Save (create or update) a template * Save (create or update) a template
*/ */
saveTemplate: async (dto: Partial<NumberingTemplate>): Promise<NumberingTemplate> => { saveTemplate: async (dto: Partial<NumberingTemplate>): Promise<NumberingTemplate> => {
const res = await apiClient.post<NumberingTemplate>( const res = await apiClient.post<any>(
'/admin/document-numbering/templates', '/admin/document-numbering/templates',
dto dto
); );
return res.data; return res.data.data || res.data;
}, },
/** /**
@@ -173,30 +173,30 @@ export const numberingApi = {
* Get audit logs * Get audit logs
*/ */
getAuditLogs: async (limit = 100): Promise<DocumentNumberAudit[]> => { getAuditLogs: async (limit = 100): Promise<DocumentNumberAudit[]> => {
const res = await apiClient.get<DocumentNumberAudit[]>( const res = await apiClient.get<any>(
`/document-numbering/logs/audit?limit=${limit}` `/document-numbering/logs/audit?limit=${limit}`
); );
return res.data; return res.data.data || res.data;
}, },
/** /**
* Get error logs * Get error logs
*/ */
getErrorLogs: async (limit = 100): Promise<DocumentNumberError[]> => { getErrorLogs: async (limit = 100): Promise<DocumentNumberError[]> => {
const res = await apiClient.get<DocumentNumberError[]>( const res = await apiClient.get<any>(
`/document-numbering/logs/errors?limit=${limit}` `/document-numbering/logs/errors?limit=${limit}`
); );
return res.data; return res.data.data || res.data;
}, },
/** /**
* Get metrics (audit + errors combined) * Get metrics (audit + errors combined)
*/ */
getMetrics: async (): Promise<{ audit: DocumentNumberAudit[]; errors: DocumentNumberError[] }> => { getMetrics: async (): Promise<{ audit: DocumentNumberAudit[]; errors: DocumentNumberError[] }> => {
const res = await apiClient.get<{ audit: DocumentNumberAudit[]; errors: DocumentNumberError[] }>( const res = await apiClient.get<any>(
'/admin/document-numbering/metrics' '/admin/document-numbering/metrics'
); );
return res.data; return res.data.data || res.data;
}, },
// ---------------------------------------------------------- // ----------------------------------------------------------
@@ -207,44 +207,44 @@ export const numberingApi = {
* Manually override/set a counter value * Manually override/set a counter value
*/ */
manualOverride: async (dto: ManualOverrideDto): Promise<{ success: boolean; message: string }> => { manualOverride: async (dto: ManualOverrideDto): Promise<{ success: boolean; message: string }> => {
const res = await apiClient.post<{ success: boolean; message: string }>( const res = await apiClient.post<any>(
'/admin/document-numbering/manual-override', '/admin/document-numbering/manual-override',
dto dto
); );
return res.data; return res.data.data || res.data;
}, },
/** /**
* Void a document number and generate replacement * Void a document number and generate replacement
*/ */
voidAndReplace: async (dto: VoidAndReplaceDto): Promise<{ newNumber: string; auditId: number }> => { voidAndReplace: async (dto: VoidAndReplaceDto): Promise<{ newNumber: string; auditId: number }> => {
const res = await apiClient.post<{ newNumber: string; auditId: number }>( const res = await apiClient.post<any>(
'/admin/document-numbering/void-and-replace', '/admin/document-numbering/void-and-replace',
dto dto
); );
return res.data; return res.data.data || res.data;
}, },
/** /**
* Cancel/skip a document number * Cancel/skip a document number
*/ */
cancelNumber: async (dto: CancelNumberDto): Promise<{ success: boolean }> => { cancelNumber: async (dto: CancelNumberDto): Promise<{ success: boolean }> => {
const res = await apiClient.post<{ success: boolean }>( const res = await apiClient.post<any>(
'/admin/document-numbering/cancel', '/admin/document-numbering/cancel',
dto dto
); );
return res.data; return res.data.data || res.data;
}, },
/** /**
* Bulk import counter values * Bulk import counter values
*/ */
bulkImport: async (items: BulkImportItem[]): Promise<{ imported: number; errors: string[] }> => { bulkImport: async (items: BulkImportItem[]): Promise<{ imported: number; errors: string[] }> => {
const res = await apiClient.post<{ imported: number; errors: string[] }>( const res = await apiClient.post<any>(
'/admin/document-numbering/bulk-import', '/admin/document-numbering/bulk-import',
items items
); );
return res.data; return res.data.data || res.data;
}, },
/** /**
@@ -265,8 +265,8 @@ export const numberingApi = {
const url = projectId const url = projectId
? `/document-numbering/sequences?projectId=${projectId}` ? `/document-numbering/sequences?projectId=${projectId}`
: '/document-numbering/sequences'; : '/document-numbering/sequences';
const res = await apiClient.get<NumberSequence[]>(url); const res = await apiClient.get<any>(url);
return res.data; return res.data.data || res.data;
}, },
/** /**
@@ -119,12 +119,12 @@ export const drawingMasterDataService = {
async createContractVolume(data: CreateContractVolumeDto): Promise<ContractVolume> { async createContractVolume(data: CreateContractVolumeDto): Promise<ContractVolume> {
const response = await apiClient.post(`/drawings/master-data/contract/volumes`, data); const response = await apiClient.post(`/drawings/master-data/contract/volumes`, data);
return response.data; return response.data?.data || response.data;
}, },
async updateContractVolume(id: number, data: Partial<CreateContractVolumeDto>): Promise<ContractVolume> { async updateContractVolume(id: number, data: Partial<CreateContractVolumeDto>): Promise<ContractVolume> {
const response = await apiClient.patch(`/drawings/master-data/contract/volumes/${id}`, data); const response = await apiClient.patch(`/drawings/master-data/contract/volumes/${id}`, data);
return response.data; return response.data?.data || response.data;
}, },
async deleteContractVolume(id: number): Promise<void> { async deleteContractVolume(id: number): Promise<void> {
@@ -141,12 +141,12 @@ export const drawingMasterDataService = {
async createContractCategory(data: CreateContractCategoryDto): Promise<ContractCategory> { async createContractCategory(data: CreateContractCategoryDto): Promise<ContractCategory> {
const response = await apiClient.post(`/drawings/master-data/contract/categories`, data); const response = await apiClient.post(`/drawings/master-data/contract/categories`, data);
return response.data; return response.data?.data || response.data;
}, },
async updateContractCategory(id: number, data: Partial<CreateContractCategoryDto>): Promise<ContractCategory> { async updateContractCategory(id: number, data: Partial<CreateContractCategoryDto>): Promise<ContractCategory> {
const response = await apiClient.patch(`/drawings/master-data/contract/categories/${id}`, data); const response = await apiClient.patch(`/drawings/master-data/contract/categories/${id}`, data);
return response.data; return response.data?.data || response.data;
}, },
async deleteContractCategory(id: number): Promise<void> { async deleteContractCategory(id: number): Promise<void> {
@@ -163,7 +163,7 @@ export const drawingMasterDataService = {
async createContractSubCategory(data: CreateContractSubCategoryDto): Promise<ContractSubCategory> { async createContractSubCategory(data: CreateContractSubCategoryDto): Promise<ContractSubCategory> {
const response = await apiClient.post(`/drawings/master-data/contract/sub-categories`, data); const response = await apiClient.post(`/drawings/master-data/contract/sub-categories`, data);
return response.data; return response.data?.data || response.data;
}, },
async updateContractSubCategory( async updateContractSubCategory(
@@ -171,7 +171,7 @@ export const drawingMasterDataService = {
data: Partial<CreateContractSubCategoryDto> data: Partial<CreateContractSubCategoryDto>
): Promise<ContractSubCategory> { ): Promise<ContractSubCategory> {
const response = await apiClient.patch(`/drawings/master-data/contract/sub-categories/${id}`, data); const response = await apiClient.patch(`/drawings/master-data/contract/sub-categories/${id}`, data);
return response.data; return response.data?.data || response.data;
}, },
async deleteContractSubCategory(id: number): Promise<void> { async deleteContractSubCategory(id: number): Promise<void> {
@@ -195,7 +195,7 @@ export const drawingMasterDataService = {
subCategoryId: number; subCategoryId: number;
}): Promise<{ id: number }> { }): Promise<{ id: number }> {
const response = await apiClient.post(`/drawings/master-data/contract/mappings`, data); const response = await apiClient.post(`/drawings/master-data/contract/mappings`, data);
return response.data; return response.data?.data || response.data;
}, },
async deleteContractMapping(id: number): Promise<void> { async deleteContractMapping(id: number): Promise<void> {
@@ -212,12 +212,12 @@ export const drawingMasterDataService = {
async createShopMainCategory(data: CreateShopMainCategoryDto): Promise<ShopMainCategory> { async createShopMainCategory(data: CreateShopMainCategoryDto): Promise<ShopMainCategory> {
const response = await apiClient.post(`/drawings/master-data/shop/main-categories`, data); const response = await apiClient.post(`/drawings/master-data/shop/main-categories`, data);
return response.data; return response.data?.data || response.data;
}, },
async updateShopMainCategory(id: number, data: Partial<CreateShopMainCategoryDto>): Promise<ShopMainCategory> { async updateShopMainCategory(id: number, data: Partial<CreateShopMainCategoryDto>): Promise<ShopMainCategory> {
const response = await apiClient.patch(`/drawings/master-data/shop/main-categories/${id}`, data); const response = await apiClient.patch(`/drawings/master-data/shop/main-categories/${id}`, data);
return response.data; return response.data?.data || response.data;
}, },
async deleteShopMainCategory(id: number): Promise<void> { async deleteShopMainCategory(id: number): Promise<void> {
@@ -234,12 +234,12 @@ export const drawingMasterDataService = {
async createShopSubCategory(data: CreateShopSubCategoryDto): Promise<ShopSubCategory> { async createShopSubCategory(data: CreateShopSubCategoryDto): Promise<ShopSubCategory> {
const response = await apiClient.post(`/drawings/master-data/shop/sub-categories`, data); const response = await apiClient.post(`/drawings/master-data/shop/sub-categories`, data);
return response.data; return response.data?.data || response.data;
}, },
async updateShopSubCategory(id: number, data: Partial<CreateShopSubCategoryDto>): Promise<ShopSubCategory> { async updateShopSubCategory(id: number, data: Partial<CreateShopSubCategoryDto>): Promise<ShopSubCategory> {
const response = await apiClient.patch(`/drawings/master-data/shop/sub-categories/${id}`, data); const response = await apiClient.patch(`/drawings/master-data/shop/sub-categories/${id}`, data);
return response.data; return response.data?.data || response.data;
}, },
async deleteShopSubCategory(id: number): Promise<void> { async deleteShopSubCategory(id: number): Promise<void> {