Files
XCDesktop/api/modules/todo/routes.ts
2026-03-08 01:34:54 +08:00

100 lines
2.7 KiB
TypeScript

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