mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-03-21 18:04:39 -05:00
107 lines
2.9 KiB
TypeScript
107 lines
2.9 KiB
TypeScript
import { config } from "dotenv";
|
|
config();
|
|
|
|
import cors from "cors";
|
|
import express from "express";
|
|
import session from "express-session";
|
|
import cookieParser from "cookie-parser";
|
|
import passport from "passport";
|
|
import { Strategy as DiscordStrategy } from "passport-discord";
|
|
import { tournament as tournamentRouter } from "./old/scenes/tournament/router";
|
|
import { layout as layoutRouter } from "./old/scenes/layout/router";
|
|
import { createContext, createRouter } from "./old/utils/trpc-server";
|
|
import * as trpcExpress from "@trpc/server/adapters/express/dist/trpc-server-adapters-express.cjs";
|
|
import { upsertUser } from "./old/scenes/layout/service";
|
|
|
|
const PORT = 3001;
|
|
|
|
export const appRouter = createRouter()
|
|
.merge("tournament.", tournamentRouter)
|
|
.merge("layout.", layoutRouter);
|
|
export type AppRouter = typeof appRouter;
|
|
|
|
async function main() {
|
|
const app = express();
|
|
|
|
if (
|
|
process.env.DISCORD_CLIENT_ID &&
|
|
process.env.DISCORD_CLIENT_SECRET &&
|
|
process.env.DISCORD_CALLBACK_URL &&
|
|
process.env.COOKIE_SECRET
|
|
) {
|
|
passport.use(
|
|
new DiscordStrategy(
|
|
{
|
|
clientID: process.env.DISCORD_CLIENT_ID,
|
|
clientSecret: process.env.DISCORD_CLIENT_SECRET,
|
|
callbackURL: process.env.DISCORD_CALLBACK_URL,
|
|
scope: ["identify", "connections"],
|
|
},
|
|
function (_accessToken, refreshToken, loggedInUser, cb) {
|
|
upsertUser({ loggedInUser, refreshToken })
|
|
.then((user) => {
|
|
return cb(null, {
|
|
id: user.id,
|
|
discordId: user.discordId,
|
|
discordAvatar: user.discordAvatar,
|
|
});
|
|
})
|
|
.catch((err) => cb(err));
|
|
}
|
|
)
|
|
);
|
|
|
|
passport.serializeUser(function (user, done) {
|
|
done(null, user);
|
|
});
|
|
|
|
passport.deserializeUser(function (user, done) {
|
|
// @ts-expect-error it is guaranteed it's of a certain shape without an extra check
|
|
done(null, user);
|
|
});
|
|
|
|
app.use(cookieParser());
|
|
app.use(
|
|
session({
|
|
secret: process.env.COOKIE_SECRET,
|
|
resave: true,
|
|
saveUninitialized: true,
|
|
})
|
|
);
|
|
app.use(passport.initialize());
|
|
app.use(passport.session());
|
|
app.post("/auth/discord", passport.authenticate("discord"));
|
|
app.get(
|
|
"/auth/discord/callback",
|
|
passport.authenticate("discord", {
|
|
failureRedirect: "/login",
|
|
successRedirect: process.env.FRONTEND_URL,
|
|
})
|
|
);
|
|
} else {
|
|
console.warn("Logging in not set up because of missing env vars");
|
|
}
|
|
|
|
app.use(cors({ origin: process.env.FRONTEND_URL, credentials: true }));
|
|
|
|
app.use((req, _res, next) => {
|
|
console.log("⬅️ ", req.method, req.path, req.body ?? req.query);
|
|
|
|
next();
|
|
});
|
|
|
|
app.use(
|
|
"/trpc",
|
|
trpcExpress.createExpressMiddleware({
|
|
router: appRouter,
|
|
createContext,
|
|
})
|
|
);
|
|
|
|
app.listen(PORT, () => {
|
|
console.log(`listening on port ${PORT}`);
|
|
});
|
|
}
|
|
|
|
main();
|