Files
nextjs-elysia-allaos/src/lib/helpers/location-enrichment.ts
phaichayon 043edff93a setup
2026-04-26 00:15:22 +07:00

156 lines
3.7 KiB
TypeScript

import { db } from "@/database/db";
import { locations, type Location } from "@/database/schema/location";
import {
industrialEstates,
type IndustrialEstate,
} from "@/database/schema/industrialEstate";
import { eq } from "drizzle-orm";
/**
* Load location data by ID
* @param locationId - Location ID
* @returns Location data or null
*/
export async function loadLocation(
locationId: string,
): Promise<Location | null> {
const [location] = await db
.select()
.from(locations)
.where(eq(locations.id, locationId))
.limit(1);
return location || null;
}
/**
* Load location data by type and code
* @param code - Location code
* @param type - Location type (country, province, district, subdistrict)
* @returns Location data or null
*/
export async function loadLocationByCode(
code: string,
type: string,
): Promise<Location | null> {
const [location] = await db
.select()
.from(locations)
.where(eq(locations.code, code))
.limit(1);
if (!location || location.type !== type) {
return null;
}
return location;
}
/**
* Load industrial estate by ID
* @param industrialEstateId - Industrial estate ID
* @returns Industrial estate with location data or null
*/
export async function loadIndustrialEstate(
industrialEstateId: string,
): Promise<(IndustrialEstate & { location?: Location | null }) | null> {
const [industrialEstate] = await db
.select()
.from(industrialEstates)
.where(eq(industrialEstates.id, industrialEstateId))
.limit(1);
if (!industrialEstate) {
return null;
}
// Load location data
const location = await loadLocation(industrialEstate.locationId);
return {
...industrialEstate,
location: location || undefined,
};
}
/**
* Load industrial estate by code
* @param code - Industrial estate code
* @returns Industrial estate with location data or null
*/
export async function loadIndustrialEstateByCode(
code: string,
): Promise<(IndustrialEstate & { location?: Location }) | null> {
const [industrialEstate] = await db
.select()
.from(industrialEstates)
.where(eq(industrialEstates.code, code))
.limit(1);
if (!industrialEstate) {
return null;
}
// Load location data
const location = await loadLocation(industrialEstate.locationId);
return {
...industrialEstate,
location,
};
}
/**
* Load location hierarchy data
* Returns full path from country to subdistrict
* @param locationId - Location ID
* @returns Array of locations in hierarchy order (country -> province -> district -> subdistrict)
*/
export async function loadLocationHierarchy(
locationId: string,
): Promise<Location[]> {
const hierarchy: Location[] = [];
let currentLocation = await loadLocation(locationId);
while (currentLocation) {
hierarchy.unshift(currentLocation); // Add to beginning
if (currentLocation.parentId) {
currentLocation = await loadLocation(currentLocation.parentId);
} else {
break;
}
}
return hierarchy;
}
/**
* Enrich quotation with location data
* @param quotation - Quotation object
* @param locationId - Location ID (optional)
* @param industrialEstateId - Industrial estate ID (optional)
* @returns Enriched quotation with location data
*/
export async function enrichQuotationWithLocation(
quotation: any,
locationId?: string,
industrialEstateId?: string,
): Promise<any> {
const enriched = { ...quotation };
// Load industrial estate data
if (industrialEstateId) {
const industrialEstate = await loadIndustrialEstate(industrialEstateId);
enriched.locationIndustrialData = industrialEstate;
}
// Load location data (province)
if (locationId) {
const location = await loadLocation(locationId);
enriched.locationProvinceData = location;
}
return enriched;
}