1import { NextRequest, NextResponse } from 'next/server';
2import { fieldpineServerApi } from '@/lib/server/fieldpineApi';
3import { getRequestContext, validateApiAccess } from '@/lib/server/sessionUtils';
6 * Loyalty Campaigns Endpoint (ELINK API)
7 * GET /api/v1/buck/loyalty/campaigns
9 * Uses ELINK API (retailmax.elink.loyalty.list)
10 * Security: Retail stores can access this (ELINK only)
12export async function GET(request: NextRequest) {
14 const context = await getRequestContext(request);
15 if (!context || !context.isAuthenticated) {
16 return NextResponse.json(
17 { error: 'Authentication required' },
22 const apiAccessValidation = validateApiAccess(context, 'elink');
23 if (!apiAccessValidation.valid) {
24 return NextResponse.json(
25 { error: apiAccessValidation.error, code: apiAccessValidation.errorCode },
30 const buckParams: Record<string, string> = {
31 '3': 'retailmax.elink.loyalty.list',
32 '99': Math.random().toString()
35 // Use store-specific URL for API calls
36 const result = await fieldpineServerApi.buckApiCall(buckParams, context.session.apiKey, context.store.url);
38 return NextResponse.json({
44 } catch (error: any) {
45 console.error('[Loyalty Campaigns API] Error:', error);
46 return NextResponse.json(
47 { error: error.message || 'Failed to fetch loyalty campaigns' },
54 * POST: Create new loyalty campaign
55 * Uses DATI packet with retailmax.elink.loyalty.edit
57export async function POST(request: NextRequest) {
59 const context = await getRequestContext(request);
60 if (!context || !context.isAuthenticated) {
61 return NextResponse.json(
62 { error: 'Authentication required' },
67 const apiAccessValidation = validateApiAccess(context, 'elink');
68 if (!apiAccessValidation.valid) {
69 return NextResponse.json(
70 { error: apiAccessValidation.error, code: apiAccessValidation.errorCode },
75 const body = await request.json();
77 // Build DATI XML for new loyalty campaign
80 "<f8_s>retailmax.elink.loyalty.edit</f8_s>",
81 "<f11_B>I</f11_B>", // Insert
82 body.name ? `<f101_s>${body.name}</f101_s>` : "",
83 body.startDate ? `<f102_s>${body.startDate}</f102_s>` : "",
84 body.earnEndDate ? `<f103_s>${body.earnEndDate}</f103_s>` : "",
85 body.redeemEndDate ? `<f114_s>${body.redeemEndDate}</f114_s>` : "",
86 body.rewardLevel ? `<f104_E>${body.rewardLevel}</f104_E>` : "",
87 body.moneyRewardLevel ? `<f105_E>${body.moneyRewardLevel}</f105_E>` : "",
88 body.gain ? `<f106_E>${body.gain}</f106_E>` : "",
89 body.inputPid ? `<f107_E>${body.inputPid}</f107_E>` : "",
90 body.outputPid ? `<f108_E>${body.outputPid}</f108_E>` : "",
91 body.membershipType !== undefined ? `<f109_E>${body.membershipType}</f109_E>` : "",
92 body.activeDays ? `<f113_E>${body.activeDays}</f113_E>` : "",
94 ].filter(line => line !== "").join("");
96 const result = await fieldpineServerApi.apiCall(
101 cookie: context.session.apiKey,
106 return NextResponse.json({
113 console.error('Create loyalty campaign error:', error);
114 return NextResponse.json(
115 { error: 'Failed to create loyalty campaign' },