"use server"; import { serverFetchString, serverFetchWithNoContent, serverFetchJson } from "@/app/utils/fetchUtil"; import { BASE_API_URL } from "@/config/api"; import { revalidateTag } from "next/cache"; import { WarehouseResult, StockTakeSectionInfo } from "./index"; import { cache } from "react"; export interface WarehouseInputs { code?: string; name?: string; description?: string; capacity?: number; store_id?: string; warehouse?: string; area?: string; slot?: string; order?: string; stockTakeSection?: string; stockTakeSectionDescription?: string; } export const fetchWarehouseDetail = cache(async (id: number) => { return serverFetchJson(`${BASE_API_URL}/warehouse/${id}`, { next: { tags: ["warehouse"] }, }); }); export const createWarehouse = async (data: WarehouseInputs) => { const newWarehouse = await serverFetchWithNoContent(`${BASE_API_URL}/warehouse/save`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }); revalidateTag("warehouse"); return newWarehouse; }; export const editWarehouse = async (id: number, data: WarehouseInputs) => { // Backend uses the same /warehouse/save POST endpoint for both create and update, // distinguished by presence of id in the payload. const updatedWarehouse = await serverFetchWithNoContent(`${BASE_API_URL}/warehouse/save`, { method: "POST", body: JSON.stringify({ id, ...data }), headers: { "Content-Type": "application/json" }, }); revalidateTag("warehouse"); return updatedWarehouse; }; export const deleteWarehouse = async (id: number) => { try { const result = await serverFetchJson(`${BASE_API_URL}/warehouse/${id}`, { method: "DELETE", headers: { "Content-Type": "application/json" }, }); revalidateTag("warehouse"); return result; } catch (error) { console.error("Error deleting warehouse:", error); revalidateTag("warehouse"); throw error; } }; export const importWarehouse = async (data: FormData) => { const importWarehouse = await serverFetchString( `${BASE_API_URL}/warehouse/import`, { method: "POST", body: data, }, ); return importWarehouse; } export const importNewWarehouse = async (data: FormData) => { const importWarehouse = await serverFetchString( `${BASE_API_URL}/warehouse/importNew`, { method: "POST", body: data, }, ); return importWarehouse; } export const fetchStockTakeSections = cache(async () => { return serverFetchJson(`${BASE_API_URL}/warehouse/stockTakeSections`, { next: { tags: ["warehouse"] }, }); }); export const updateSectionDescription = async (section: string, stockTakeSectionDescription: string | null) => { await serverFetchWithNoContent( `${BASE_API_URL}/warehouse/section/${encodeURIComponent(section)}/description`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ stockTakeSectionDescription }), } ); revalidateTag("warehouse"); }; export const clearWarehouseSection = async (warehouseId: number) => { const result = await serverFetchJson( `${BASE_API_URL}/warehouse/${warehouseId}/clearSection`, { method: "POST" } ); revalidateTag("warehouse"); return result; }; export const getWarehousesBySection = cache(async (stockTakeSection: string) => { const list = await serverFetchJson(`${BASE_API_URL}/warehouse`, { next: { tags: ["warehouse"] }, }); const items = Array.isArray(list) ? list : []; return items.filter((w) => w.stockTakeSection === stockTakeSection); }); export const searchWarehousesForAddToSection = cache(async ( params: { store_id?: string; warehouse?: string; area?: string; slot?: string }, currentSection: string ) => { const list = await serverFetchJson(`${BASE_API_URL}/warehouse`, { next: { tags: ["warehouse"] }, }); const items = Array.isArray(list) ? list : []; const storeId = params.store_id?.trim(); const warehouse = params.warehouse?.trim(); const area = params.area?.trim(); const slot = params.slot?.trim(); return items.filter((w) => { if (w.stockTakeSection != null && w.stockTakeSection !== currentSection) return false; if (!w.code) return true; const parts = w.code.split("-"); if (storeId && parts[0] !== storeId) return false; if (warehouse && parts[1] !== warehouse) return false; if (area && parts[2] !== area) return false; if (slot && parts[3] !== slot) return false; return true; }); });