pmtool / src /services /assetItemApi.ts
devarshia5's picture
Upload 487 files
d97b8f9 verified
Raw
History Blame Contribute Delete
3.51 kB
import apiClient from '@/lib/api/axios-instance';
import { AxiosError } from 'axios';
import {
AssetItem,
AssetItemCreateRequest,
AssetItemUpdateRequest,
} from '@/types/asset-management';
// Helper to handle API errors with user-friendly messages
const handleApiError = (error: unknown, operation: string): never => {
console.error(`AssetItemApi: Error during ${operation}:`, error);
if (error instanceof AxiosError) {
const status = error.response?.status;
const message = error.response?.data?.message || error.message;
switch (status) {
case 400:
throw new Error(`Invalid request: ${message}`);
case 401:
throw new Error('You are not authorized to perform this action. Please log in again.');
case 403:
throw new Error('You do not have permission to perform this action.');
case 404:
throw new Error('The requested item was not found.');
case 409:
throw new Error('This item already exists or conflicts with existing data.');
case 422:
throw new Error(`Validation failed: ${message}`);
case 500:
throw new Error('Server error occurred. Please try again later.');
case 503:
throw new Error('Service is temporarily unavailable. Please try again later.');
default:
throw new Error(`${operation} failed: ${message}`);
}
}
throw new Error(`${operation} failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
};
/**
* Asset Item API Service
*/
export const assetItemApi = {
/**
* Get all items for a specific asset
*/
getByAsset: async (assetId: number): Promise<AssetItem[]> => {
try {
const response = await apiClient.get<AssetItem[]>(`/assets/${assetId}/items`);
return response.data || [];
} catch (error) {
handleApiError(error, 'Fetching asset items');
}
},
/**
* Get a single asset item by ID
*/
getById: async (itemId: number): Promise<AssetItem> => {
try {
const response = await apiClient.get<AssetItem>(`/api/AssetItem/${itemId}`);
if (!response.data) {
throw new Error('Item not found');
}
return response.data;
} catch (error) {
handleApiError(error, 'Fetching asset item');
}
},
/**
* Create a new asset item
*/
create: async (item: AssetItemCreateRequest): Promise<AssetItem> => {
try {
const response = await apiClient.post<AssetItem>('/api/AssetItem', item);
if (!response.data) {
throw new Error('Failed to create item');
}
return response.data;
} catch (error) {
handleApiError(error, 'Creating asset item');
}
},
/**
* Update an existing asset item
*/
update: async (itemId: number, item: AssetItemUpdateRequest): Promise<AssetItem> => {
try {
const response = await apiClient.put<AssetItem>(`/api/AssetItem/${itemId}`, item);
if (!response.data) {
throw new Error('Failed to update item');
}
return response.data;
} catch (error) {
handleApiError(error, 'Updating asset item');
}
},
/**
* Delete an asset item
*/
delete: async (itemId: number): Promise<void> => {
try {
await apiClient.delete(`/api/AssetItem/${itemId}`);
} catch (error) {
handleApiError(error, 'Deleting asset item');
}
},
};
export default assetItemApi;