import express, { type Request, type Response, type Router } from 'express' import { asyncHandler } from '../../utils/asyncHandler.js' import { successResponse } from '../../utils/response.js' import { validateBody, validateQuery } from '../../middlewares/validate.js' import { TodoService } from './service.js' import { getTodoQuerySchema, saveTodoSchema, addTodoSchema, toggleTodoSchema, updateTodoSchema, deleteTodoSchema, } from './schemas.js' export interface TodoRoutesDependencies { todoService: TodoService } export const createTodoRoutes = (deps: TodoRoutesDependencies): Router => { const router = express.Router() const { todoService } = deps router.get( '/', validateQuery(getTodoQuerySchema), asyncHandler(async (req: Request, res: Response) => { const year = parseInt(req.query.year as string) || new Date().getFullYear() const month = parseInt(req.query.month as string) || new Date().getMonth() + 1 const result = await todoService.getTodo(year, month) successResponse(res, result) }), ) router.post( '/save', validateBody(saveTodoSchema), asyncHandler(async (req: Request, res: Response) => { const { year, month, dayTodos } = req.body await todoService.saveTodo(year, month, dayTodos) successResponse(res, null) }), ) router.post( '/add', validateBody(addTodoSchema), asyncHandler(async (req: Request, res: Response) => { const { year, month, date, content: todoContent } = req.body const dayTodos = await todoService.addTodo(year, month, date, todoContent) successResponse(res, { dayTodos }) }), ) router.post( '/toggle', validateBody(toggleTodoSchema), asyncHandler(async (req: Request, res: Response) => { const { year, month, date, itemIndex, completed } = req.body const dayTodos = await todoService.toggleTodo(year, month, date, itemIndex, completed) successResponse(res, { dayTodos }) }), ) router.post( '/update', validateBody(updateTodoSchema), asyncHandler(async (req: Request, res: Response) => { const { year, month, date, itemIndex, content: newContent } = req.body const dayTodos = await todoService.updateTodo(year, month, date, itemIndex, newContent) successResponse(res, { dayTodos }) }), ) router.delete( '/delete', validateBody(deleteTodoSchema), asyncHandler(async (req: Request, res: Response) => { const { year, month, date, itemIndex } = req.body const dayTodos = await todoService.deleteTodo(year, month, date, itemIndex) successResponse(res, { dayTodos }) }), ) return router } const todoService = new TodoService() export default createTodoRoutes({ todoService })