100 lines
2.7 KiB
TypeScript
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 })
|