This commit is contained in:
ろむねこ 2024-07-09 16:08:46 +09:00
commit 2d1fb9a6ab
Signed by: Fujimatsu
GPG Key ID: FA1F39A1BA37D168
9 changed files with 52 additions and 225 deletions

View File

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

View File

@ -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;

View File

@ -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 };

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -1,10 +1,10 @@
import prisma from '@src/prisma';
import { issueTokenByChildId } from '@src/utils/tokenUtils';
async function login(loginCode: number): Promise<string | null> {
async function login(loginCode: string): Promise<any> { // 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<string | null> {
}
await prisma.activeLoginCode.delete({
where: {
code: loginCode
code: parseInt(loginCode)
}
});
return await issueTokenByChildId(childId);
return {
accessToken: await issueTokenByChildId(childId),
childId: childId
};
}
export { login };

View File

@ -62,6 +62,17 @@ async function deleteChild(childId: string): Promise<Child> {
}).then((child) => { return child; });
}
async function modifyChild(childId: string, requestBody: ChildAddRequest): Promise<Child> {
return prisma.child.update({
where: {
id: childId
},
data: {
name: requestBody.name
}
}).then((child) => { return child; });
}
async function generateLoginCode(childId: string): Promise<number> {
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<number> {
});
}
export { getChilds, createChild, deleteChild, generateLoginCode, getChild }
export { getChilds, createChild, deleteChild, generateLoginCode, getChild, modifyChild }