152 lines
3.9 KiB
TypeScript
152 lines
3.9 KiB
TypeScript
/**
|
|
* Voxyz API Routes - Daily Missions
|
|
* Handles daily mission CRUD operations and generation
|
|
*/
|
|
|
|
import { NextRequest, NextResponse } from 'next/server';
|
|
import {
|
|
generateDailyMissions,
|
|
getTodaysDailyMission,
|
|
approveDailyMission,
|
|
scheduleDailyMission,
|
|
completeDailyMission,
|
|
runDailyMissionGeneration
|
|
} from '@/lib/services/daily-mission-agent';
|
|
import { getProposalsForDate, approveProposal, rejectProposal } from '@/lib/services/proposal.service';
|
|
import { createClient } from '@/lib/supabase/server';
|
|
|
|
// GET /api/voxyz/daily-missions - Get today's daily mission
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const { searchParams } = new URL(request.url);
|
|
const date = searchParams.get('date');
|
|
|
|
if (date) {
|
|
// Get proposals for specific date
|
|
const proposals = await getProposalsForDate(new Date(date));
|
|
return NextResponse.json({ proposals });
|
|
}
|
|
|
|
// Get today's daily mission
|
|
const dailyMission = await getTodaysDailyMission();
|
|
|
|
if (!dailyMission) {
|
|
return NextResponse.json({
|
|
dailyMission: null,
|
|
message: 'No daily mission generated yet'
|
|
});
|
|
}
|
|
|
|
// Fetch full proposal details
|
|
const supabase = await createClient();
|
|
const proposalIds = [
|
|
dailyMission.primary_mission_id,
|
|
dailyMission.secondary_mission_id,
|
|
dailyMission.tertiary_mission_id,
|
|
].filter(Boolean);
|
|
|
|
const { data: proposals } = await supabase
|
|
.from('ops_mission_proposals')
|
|
.select('*')
|
|
.in('id', proposalIds);
|
|
|
|
return NextResponse.json({
|
|
dailyMission,
|
|
proposals: proposals || [],
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Error fetching daily mission:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to fetch daily mission' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
// POST /api/voxyz/daily-missions - Generate daily missions
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { date, force = false } = body;
|
|
|
|
const targetDate = date ? new Date(date) : new Date();
|
|
|
|
const result = await generateDailyMissions({
|
|
date: targetDate,
|
|
targetMissionCount: 3,
|
|
includeReactions: true,
|
|
forceRegenerate: force,
|
|
});
|
|
|
|
if (!result) {
|
|
return NextResponse.json(
|
|
{ error: 'Failed to generate daily missions' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
|
|
return NextResponse.json(result, { status: 201 });
|
|
|
|
} catch (error) {
|
|
console.error('Error generating daily missions:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to generate daily missions' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
// PATCH /api/voxyz/daily-missions - Update daily mission status
|
|
export async function PATCH(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { id, action, rating, notes } = body;
|
|
|
|
if (!id || !action) {
|
|
return NextResponse.json(
|
|
{ error: 'Missing required fields: id, action' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
let success = false;
|
|
|
|
switch (action) {
|
|
case 'approve':
|
|
success = await approveDailyMission(id);
|
|
break;
|
|
|
|
case 'schedule':
|
|
success = await scheduleDailyMission(id);
|
|
break;
|
|
|
|
case 'complete':
|
|
success = await completeDailyMission(id, rating, notes);
|
|
break;
|
|
|
|
default:
|
|
return NextResponse.json(
|
|
{ error: `Unknown action: ${action}` },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
if (!success) {
|
|
return NextResponse.json(
|
|
{ error: `Failed to ${action} daily mission` },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
|
|
return NextResponse.json({ success: true });
|
|
|
|
} catch (error) {
|
|
console.error('Error updating daily mission:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to update daily mission' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|