39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import Router, {Request, Response} from 'express';
|
|
import {createTokenByCode, getUser} from "../../controller/discord";
|
|
import {User} from "../../models/User";
|
|
import {Token} from "../../models/Token";
|
|
|
|
const app = Router();
|
|
|
|
app.post("/create", async (req: Request, res: Response) => {
|
|
// Check if a code has been provided
|
|
if (!req.body.code) return res.status(400).json({message: "You need to provide a code"});
|
|
|
|
// Check if the provided token is valid
|
|
const token = await createTokenByCode(req.body.code).catch(() => undefined);
|
|
if (!token) return res.status(400).json({message: "The provided token is wrong"});
|
|
|
|
// Check if all scopes have been provided
|
|
const scopes = token.scope.split(" ");
|
|
if (!(scopes.includes("identify") && scopes.includes("guilds"))) return res.status(400).json({message: "The provided token is wrong"});
|
|
|
|
// Get user data
|
|
const userData = await getUser(token.access_token).catch(() => undefined);
|
|
if (!userData) return res.status(400).json({message: "The provided token is wrong"});
|
|
|
|
await User.upsert({
|
|
clientId: userData.id, avatarId: userData.avatar === null ? undefined : userData.avatar,
|
|
locale: userData.locale, accessToken: token.access_token, refreshToken: token.refresh_token,
|
|
refreshDate: new Date(Date.now() + token.expires_in), username: userData.username
|
|
});
|
|
|
|
// Create token
|
|
const appToken = await Token.create({clientId: userData.id, userAgent: req.headers['user-agent']});
|
|
|
|
// Return token
|
|
res.json({token: appToken.token});
|
|
});
|
|
|
|
// TODO: Route to delete a session & list all current sessions
|
|
|
|
module.exports = app; |