core/pages/api/auth/github/callback.ts
SKINMAKER b421d1ab64
chore: apply prettier (#637)
* chore: apply prettier

* chore: edit ready comment

* chore: move ts comment
2023-11-29 22:04:33 +09:00

57 lines
1.6 KiB
TypeScript

import { NextApiRequest } from 'next'
import fetch from 'node-fetch'
import { GithubTokenInfo } from '@types'
import { SpecialEndPoints } from '@utils/Constants'
import { OauthCallbackSchema } from '@utils/Yup'
import ResponseWrapper from '@utils/ResponseWrapper'
import { get, update } from '@utils/Query'
import RequestHandler from '@utils/RequestHandler'
const Callback = RequestHandler().get(async (req: ApiRequest, res) => {
const validate = await OauthCallbackSchema.validate(req.query)
.then((r) => r)
.catch((e) => {
ResponseWrapper(res, { code: 400, errors: e.errors })
return null
})
if (!validate) return
const user = await get.Authorization(req.cookies.token)
if (!user) return ResponseWrapper(res, { code: 401 })
const token: GithubTokenInfo = await fetch(
SpecialEndPoints.Github.Token(
process.env.GITHUB_CLIENT_ID,
process.env.GITHUB_CLIENT_SECRET,
req.query.code
),
{
method: 'POST',
headers: {
Accept: 'application/json',
},
}
).then((r) => r.json())
if (token.error) return ResponseWrapper(res, { code: 400, errors: ['올바르지 않은 코드입니다.'] })
const github: { login: string } = await fetch(SpecialEndPoints.Github.Me, {
headers: {
Authorization: `token ${token.access_token}`,
},
}).then((r) => r.json())
const result = await update.Github(user, github.login)
if (result === 0)
return ResponseWrapper(res, { code: 400, message: '이미 등록되어있는 깃허브 계정입니다.' })
get.user.clear(user)
res.redirect(301, '/panel')
})
interface ApiRequest extends NextApiRequest {
query: {
code: string
}
}
export default Callback