mission-control/app/api/voxyz/daily-missions/route.ts

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 }
);
}
}