1import { NextRequest, NextResponse } from 'next/server';
2import { getRequestContext, validateApiAccess } from '@/lib/server/sessionUtils';
5 * Store Stock Levels API
6 * GET /api/v1/inventory/stock-levels
8 * Returns current stock levels across all locations (or filtered by location)
9 * Uses Fieldpine's SQL3 endpoint
11export async function GET(request: NextRequest) {
13 // 1. Get session and store context
14 const context = await getRequestContext(request);
16 if (!context || !context.isAuthenticated) {
17 return NextResponse.json(
18 { error: 'Authentication required' },
23 // 2. SECURITY: Validate API access
24 const apiAccessValidation = validateApiAccess(context, 'elink');
25 if (!apiAccessValidation.valid) {
26 console.warn(`[Stock Levels API] Access denied: ${apiAccessValidation.error}`);
27 return NextResponse.json(
29 error: apiAccessValidation.error,
30 code: apiAccessValidation.errorCode
36 // 3. Parse query parameters
37 const { searchParams } = new URL(request.url);
38 const locationId = searchParams.get('locationId');
39 const minQty = searchParams.get('minQty') || '0';
40 const includeZero = searchParams.get('includeZero') === 'true';
42 console.log('[Stock Levels API] Request params:', { locationId, minQty, includeZero });
50 p.description as [descrip],
52 p.manupartcode as [partcode]
59 and i.location_id = l.location_id
64 sqlQuery += ' and i.qoh <> 0';
68 sqlQuery += ` and l.location_id = ${parseInt(locationId)}`;
71 sqlQuery += ' order by i.qoh desc';
73 console.log('[Stock Levels API] SQL:', sqlQuery);
75 // 5. Make SQL3 API call
76 const encodedQuery = encodeURIComponent(sqlQuery);
77 const url = `${context.store.url}/GNAP/J/SQL3?19=${encodedQuery}`;
79 const response = await fetch(url, {
82 'Cookie': `FieldpineApiKey=${context.session.apiKey}`,
83 'Accept': 'application/json'
88 console.error('[Stock Levels API] SQL3 failed:', response.status, response.statusText);
89 throw new Error(`SQL3 API error: ${response.status} ${response.statusText}`);
92 const data = await response.json();
94 console.log('[Stock Levels API] Response:', {
96 rowCount: data.data?.rows?.length || 0
99 // 6. Return formatted response
100 return NextResponse.json({
104 rows: data.data?.rows || [],
105 count: data.data?.rows?.length || 0
109 } catch (error: any) {
110 console.error('[Stock Levels API] Error:', error);
112 if (error.message && error.message.includes('403')) {
113 return NextResponse.json(
115 error: 'Your session has expired. Please refresh the page and log in again.',
116 code: 'SESSION_EXPIRED'
122 return NextResponse.json(
123 { error: error.message || 'Failed to fetch stock levels' },