From ac414b25bc0b3912711b121866f4d828bd60a9ff Mon Sep 17 00:00:00 2001 From: wonderlandpark Date: Fri, 12 Mar 2021 13:16:20 +0900 Subject: [PATCH] feat: added report route --- pages/api/v2/bots/[id]/report.ts | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 pages/api/v2/bots/[id]/report.ts diff --git a/pages/api/v2/bots/[id]/report.ts b/pages/api/v2/bots/[id]/report.ts new file mode 100644 index 0000000..b3ee015 --- /dev/null +++ b/pages/api/v2/bots/[id]/report.ts @@ -0,0 +1,50 @@ +import { NextApiRequest} from 'next' +import rateLimit from 'express-rate-limit' + +import { get } from '@utils/Query' +import RequestHandler from '@utils/RequestHandler' +import ResponseWrapper from '@utils/ResponseWrapper' +import { ReportSchema, Report} from '@utils/Yup' +import { getReportChannel } from '@utils/DiscordBot' + +const limiter = rateLimit({ + windowMs: 5 * 60 * 1000, + max: 3, + statusCode: 429, + handler: (_req, res) => ResponseWrapper(res, { code: 429 }), + keyGenerator: (req) => req.headers.authorization, + skip: (req, res) => { + res.removeHeader('X-RateLimit-Global') + if(!req.headers.authorization) return true + else return false + } +}) + +const BotReport = RequestHandler().post(limiter) + .post(async (req: PostApiRequest, res) => { + const user = await get.Authorization(req.cookies.token) + if(!user) return ResponseWrapper(res, { code: 401 }) + const bot = await get.bot.load(req.query.id) + if(!bot) return ResponseWrapper(res, { code: 404, message: '존재하지 않는 봇입니다.' }) + if(!req.body) return ResponseWrapper(res, { code: 400 }) + const validated: Report = await ReportSchema.validate(req.body, { abortEarly: false }) + .then(el => el) + .catch(e => { + ResponseWrapper(res, { code: 400, errors: e.errors }) + return null + }) + + if(!validated) return + await getReportChannel().send(`Reported by <@${user}> (${user})\nReported **${bot.name}** <@${bot.id}> (${bot.id})\nCategory ${req.body.category}\nDesc\n\`\`\`${req.body.description}\`\`\``, { allowedMentions: { parse: ['users'] }}) + return ResponseWrapper(res, { code: 200, message: '성공적으로 처리되었습니다.' }) + }) + + +interface PostApiRequest extends NextApiRequest { + body: Report | null + query: { + id: string + } +} + +export default BotReport \ No newline at end of file