wonderlandpark 2021-05-17 16:26:20 +09:00
parent 8a5293e3f4
commit 7355df4714
3 changed files with 25 additions and 13 deletions

View File

@ -76,11 +76,13 @@ const Bots = RequestHandler()
return ResponseWrapper(res, { code: 200, data: result }) return ResponseWrapper(res, { code: 200, data: result })
}) })
.delete(async (req: DeleteApiRequest, res) => { .delete(async (req: DeleteApiRequest, res) => {
const bot = await get.bot.load(req.query.id)
if(!bot) return ResponseWrapper(res, { code: 404, message: '존재하지 않는 봇입니다.' })
const user = await get.Authorization(req.cookies.token) const user = await get.Authorization(req.cookies.token)
if (!user) return ResponseWrapper(res, { code: 401 }) 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((bot.owners as User[])[0].id !== user) return ResponseWrapper(res, { code: 403 }) if((bot.owners as User[])[0].id !== user) return ResponseWrapper(res, { code: 403 })
const userInfo = await get.user.load(user)
if(['reported', 'blocked', 'archived'].includes(bot.state) && !checkUserFlag(userInfo?.flags, 'staff')) return ResponseWrapper(res, { code: 403, message: '해당 봇은 수정할 수 없습니다.', errors: ['오류라고 생각되면 문의해주세요.'] })
const csrfValidated = checkToken(req, res, req.body._csrf) const csrfValidated = checkToken(req, res, req.body._csrf)
if (!csrfValidated) return if (!csrfValidated) return
const captcha = await CaptchaVerify(req.body._captcha) const captcha = await CaptchaVerify(req.body._captcha)
@ -94,10 +96,10 @@ const Bots = RequestHandler()
.patch(patchLimiter).patch(async (req: PatchApiRequest, res) => { .patch(patchLimiter).patch(async (req: PatchApiRequest, res) => {
const bot = await get.bot.load(req.query.id) const bot = await get.bot.load(req.query.id)
if(!bot) return ResponseWrapper(res, { code: 404, message: '존재하지 않는 봇입니다.' }) if(!bot) return ResponseWrapper(res, { code: 404, message: '존재하지 않는 봇입니다.' })
if(['reported', 'blocked', 'archived'].includes(bot.state)) return ResponseWrapper(res, { code: 403, message: '해당 봇은 수정할 수 없습니다.', errors: ['오류라고 생각되면 문의해주세요.'] })
const user = await get.Authorization(req.cookies.token) const user = await get.Authorization(req.cookies.token)
if (!user) return ResponseWrapper(res, { code: 401 }) if (!user) return ResponseWrapper(res, { code: 401 })
const userInfo = await get.user.load(user) const userInfo = await get.user.load(user)
if(['reported', 'blocked', 'archived'].includes(bot.state) && !checkUserFlag(userInfo?.flags, 'staff')) return ResponseWrapper(res, { code: 403, message: '해당 봇은 수정할 수 없습니다.', errors: ['오류라고 생각되면 문의해주세요.'] })
if(!(bot.owners as User[]).find(el => el.id === user) && !checkUserFlag(userInfo?.flags, 'staff')) return ResponseWrapper(res, { code: 403 }) if(!(bot.owners as User[]).find(el => el.id === user) && !checkUserFlag(userInfo?.flags, 'staff')) return ResponseWrapper(res, { code: 403 })
const csrfValidated = checkToken(req, res, req.body._csrf) const csrfValidated = checkToken(req, res, req.body._csrf)
if (!csrfValidated) return if (!csrfValidated) return
@ -110,6 +112,7 @@ const Bots = RequestHandler()
}) })
if (!validated) return if (!validated) return
console.log(validated)
const result = await update.bot(req.query.id, validated) const result = await update.bot(req.query.id, validated)
if(result === 0) return ResponseWrapper(res, { code: 400 }) if(result === 0) return ResponseWrapper(res, { code: 400 })
else { else {

View File

@ -132,7 +132,7 @@ export function redirectTo(router: NextRouter, to: string) {
export function cleanObject<T extends Record<any, any>>(obj: T): T { export function cleanObject<T extends Record<any, any>>(obj: T): T {
for (const propName in obj) { for (const propName in obj) {
if (obj[propName] !== 0 && !obj[propName]) { if (obj[propName] !== 0 && !obj[propName]) {
delete obj[propName] obj[propName] = null
} }
} }
return obj return obj

View File

@ -141,19 +141,23 @@ export const AddBotSubmitSchema: Yup.SchemaOf<AddBotSubmit> = Yup.object({
website: Yup.string() website: Yup.string()
.matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.') .matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.')
.matches(Url, '올바른 웹사이트 URL을 입력해주세요.') .matches(Url, '올바른 웹사이트 URL을 입력해주세요.')
.max(64, 'URL은 최대 64자까지만 가능합니다.'), .max(64, 'URL은 최대 64자까지만 가능합니다.')
.nullable(),
url: Yup.string() url: Yup.string()
.matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.') .matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.')
.matches(Url, '올바른 초대링크 URL을 입력해주세요.') .matches(Url, '올바른 초대링크 URL을 입력해주세요.')
.max(128, 'URL은 최대 128자까지만 가능합니다.'), .max(128, 'URL은 최대 128자까지만 가능합니다.')
.nullable(),
git: Yup.string() git: Yup.string()
.matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.') .matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.')
.matches(Url, '올바른 깃 URL을 입력해주세요.') .matches(Url, '올바른 깃 URL을 입력해주세요.')
.max(64, 'URL은 최대 64자까지만 가능합니다.'), .max(64, 'URL은 최대 64자까지만 가능합니다.')
.nullable(),
discord: Yup.string() discord: Yup.string()
.matches(Vanity, '디스코드 초대코드 형식을 지켜주세요.') .matches(Vanity, '디스코드 초대코드 형식을 지켜주세요.')
.min(2, '지원 디스코드는 최소 2자여야합니다.') .min(2, '지원 디스코드는 최소 2자여야합니다.')
.max(32, '지원 디스코드는 최대 32자까지만 가능합니다.'), .max(32, '지원 디스코드는 최대 32자까지만 가능합니다.')
.nullable(),
category: Yup.array(Yup.string().oneOf(categories)) category: Yup.array(Yup.string().oneOf(categories))
.min(1, '최소 한 개의 카테고리를 선택해주세요.') .min(1, '최소 한 개의 카테고리를 선택해주세요.')
.unique('카테고리는 중복될 수 없습니다.') .unique('카테고리는 중복될 수 없습니다.')
@ -221,19 +225,23 @@ export const ManageBotSchema: Yup.SchemaOf<ManageBot> = Yup.object({
website: Yup.string() website: Yup.string()
.matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.') .matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.')
.matches(Url, '올바른 웹사이트 URL을 입력해주세요.') .matches(Url, '올바른 웹사이트 URL을 입력해주세요.')
.max(64, 'URL은 최대 64자까지만 가능합니다.'), .max(64, 'URL은 최대 64자까지만 가능합니다.')
.nullable(),
url: Yup.string() url: Yup.string()
.matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.') .matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.')
.matches(Url, '올바른 초대링크 URL을 입력해주세요.') .matches(Url, '올바른 초대링크 URL을 입력해주세요.')
.max(128, 'URL은 최대 128자까지만 가능합니다.'), .max(128, 'URL은 최대 128자까지만 가능합니다.')
.nullable(),
git: Yup.string() git: Yup.string()
.matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.') .matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.')
.matches(Url, '올바른 깃 URL을 입력해주세요.') .matches(Url, '올바른 깃 URL을 입력해주세요.')
.max(64, 'URL은 최대 64자까지만 가능합니다.'), .max(64, 'URL은 최대 64자까지만 가능합니다.')
.nullable(),
discord: Yup.string() discord: Yup.string()
.matches(Vanity, '디스코드 초대코드 형식을 지켜주세요.') .matches(Vanity, '디스코드 초대코드 형식을 지켜주세요.')
.min(2, '지원 디스코드는 최소 2자여야합니다.') .min(2, '지원 디스코드는 최소 2자여야합니다.')
.max(32, '지원 디스코드는 최대 32자까지만 가능합니다.'), .max(32, '지원 디스코드는 최대 32자까지만 가능합니다.')
.nullable(),
category: Yup.array(Yup.string().oneOf(categories)) category: Yup.array(Yup.string().oneOf(categories))
.min(1, '최소 한 개의 카테고리를 선택해주세요.') .min(1, '최소 한 개의 카테고리를 선택해주세요.')
.unique('카테고리는 중복될 수 없습니다.') .unique('카테고리는 중복될 수 없습니다.')
@ -276,7 +284,8 @@ export const DeveloperBotSchema: Yup.SchemaOf<DeveloperBot> = Yup.object({
webhook: Yup.string() webhook: Yup.string()
.matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.') .matches(HTTPProtocol, 'http:// 또는 https:// 로 시작해야합니다.')
.matches(Url, '올바른 웹훅 URL을 입력해주세요.') .matches(Url, '올바른 웹훅 URL을 입력해주세요.')
.max(150, 'URL은 최대 150자까지만 가능합니다.'), .max(150, 'URL은 최대 150자까지만 가능합니다.')
.nullable(),
_csrf: Yup.string().required(), _csrf: Yup.string().required(),
}) })