All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 12m53s
75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { auth } from '@/lib/auth';
|
|
import { createOKR } from '@/services/okrs';
|
|
import { getTeamMemberById, isTeamAdmin } from '@/services/teams';
|
|
import type { CreateOKRInput, CreateKeyResultInput } from '@/lib/types';
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const session = await auth();
|
|
|
|
if (!session?.user?.id) {
|
|
return NextResponse.json({ error: 'Non autorisé' }, { status: 401 });
|
|
}
|
|
|
|
const body = await request.json();
|
|
const { teamMemberId, objective, description, period, startDate, endDate, keyResults } =
|
|
body as CreateOKRInput & {
|
|
startDate: string | Date;
|
|
endDate: string | Date;
|
|
};
|
|
|
|
if (!teamMemberId || !objective || !period || !startDate || !endDate || !keyResults) {
|
|
return NextResponse.json({ error: 'Champs requis manquants' }, { status: 400 });
|
|
}
|
|
|
|
// Get team member to check permissions
|
|
const teamMember = await getTeamMemberById(teamMemberId);
|
|
if (!teamMember) {
|
|
return NextResponse.json({ error: "Membre de l'équipe non trouvé" }, { status: 404 });
|
|
}
|
|
|
|
// Check if user is admin of the team
|
|
const isAdmin = await isTeamAdmin(teamMember.team.id, session.user.id);
|
|
if (!isAdmin) {
|
|
return NextResponse.json(
|
|
{ error: 'Seuls les administrateurs peuvent créer des OKRs' },
|
|
{ status: 403 }
|
|
);
|
|
}
|
|
|
|
// Convert dates to Date objects if they are strings
|
|
const startDateObj = startDate instanceof Date ? startDate : new Date(startDate);
|
|
const endDateObj = endDate instanceof Date ? endDate : new Date(endDate);
|
|
|
|
// Validate dates
|
|
if (isNaN(startDateObj.getTime()) || isNaN(endDateObj.getTime())) {
|
|
return NextResponse.json({ error: 'Dates invalides' }, { status: 400 });
|
|
}
|
|
|
|
// Ensure all key results have a unit and order
|
|
const keyResultsWithUnit = keyResults.map((kr: CreateKeyResultInput, index: number) => ({
|
|
...kr,
|
|
unit: kr.unit || '%',
|
|
order: kr.order !== undefined ? kr.order : index,
|
|
}));
|
|
|
|
const okr = await createOKR(
|
|
teamMemberId,
|
|
objective,
|
|
description || null,
|
|
period,
|
|
startDateObj,
|
|
endDateObj,
|
|
keyResultsWithUnit
|
|
);
|
|
|
|
return NextResponse.json(okr, { status: 201 });
|
|
} catch (error) {
|
|
console.error('Error creating OKR:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : "Erreur lors de la création de l'OKR";
|
|
return NextResponse.json({ error: errorMessage }, { status: 500 });
|
|
}
|
|
}
|