Files
aeroresolve_frontend/src/app/configuration/masterData/MasterDataApi.ts
T

162 lines
4.9 KiB
TypeScript

import { ApiClient } from '../../api/ApiClient';
import type {
MasterDataCategoryItem,
MasterDataItem,
MasterDataValueFormData,
} from './MasterDataTypes';
// Helper to normalize items so label and value are guaranteed
function normalizeItems(items: any[]): MasterDataItem[] {
if (!Array.isArray(items)) return [];
return items.map((item) => {
const val = item.value || item.label || item.name || item.code || '';
const lbl = item.label || item.value || item.name || item.code || '';
return {
...item,
id: item.id || val,
value: val,
label: lbl,
isActive: item.isActive !== false,
};
});
}
// ─── Lookup Tables & Categories List Endpoint ─────────────────────────────────
export function getLookupTables(): Promise<MasterDataCategoryItem[]> {
return ApiClient.get<any, MasterDataCategoryItem[]>('/master-data/lookup-tables')
.then((res) => (Array.isArray(res) ? res : []))
.catch(() => []);
}
export function getMasterCategories(): Promise<MasterDataCategoryItem[]> {
return getLookupTables()
.then((tables) => {
if (Array.isArray(tables) && tables.length > 0) return tables;
return ApiClient.get<any, MasterDataCategoryItem[]>('/master-data/categories')
.then((res) => (Array.isArray(res) ? res : []))
.catch(() => []);
})
.catch(() => []);
}
// ─── Category Values Endpoint ───────────────────────────────────────────────
export function getCategoryValues(categoryCode: string): Promise<MasterDataItem[]> {
if (!categoryCode) return Promise.resolve([]);
return ApiClient.get<any, any[]>(`/master-data/${categoryCode}`)
.then((res) => normalizeItems(res))
.catch(() => []);
}
// ─── Generic Master Data Item CRUD ──────────────────────────────────────────
export function getMasterDataByCategory(category: string): Promise<MasterDataItem[]> {
return getCategoryValues(category);
}
export function createCategoryValue(
categoryCode: string,
payload: MasterDataValueFormData,
): Promise<MasterDataItem> {
return ApiClient.post<any, MasterDataItem>(`/master-data/${categoryCode}`, {
...payload,
label: payload.value,
});
}
export function updateCategoryValue(
categoryCode: string,
id: string,
payload: Partial<MasterDataValueFormData>,
): Promise<MasterDataItem> {
return ApiClient.put<any, MasterDataItem>(`/master-data/${categoryCode}/${id}`, {
...payload,
label: payload.value || payload.label,
});
}
export function deleteCategoryValue(categoryCode: string, id: string): Promise<void> {
return ApiClient.delete<any, void>(`/master-data/${categoryCode}/${id}`);
}
// ─── Individual Category Helpers for Cohort & Policy Modules ─────────────────
export function getMembershipTiers(): Promise<MasterDataItem[]> {
return getCategoryValues('membership-tier');
}
export function getCustomerValues(): Promise<MasterDataItem[]> {
return getCategoryValues('customer-value');
}
export function getRegions(): Promise<MasterDataItem[]> {
return getCategoryValues('region');
}
export function getTripPurposes(): Promise<MasterDataItem[]> {
return getCategoryValues('trip-purpose');
}
export function getCabinClasses(): Promise<MasterDataItem[]> {
return getCategoryValues('cabin-class');
}
export function getPassengerTypes(): Promise<MasterDataItem[]> {
return getCategoryValues('passenger-type');
}
export function getAncillaryPurchases(): Promise<MasterDataItem[]> {
return getCategoryValues('ancillary-purchase');
}
export function getRevenueSegments(): Promise<MasterDataItem[]> {
return getCategoryValues('revenue-segment');
}
// ─── Fetch All Master Data at Once ──────────────────────────────────────────
export interface AllMasterData {
membershipTiers: MasterDataItem[];
customerValues: MasterDataItem[];
regions: MasterDataItem[];
tripPurposes: MasterDataItem[];
cabinClasses: MasterDataItem[];
passengerTypes: MasterDataItem[];
ancillaryPurchases: MasterDataItem[];
revenueSegments: MasterDataItem[];
}
export async function getAllMasterData(): Promise<AllMasterData> {
const [
membershipTiers,
customerValues,
regions,
tripPurposes,
cabinClasses,
passengerTypes,
ancillaryPurchases,
revenueSegments,
] = await Promise.all([
getMembershipTiers(),
getCustomerValues(),
getRegions(),
getTripPurposes(),
getCabinClasses(),
getPassengerTypes(),
getAncillaryPurchases(),
getRevenueSegments(),
]);
return {
membershipTiers,
customerValues,
regions,
tripPurposes,
cabinClasses,
passengerTypes,
ancillaryPurchases,
revenueSegments,
};
}