2025-03-21 17:24:14 +01:00
|
|
|
import { SQL } from "bun";
|
2025-04-03 15:16:59 +02:00
|
|
|
import type { Token } from "./api/infos/token";
|
2025-03-21 17:24:14 +01:00
|
|
|
|
2025-03-22 13:50:49 +01:00
|
|
|
export const db = new SQL({url: process.env["URL_POSTGRESQL"]});
|
2025-03-21 17:24:14 +01:00
|
|
|
|
|
|
|
export const createTables = async (database: SQL): Promise<void> => {
|
|
|
|
return await database.begin(sql => sql`
|
|
|
|
CREATE TABLE IF NOT EXISTS tokens (
|
|
|
|
access_token text NOT NULL,
|
|
|
|
service text NOT NULL,
|
|
|
|
expires bigserial NOT NULL
|
|
|
|
)
|
|
|
|
`);
|
|
|
|
};
|
|
|
|
|
|
|
|
export const removeExpiredTokens = async (database: SQL): Promise<number> => {
|
|
|
|
const now = new Date();
|
|
|
|
const deleted_tokens: Token[] = await database.begin(sql => sql`
|
|
|
|
DELETE FROM tokens
|
|
|
|
WHERE expires <= ${Number(now)}
|
|
|
|
RETURNING *
|
|
|
|
`);
|
|
|
|
|
2025-03-22 13:50:49 +01:00
|
|
|
deleted_tokens.forEach(token => console.log("(DATABASE)", token.service, "token had expired on", new Date(Number(token.expires)), "and has been removed!"));
|
2025-03-21 17:24:14 +01:00
|
|
|
return deleted_tokens.length;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const addToken = async (database: SQL, token: {access_token: string, service: string, expires?: Date}): Promise<Token> => {
|
|
|
|
if (!token.expires) {
|
|
|
|
// Assume it expires in one day
|
|
|
|
token.expires = new Date();
|
|
|
|
token.expires.setHours(token.expires.getHours() + 24);
|
|
|
|
}
|
|
|
|
|
|
|
|
const returned: Token[] = await database.begin(sql => sql`
|
|
|
|
INSERT INTO tokens (access_token, service, expires)
|
|
|
|
VALUES (${token.access_token}, ${token.service}, ${Number(token.expires)})
|
|
|
|
RETURNING *
|
|
|
|
`);
|
|
|
|
|
2025-03-22 13:50:49 +01:00
|
|
|
returned.forEach(token => console.log("(DATABASE)", token.service, "token has been added"));
|
2025-03-21 17:24:14 +01:00
|
|
|
return returned[0];
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getToken = async (database: SQL, service: string): Promise<Token> => {
|
|
|
|
const now = new Date();
|
|
|
|
const tokens: Token[] = await database.begin(sql => sql`
|
|
|
|
SELECT * FROM tokens
|
|
|
|
WHERE service = ${service}
|
|
|
|
AND expires > ${Number(now)}
|
|
|
|
`);
|
|
|
|
return tokens[Math.floor(Math.random() * tokens.length)];
|
|
|
|
};
|