gluestick/src/prisma.ts

89 lines
1.9 KiB
TypeScript

import { Prisma, PrismaClient } from "@prisma/client";
import { DiscordAuthProvider } from "./auth/discord";
import { getLogger } from "./logger";
const logger = getLogger("prisma.ts");
async function refreshDiscordTokens(prisma: PrismaClient) {
// refresh 6 hours before expiry
const refreshWindow = 6 * 60 * 60 * 1000;
const discordAuths = await prisma.discordAuth.findMany({
where: {
expiresAt: {
lte: new Date(Date.now() + refreshWindow)
},
invalid: false
}
});
for (const discordAuth of discordAuths) {
const data = await DiscordAuthProvider.refreshToken(
discordAuth.refreshToken
);
if (data === null) {
logger.warn(
{
user: discordAuth.userId,
id: discordAuth.id
},
"failed to refresh discord token"
);
await prisma.discordAuth.update({
where: {
id: discordAuth.id
},
data: {
invalid: true
}
});
} else {
await prisma.discordAuth.update({
where: {
id: discordAuth.id
},
data: {
accessToken: data.access_token,
refreshToken: data.refresh_token,
expiresAt: new Date(Date.now() + data.expires_in * 1000)
}
});
}
}
}
async function expireTickets(prisma: PrismaClient) {
const expired = await prisma.authTicket.findMany({
where: {
expiresAt: {
lte: new Date()
}
}
});
for (const ticket of expired) {
await prisma.authTicket.delete({
where: {
id: ticket.id
}
});
}
}
let prisma: PrismaClient;
if (global.prisma == undefined) {
global.prisma = new PrismaClient();
prisma = global.prisma;
setInterval(async () => {
await refreshDiscordTokens(prisma);
await expireTickets(prisma);
}, 60 * 1000);
} else {
prisma = global.prisma;
}
export default prisma;