From baf13c2c9ece6305c5847a4c3b2839799e77b184 Mon Sep 17 00:00:00 2001 From: Junseo Park Date: Sat, 27 Feb 2021 22:40:51 +0900 Subject: [PATCH] feat: add token reset route --- .../bots/{[id].ts => [id]/index.ts} | 3 +- pages/api/v2/applications/bots/[id]/reset.ts | 37 +++++++++++++++++++ utils/Yup.ts | 11 ++++++ 3 files changed, 50 insertions(+), 1 deletion(-) rename pages/api/v2/applications/bots/{[id].ts => [id]/index.ts} (99%) create mode 100644 pages/api/v2/applications/bots/[id]/reset.ts diff --git a/pages/api/v2/applications/bots/[id].ts b/pages/api/v2/applications/bots/[id]/index.ts similarity index 99% rename from pages/api/v2/applications/bots/[id].ts rename to pages/api/v2/applications/bots/[id]/index.ts index d1830c4..8e7b3e7 100644 --- a/pages/api/v2/applications/bots/[id].ts +++ b/pages/api/v2/applications/bots/[id]/index.ts @@ -4,9 +4,10 @@ import { DeveloperBot, DeveloperBotSchema } from '@utils/Yup' import { get, update } from '@utils/Query' import ResponseWrapper from '@utils/ResponseWrapper' import { checkToken } from '@utils/Csrf' -import { User } from '@types' import RequestHandler from '@utils/RequestHandler' +import { User } from '@types' + const BotApplications = RequestHandler .patch(async (req: ApiRequest, res) => { const user = await get.Authorization(req.cookies.token) diff --git a/pages/api/v2/applications/bots/[id]/reset.ts b/pages/api/v2/applications/bots/[id]/reset.ts new file mode 100644 index 0000000..c76ae76 --- /dev/null +++ b/pages/api/v2/applications/bots/[id]/reset.ts @@ -0,0 +1,37 @@ +import { NextApiRequest } from 'next' + +import { ResetBotToken, ResetBotTokenSchema } from '@utils/Yup' +import { get, update } from '@utils/Query' +import ResponseWrapper from '@utils/ResponseWrapper' +import { checkToken } from '@utils/Csrf' +import RequestHandler from '@utils/RequestHandler' + +import { User } from '@types' + +const ResetApplication = RequestHandler + .post(async (req: ApiRequest, res) => { + const user = await get.Authorization(req.cookies.token) + if(!user) return ResponseWrapper(res, { code: 401 }) + const csrfValidated = checkToken(req, res, req.body._csrf) + if(!csrfValidated) return + const validated = await ResetBotTokenSchema.validate(req.body, { abortEarly: false }).then(el => el).catch(e => { + ResponseWrapper(res, { code: 400, errors: e.errors }) + return null + }) + + if(!validated) return + const bot = await get.bot.load(req.query.id) + if(!bot) return ResponseWrapper(res, { code: 404, message: '존재하지 않는 봇입니다.' }) + if(!(bot.owners as User[]).find(el => el.id === user)) return ResponseWrapper(res, { code: 403 }) + await update.resetBotToken(req.query.id, validated.token) + return ResponseWrapper(res, { code: 200 }) + }) + + interface ApiRequest extends NextApiRequest { + body: ResetBotToken + query: { + id: string + } + } + +export default ResetApplication \ No newline at end of file diff --git a/utils/Yup.ts b/utils/Yup.ts index 42f3c73..7c1dff4 100644 --- a/utils/Yup.ts +++ b/utils/Yup.ts @@ -1,3 +1,4 @@ +import { TokenExpiredError } from 'jsonwebtoken' import * as Yup from 'yup' import YupKorean from 'yup-locales-ko' import { ListType } from '../types' @@ -143,4 +144,14 @@ export interface DeveloperBot { _csrf: string } +export const ResetBotTokenSchema = Yup.object({ + token: Yup.string().required(), + _csrf: Yup.string().required() +}) + +export interface ResetBotToken { + token: string + _csrf: string +} + export default Yup