habits.andr33v.ru/server/api/habits/index.post.ts

48 lines
1.3 KiB
TypeScript

import { getUserIdFromSession } from '../../utils/auth';
interface HabitDto {
id: number;
name: string;
daysOfWeek: number[];
}
export default defineEventHandler(async (event): Promise<HabitDto> => {
const userId = await getUserIdFromSession(event);
const { name, daysOfWeek } = await readBody(event);
// --- Validation ---
if (!name || !Array.isArray(daysOfWeek)) {
throw createError({ statusCode: 400, statusMessage: 'Invalid input: name and daysOfWeek are required.' });
}
// Sanitize daysOfWeek to ensure it's a unique set of valid numbers
const validDays = daysOfWeek.filter(day => typeof day === 'number' && day >= 0 && day <= 6);
const sanitizedDays = [...new Set(validDays)].sort();
// --- Business Rule: Max 3 Habits ---
const habitCount = await prisma.habit.count({ where: { userId } });
if (habitCount >= 3) {
throw createError({ statusCode: 400, statusMessage: 'Maximum number of 3 habits reached.' });
}
// --- Create Habit ---
const newHabit = await prisma.habit.create({
data: {
userId,
name,
daysOfWeek: sanitizedDays,
},
});
// Set 201 Created status
setResponseStatus(event, 201);
// Return DTO
return {
id: newHabit.id,
name: newHabit.name,
daysOfWeek: newHabit.daysOfWeek as number[],
};
});