89 lines
1.9 KiB
TypeScript
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;
|