Changes: - Add FAL_KEY and GEMINI_API_KEY to .env.example - Update picture-it to use ~/.config/opencode/.env (unified creds) - Remove shodh-memory skill (no longer used) - Remove alphaear-* skills (deprecated) - Remove thai-frontend-dev skill (replaced by website-creator) - Remove theme-factory skill - Add mql-developer skill (MQL5 trading) - Add ecommerce-astro skill (Astro e-commerce) - Add website-creator skill (Next.js + Payload CMS) - Update install script for new skills
81 lines
2.6 KiB
TypeScript
81 lines
2.6 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { getPayload } from 'payload'
|
|
import config from '@/payload.config'
|
|
|
|
/**
|
|
* POST /api/consent - Record consent action
|
|
*
|
|
* Request body:
|
|
* {
|
|
* action: 'accept' | 'reject' | 'update',
|
|
* purpose: 'analytics' | 'marketing' | 'functional' | 'all',
|
|
* analytics: boolean,
|
|
* marketing: boolean,
|
|
* functional: boolean,
|
|
* previousConsent?: { analytics: boolean, marketing: boolean, functional: boolean }
|
|
* }
|
|
*/
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const payloadConfig = await config
|
|
const payload = await getPayload({ config: payloadConfig })
|
|
|
|
const body = await request.json()
|
|
const { action, purpose, analytics, marketing, functional, previousConsent } = body
|
|
|
|
// Validate required fields
|
|
if (!action || !['accept', 'reject', 'update'].includes(action)) {
|
|
return NextResponse.json({ error: 'Invalid action' }, { status: 400 })
|
|
}
|
|
if (!purpose || !['analytics', 'marketing', 'functional', 'all'].includes(purpose)) {
|
|
return NextResponse.json({ error: 'Invalid purpose' }, { status: 400 })
|
|
}
|
|
|
|
// Get IP and User Agent
|
|
const ip = request.headers.get('x-forwarded-for')?.split(',')[0]
|
|
|| request.headers.get('x-real-ip')
|
|
|| 'unknown'
|
|
const userAgent = request.headers.get('user-agent') || 'unknown'
|
|
|
|
// Create consent log
|
|
const consentLog = await payload.create({
|
|
collection: 'consent-logs',
|
|
data: {
|
|
action,
|
|
purpose,
|
|
analytics: analytics ?? false,
|
|
marketing: marketing ?? false,
|
|
functional: functional ?? false,
|
|
userAgent,
|
|
ip,
|
|
timestamp: new Date().toISOString(),
|
|
previousConsent: previousConsent || null,
|
|
newConsent: {
|
|
analytics: analytics ?? false,
|
|
marketing: marketing ?? false,
|
|
functional: functional ?? false,
|
|
},
|
|
},
|
|
})
|
|
|
|
return NextResponse.json({ success: true, doc: consentLog })
|
|
} catch (error) {
|
|
console.error('Consent logging error:', error)
|
|
return NextResponse.json({ error: 'Failed to log consent' }, { status: 500 })
|
|
}
|
|
}
|
|
|
|
/**
|
|
* GET /api/consent - Get current consent status (from cookie or localStorage)
|
|
* This endpoint is mainly for verification, actual consent is stored client-side
|
|
*/
|
|
export async function GET(request: NextRequest) {
|
|
// Consent is stored client-side in localStorage
|
|
// This endpoint is for compliance verification
|
|
return NextResponse.json({
|
|
message: 'Consent is stored client-side',
|
|
purposes: ['analytics', 'marketing', 'functional'],
|
|
note: 'Use POST to update consent preferences'
|
|
})
|
|
}
|