1import { NextRequest, NextResponse } from "next/server";
2import { getRequestContext, validateStoreAccess, getStoreApiUrl } from "@/lib/server/sessionUtils";
3import { FieldpineServerApi } from "@/lib/server/fieldpineApi";
6 * GET /api/v1/products/stock-alerts
7 * Get products with low stock levels across locations
8 * Uses OpenAPI Products endpoint (store-specific)
10export async function GET(request: NextRequest) {
12 // Get session and store context
13 const context = await getRequestContext(request);
16 return NextResponse.json(
17 { success: false, error: "Unauthorized" },
22 // Validate this is a retail store (not management portal)
23 const validation = validateStoreAccess(context, 'store');
24 if (!validation.valid) {
25 return NextResponse.json(
26 { success: false, error: validation.error },
31 const searchParams = request.nextUrl.searchParams;
32 const limit = parseInt(searchParams.get("limit") || "20");
33 const threshold = parseInt(searchParams.get("threshold") || "5");
35 // Get store-specific API URL for OpenAPI
36 const apiUrl = getStoreApiUrl(context, 'openapi');
37 const api = new FieldpineServerApi(apiUrl);
39 // Fetch products from store's OpenAPI endpoint
40 const productsResponse = await api.apiCall('/Products', {
42 params: { limit: '1000' },
43 cookie: context.session.apiKey
46 const products = productsResponse?.data?.Product || [];
48 console.log(`[Stock Alerts API] Found ${products.length} products at ${context.store.name}`);
50 // Filter products with low stock using OpenAPI StockLevel field
51 const lowStockProducts = products
53 const stockLevel = p.StockLevel || 0;
54 return stockLevel <= threshold && stockLevel >= 0;
56 .sort((a: any, b: any) => (a.StockLevel || 0) - (b.StockLevel || 0))
60 description: p.Name || p.ProductName || 'Unknown Product',
61 totalQty: p.StockLevel || 0,
62 locations: [] // OpenAPI doesn't provide per-location breakdown
65 console.log(`[Stock Alerts API] Low stock products found: ${lowStockProducts.length}`);
67 if (lowStockProducts.length === 0) {
68 return NextResponse.json({
74 store: context.store.name,
75 storeType: context.store.type
80 return NextResponse.json({
82 data: lowStockProducts,
84 total: lowStockProducts.length,
86 scannedProducts: products.length,
87 store: context.store.name,
88 storeType: context.store.type
91 } catch (error: any) {
92 console.error("[Stock Alerts API] Error:", error);
93 return NextResponse.json(
94 { success: false, error: error.message || "Failed to fetch stock alerts" },