diff --git a/src/routers/child/authRouter.ts b/src/routers/child/authRouter.ts index fc5fd6e..cb6adce 100644 --- a/src/routers/child/authRouter.ts +++ b/src/routers/child/authRouter.ts @@ -5,12 +5,12 @@ const router = Router(); // login router.post('/login', (req: Request, res: Response) => { - const code: number = req.body.code; - if (!code) { + const loginCode: string = req.body.loginCode; + if (!loginCode) { return res.status(400).json({ message: 'ログインコードが指定されていません' }); } - login(code).then((token) => { - res.status(200).json({ accessToken: token }); + login(loginCode).then(resp => { + res.status(200).json(resp); }).catch((err) => { res.status(500).json({ message: 'ログインに失敗しました', detail: err }); }); diff --git a/src/routers/child/index.ts b/src/routers/child/index.ts index f6a8d1f..e1af816 100644 --- a/src/routers/child/index.ts +++ b/src/routers/child/index.ts @@ -1,11 +1,14 @@ import { Router } from 'express'; -import taskRouter from './taskRouter'; import authRouter from './authRouter'; +import { commonRouter as rootCommonRouter, parentRouter as rootParentRouter } from './rootRouter'; +import verifyToken from '../middlewares/verifyToken'; +import verifyParent from '../middlewares/verifyParent'; const router = Router(); -router.use('/task', taskRouter); router.use('/auth', authRouter); +router.use('/' , verifyToken, rootCommonRouter); +router.use('/' , verifyToken, verifyParent, rootParentRouter); export default router; diff --git a/src/routers/parent/childRouter.ts b/src/routers/child/rootRouter.ts similarity index 75% rename from src/routers/parent/childRouter.ts rename to src/routers/child/rootRouter.ts index a7811b4..fe76e9a 100644 --- a/src/routers/parent/childRouter.ts +++ b/src/routers/child/rootRouter.ts @@ -1,13 +1,15 @@ import { Router, Request, Response } from 'express'; -import { generateLoginCode, getChilds, createChild, deleteChild, getChild } from '@src/services/parent/childService'; +import { generateLoginCode, getChilds, createChild, deleteChild, getChild, modifyChild } from '@src/services/parent/childService'; import { ChildListResponse } from '@src/models/Child' import Logger from '@src/logger'; +import { internalServerErrorResponse } from '@src/models/commons/responses'; -const router = Router(); const logger = new Logger(); -logger.setTag('parent/childRouter'); +const commonRouter = Router(); +const parentRouter = Router(); -router.get('/', (req: Request, res: Response) => { + +commonRouter.get('/', (req: Request, res: Response) => { if (!req.user) { return res.status(500).json({ message: 'エラーが発生しました(JWT解析結果が不正/未設定です)' @@ -26,7 +28,8 @@ router.get('/', (req: Request, res: Response) => { }); }); -router.post('/', (req: Request, res: Response) => { + +parentRouter.post('/', (req: Request, res: Response) => { if (!req.user) { return res.status(500).json({ message: 'エラーが発生しました(JWT解析結果が不正/未設定です)' @@ -64,7 +67,8 @@ router.post('/', (req: Request, res: Response) => { }); }); -router.get('/:childId/login', (req: Request, res: Response) => { + +parentRouter.get('/:childId/login', (req: Request, res: Response) => { const childId = req.params.childId; // TODO: Validate childId generateLoginCode(childId).then((code) => { res.status(200).json({ @@ -80,7 +84,7 @@ router.get('/:childId/login', (req: Request, res: Response) => { }); }); -router.get('/:childId', (req: Request, res: Response) => { +commonRouter.get('/:childId', (req: Request, res: Response) => { const childId = req.params.childId; getChild(childId).then((child) => { res.status(200).json(child); @@ -94,7 +98,7 @@ router.get('/:childId', (req: Request, res: Response) => { }); }); -router.delete('/:childId', (req: Request, res: Response) => { +parentRouter.delete('/:childId', (req: Request, res: Response) => { const childId = req.params.childId; // TODO: Validate childId deleteChild(childId).then(() => { res.status(200).json({ @@ -110,11 +114,16 @@ router.delete('/:childId', (req: Request, res: Response) => { }); }); -router.put('/:childId', (req: Request, res: Response) => { - // 子供情報を更新 - res.status(501).json({ - message: 'WIP' +parentRouter.put('/:childId', (req: Request, res: Response) => { + const childId = req.params.childId; // TODO: Validate childId + // TODO: ボディのバリデーション + modifyChild(childId, req.body).then((child) => { + res.status(200).json(child); + }).catch((err) => { + logger.error('Failed to modify child') + logger.debug(err); + res.status(internalServerErrorResponse().statusCode).json(internalServerErrorResponse().body); }); }); -export default router; +export { commonRouter, parentRouter }; diff --git a/src/routers/child/taskRouter.ts b/src/routers/child/taskRouter.ts deleted file mode 100644 index d5bfae3..0000000 --- a/src/routers/child/taskRouter.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Router, Request, Response } from 'express'; -import { registCompleteTask } from '@src/services/taskService'; -import Logger from '@src/logger'; - -const router = Router(); -const logger = new Logger(); -logger.setTag('child/taskRouter.ts'); - -router.get('/', (req: Request, res: Response) => { - res.status(501).send('WIP'); -}); - -router.get('/:taskId', (req: Request, res: Response) => { - res.status(501).send('WIP'); -}); - -router.post('/:taskId/complete', (req: Request, res: Response) => { - if (!req.user) { - return res.status(500).json({ - message: 'エラーが発生しました(JWT解析結果が不正/未設定です)' - }); - } - logger.info(`Task complete request from ${req.user.claims.sub} for task ${req.params.taskId}`); - try { - registCompleteTask(req.params.taskId, req.user.claims.sub); - } catch (error) { - logger.error(`Failed to complete task: ${error}`); - return res.status(500).json({ - message: 'エラーが発生しました(タスクの完了に失敗しました)' - }); - } - logger.info(`Task ${req.params.taskId} completed by ${req.user.claims.sub}`); - res.status(200).json({ - message: 'タスクを完了しました' - }); -}); -export default router; diff --git a/src/routers/parent/index.ts b/src/routers/parent/index.ts index 422704f..54c11c2 100644 --- a/src/routers/parent/index.ts +++ b/src/routers/parent/index.ts @@ -4,17 +4,13 @@ import verifyToken from '../middlewares/verifyToken'; import verifyParent from '../middlewares/verifyParent'; import authRouter from './authRouter'; -import taskRouter from './taskRouter'; import accountRouter from './accountRouter'; -import childRouter from './childRouter'; const router = Router(); const logger = new Logger(); logger.setTag('parent/index.ts'); router.use('/auth', authRouter); -router.use('/task', verifyToken, verifyParent, taskRouter); router.use('/account', verifyToken, verifyParent, accountRouter); -router.use('/child', verifyToken, verifyParent, childRouter); export default router; diff --git a/src/routers/parent/taskRouter.ts b/src/routers/parent/taskRouter.ts deleted file mode 100644 index a98641e..0000000 --- a/src/routers/parent/taskRouter.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { Router } from 'express'; -import { Task } from '@prisma/client'; -import { getTask, createTask, getTasks, updateTask, deleteTask, registCompleteTask } from '@src/services/taskService'; -import { TaskListResponse, TaskAddRequest } from '@src/models/Task'; - -const router = Router(); - -router.get('/', (req, res) => { - if (req.user === undefined) { - res.status(500).json({ - message: 'エラーが発生しました(JWT解析結果が不正/未設定です)' - }); - return; - } - getTasks(req.user.claims.home_group_id) - .then((taskListResponse: TaskListResponse) => { - res.status(200).json(taskListResponse); - }) - .catch((err) => { - res.status(500).json({ - message: 'エラーが発生しました', - error: err - }); - }); - return; -}); - -router.post('/', (req, res) => { - // BodyをTaskAddRequestにマッピングできるかチェック - let requestBody: TaskAddRequest; - try { - requestBody = req.body; - if (!requestBody) { - res.status(400).json({ - message: 'リクエストボディが空です' - }); - return; - } - if (!requestBody.name || !requestBody.reward) { - res.status(400).json({ - message: 'name, rewardは必須です' - }); - return; - } - } catch (e) { - res.status(400).json({ - message: 'リクエストボディが不正です' - }); - return; - } - - if (req.user === undefined) { - res.status(500).json({ - message: 'エラーが発生しました(JWT解析結果が不正/未設定です)' - }); - return; - } - - createTask(requestBody, req.user.claims.home_group_id) - .then((task: Task) => { - res.status(201).json(task); // TODO - }) - .catch((err) => { - res.status(500).json({ - message: 'エラーが発生しました', - error: err - }); - }); -}); - -router.get('/:taskId', (req, res) => { - getTask(req.params.taskId) - .then((task: Task | null) => { - if (task) { - res.status(200).json(task); - } else { - res.status(404).json({ - message: 'タスクが見つかりませんでした' - }); - } - }) - .catch((err) => { - res.status(500).json({ - message: 'エラーが発生しました', - error: err - }); - }); -}); - -router.put('/:taskId', (req, res) => { - const body = req.body; - if (!body) { - res.status(400).json({ - message: '不正なリクエスト: リクエストボディが空です' - }); - return; - } - if (!body.displayName || !body.reward) { - res.status(400).json({ - message: '不正なリクエスト: displayName, rewardは必須です' - }); - return; - } else { - const task: Task = {} as Task; - // TODO: 共通化 - task.id = req.params.taskId; - task.display_name = body.displayName; - task.reward = body.reward; - updateTask(task) - .then((task: Task) => { - res.status(200).json(task); - }) - .catch((err) => { - res.status(500).json({ - message: 'エラーが発生しました', - error: err - }); - }); - } -}); - -router.delete('/:taskId', (req, res) => { - deleteTask(req.params.taskId) - .then(() => { - res.status(200).json({ - message: 'OK', - }); - }) - .catch((err) => { - res.status(500).json({ - message: 'エラーが発生しました', - error: err - }); - }); -}); - -router.post('/:taskId/complete', (req, res) => { - if (req.query.childId === undefined) { - res.status(400).json({ - message: '不正なリクエスト: childIdは必須です' - }); - return; - } - registCompleteTask(req.params.taskId, req.query.childId as string) - .then(() => { - res.status(200).json({ - message: 'OK', - }); - }) - .catch((err) => { - res.status(500).json({ - message: 'エラーが発生しました', - error: err - }); - }); -}); - -export default router; diff --git a/src/routers/task/index.ts b/src/routers/task/index.ts index 339665f..b5d279d 100644 --- a/src/routers/task/index.ts +++ b/src/routers/task/index.ts @@ -6,10 +6,10 @@ import verifyParent from '../middlewares/verifyParent'; const router = Router(); -router.use('/', verifyToken, rootCommonRouter); -router.use('/' , verifyToken, verifyParent, rootParentRouter); router.use('/history', verifyToken, historyCommonRouter); router.use('/history', verifyToken, verifyParent, historyParentRouter); +router.use('/', verifyToken, rootCommonRouter); +router.use('/' , verifyToken, verifyParent, rootParentRouter); export default router; diff --git a/src/services/child/authService.ts b/src/services/child/authService.ts index ad37f8e..e5bf3e6 100644 --- a/src/services/child/authService.ts +++ b/src/services/child/authService.ts @@ -1,10 +1,10 @@ import prisma from '@src/prisma'; import { issueTokenByChildId } from '@src/utils/tokenUtils'; -async function login(loginCode: number): Promise { +async function login(loginCode: string): Promise { // Workaround const childId: string | null = await prisma.activeLoginCode.findUnique({ where: { - code: loginCode + code: parseInt(loginCode) } }).then((activeLoginCode) => { if (!activeLoginCode) { @@ -17,10 +17,13 @@ async function login(loginCode: number): Promise { } await prisma.activeLoginCode.delete({ where: { - code: loginCode + code: parseInt(loginCode) } }); - return await issueTokenByChildId(childId); + return { + accessToken: await issueTokenByChildId(childId), + childId: childId + }; } export { login }; diff --git a/src/services/parent/childService.ts b/src/services/parent/childService.ts index 2eee8ee..e377f69 100644 --- a/src/services/parent/childService.ts +++ b/src/services/parent/childService.ts @@ -62,6 +62,17 @@ async function deleteChild(childId: string): Promise { }).then((child) => { return child; }); } +async function modifyChild(childId: string, requestBody: ChildAddRequest): Promise { + return prisma.child.update({ + where: { + id: childId + }, + data: { + name: requestBody.name + } + }).then((child) => { return child; }); +} + async function generateLoginCode(childId: string): Promise { const loginCode: number = Math.floor(10000000 + Math.random() * 90000000); logger.debug(`Generated login code: ${loginCode}`); @@ -83,4 +94,4 @@ async function generateLoginCode(childId: string): Promise { }); } -export { getChilds, createChild, deleteChild, generateLoginCode, getChild } +export { getChilds, createChild, deleteChild, generateLoginCode, getChild, modifyChild }