activity-oauth-svr/src/controllers/discord.controller.ts
2024-04-16 15:21:20 +08:00

49 lines
1.8 KiB
TypeScript

import BaseController, { ROLE_ANON } from 'common/base.controller'
import { ZError } from 'common/ZError'
import { role, router } from 'decorators/router'
import logger from 'logger/logger'
import { AuthRecord } from 'modules/AuthRecord'
import { DiscordSvr, exchangeDiscrodCodeForToken, userInfo } from 'services/discord.svr'
import { parseOauthState } from 'utils/net.util'
class DiscordController extends BaseController {
@role(ROLE_ANON)
@router('get /discord/redirect_uri')
async discordCallback(req, res) {
let { code, state } = req.params
if (code && state) {
const stateArr = parseOauthState(state)
const address = stateArr[0].toLowerCase()
const record = await AuthRecord.insertOrUpdate(
{ address, platform: 7 },
{ address, platform: 7, $inc: { version: 1 } },
)
let tokenResponse = await exchangeDiscrodCodeForToken(code)
record.accessToken = tokenResponse.access_token
record.refreshToken = tokenResponse.refresh_token
record.scope = tokenResponse.scope
record.tokenType = tokenResponse.token_type
record.expiresIn = (Date.now() / 1000 + tokenResponse.expires_in) | 0
await record.save()
if (tokenResponse && tokenResponse.access_token) {
let uinfo = await userInfo(tokenResponse.access_token)
record.nickname = uinfo.username
record.username = uinfo.username
record.discriminator = uinfo.discriminator
record.openId = uinfo.id
await record.save()
}
if (stateArr.length > 2) {
return res.redirect(stateArr[2])
}
}
if (state) {
const stateArr = parseOauthState(state)
if (stateArr.length > 2) {
return res.redirect(stateArr[2])
}
}
return res.view('/templates/discord_redirect.ejs')
}
}