import axios, { AxiosInstance, AxiosResponse } from 'axios'; import { GetAssetsQueryParams, GetAssetDetailParams, GetAssetMapParams, GetAssetMapResponse, GetAvailableAssetsQueryParams, GetLinkedAssetFamiliesResponse, } from '@/dto/assets.dto'; import { AssetOptionField } from '@/components/v2/DialogSelectAsset/DialogSelectAsset.vue.d'; import { buildBodyParams } from '@/utils'; import { QueryParams } from '@/components/v2/DataTable/DataTable.vue.d'; export interface ServiceOptions { headers?: Record; params?: Record; usePrefix?: boolean; } export const API = ({ headers = {}, params = {}, usePrefix = true, }: ServiceOptions = {}): AxiosInstance => { const user = JSON.parse(localStorage.getItem('user') ?? '{}'); const BASE_URL = import.meta.env.VITE_APP_TAGSAMURAI_API; const instance = axios.create({ baseURL: `${BASE_URL}/fam/assets/v2${usePrefix ? '/assets' : ''}`, headers: { 'Content-type': 'application/json', 'Authorization': `Bearer ${user.token}`, ...headers, }, params, }); return instance; }; const postAssetList = ( params?: GetAssetsQueryParams, ): Promise => { const body = buildBodyParams(params); return API().post('/list', body); }; const postAssetOption = ( params?: GetAssetsQueryParams, ): Promise => { const body = buildBodyParams(params); return API().post('/list/options', body); }; const getAllAssets = (params: GetAssetsQueryParams): Promise => { return API({ params }).get('/'); }; /** * @deprecated - use postAssetAvailableList instead */ const getAvailableAssets = ( params: GetAvailableAssetsQueryParams, ): Promise => { return API({ params }).get('/available'); }; const postAssetAvailableList = ( params?: GetAssetsQueryParams | GetAvailableAssetsQueryParams, ): Promise => { const body = buildBodyParams(params); return API().post('/available/list', body); }; const scanAsset = (tag: string): Promise => { return API({ params: { tag } }).get(''); }; /** * @deprecated - Replaced with postAssetsList */ const getAssetsById = ( _id: string, params: GetAvailableAssetsQueryParams, ): Promise => { return API({ params: { _id, ...params } }).get('/by-id'); }; const postAvailableListOptions = ( params?: QueryParams, ): Promise => { const body = buildBodyParams(params); return API().post('/available/list/options', body); }; const getOptions = ( endpoint?: 'unlinked' | 'by-id', params?: Partial> & { group?: string; excludeId?: string; mode?: string; // For unlinked }, ): Promise => { return API({ params }).get(endpoint ? `/${endpoint}/options` : '/options'); }; const getUnlinkedAssets = ( params: GetAvailableAssetsQueryParams, ): Promise => { return API({ params }).get('/unlinked'); }; const getAssetDetail = ( id: string, params?: GetAssetDetailParams, ): Promise => { return API({ params }).get(`/${id}`); }; const getLinkedAssetFamily = ( id?: string, ): Promise> => { return API({ params: { id } }).get('/family'); }; /** * @deprecated - Replaced with postAssetsList */ const matchAssetWithTag = ( id: string, tag?: string, ): Promise => { const params = { _id: JSON.stringify([id]), tag, }; return API({ params }).get('/by-id'); }; const getAssetMaps = ( params?: GetAssetMapParams, ): Promise> => { let abortController: AbortController | null = null; // Cancel previous request if (abortController) { (abortController as AbortController).abort(); } abortController = new AbortController(); return API({ usePrefix: false, params: params as Record, }).get('/asset-maps', { signal: abortController.signal }); }; const printLabel = (assets: string[]): Promise => { return API().put('/print-label', { assets }); }; export default { getAllAssets, postAssetList, postAssetOption, getAvailableAssets, postAssetAvailableList, postAvailableListOptions, getAssetsById, getAssetDetail, matchAssetWithTag, getLinkedAssetFamily, getUnlinkedAssets, getOptions, scanAsset, getAssetMaps, printLabel, };