Split the logic between database and token stuff
This commit is contained in:
parent
717047cb96
commit
d76c9be59d
4 changed files with 79 additions and 108 deletions
|
@ -1,21 +1,10 @@
|
||||||
import { SQL } from "bun";
|
|
||||||
import * as osu from "osu-api-v2-js";
|
import * as osu from "osu-api-v2-js";
|
||||||
import {type OsuInfo} from "#Infos/Gaming/Osu.tsx";
|
import {type OsuInfo} from "#Infos/Gaming/Osu.tsx";
|
||||||
import {type Token} from "./token.tsx";
|
|
||||||
import type { Handler } from "../index.ts";
|
import type { Handler } from "../index.ts";
|
||||||
|
import { db, getToken } from "../database.ts";
|
||||||
|
|
||||||
export const gaming_osu: Handler = async (params) => {
|
export const gaming_osu: Handler = async (params) => {
|
||||||
const db = new SQL({
|
const token = await getToken(db, "osu");
|
||||||
username: "postgres"
|
|
||||||
});
|
|
||||||
await db.connect();
|
|
||||||
|
|
||||||
const tokens: Token[] = await db.begin(sql => sql`
|
|
||||||
SELECT * FROM tokens
|
|
||||||
WHERE service = ${"osu"}
|
|
||||||
LIMIT ${1}
|
|
||||||
`);
|
|
||||||
const token = tokens.at(0);
|
|
||||||
|
|
||||||
let ruleset = params.has("ruleset") ? Number(params.get("ruleset")) : undefined;
|
let ruleset = params.has("ruleset") ? Number(params.get("ruleset")) : undefined;
|
||||||
if (ruleset && isNaN(ruleset)) {ruleset = undefined;}
|
if (ruleset && isNaN(ruleset)) {ruleset = undefined;}
|
||||||
|
|
79
api/token.ts
79
api/token.ts
|
@ -1,4 +1,4 @@
|
||||||
import { SQL } from "bun";
|
import { addToken, createTables, db, getToken, removeExpiredTokens } from "../database";
|
||||||
import {API} from "osu-api-v2-js";
|
import {API} from "osu-api-v2-js";
|
||||||
import type { Handler } from "..";
|
import type { Handler } from "..";
|
||||||
|
|
||||||
|
@ -16,44 +16,17 @@ export const token: Handler = async (params) => {
|
||||||
return new Response("Bad Request", {status: 400});
|
return new Response("Bad Request", {status: 400});
|
||||||
}
|
}
|
||||||
|
|
||||||
const db = new SQL({
|
await createTables(db);
|
||||||
username: "postgres"
|
removeExpiredTokens(db);
|
||||||
});
|
const token = await getToken(db, service);
|
||||||
await db.connect();
|
|
||||||
await db.begin(sql => sql`
|
|
||||||
CREATE TABLE IF NOT EXISTS tokens (
|
|
||||||
access_token text,
|
|
||||||
expires bigserial,
|
|
||||||
service text
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
const tokens: Token[] = await db.begin(sql => sql`
|
|
||||||
SELECT * FROM tokens
|
|
||||||
WHERE service = ${service}
|
|
||||||
`);
|
|
||||||
|
|
||||||
const now = Number(new Date());
|
|
||||||
const token = tokens.find((t) => t.expires > now);
|
|
||||||
const expiredTokens = tokens.filter((t) => now > t.expires);
|
|
||||||
|
|
||||||
const promises: Promise<void>[] = [];
|
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
promises.push(new Promise(async (resolve, reject) => {
|
|
||||||
console.log(`Setting a new token for ${service}...`);
|
|
||||||
let new_tokens: Token[] = [];
|
|
||||||
|
|
||||||
if (service === "osu") {
|
if (service === "osu") {
|
||||||
const api = await API.createAsync(11451, process.env["API_OSU"]!);
|
const api = await API.createAsync(11451, process.env["API_OSU"]!);
|
||||||
new_tokens = await db.begin(sql => sql`
|
await addToken(db, {access_token: api.access_token, service: "osu", expires: api.expires});
|
||||||
INSERT INTO tokens (access_token, expires, service)
|
|
||||||
VALUES (${api.access_token}, ${Number(api.expires)}, ${service})
|
|
||||||
RETURNING *
|
|
||||||
`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (service === "umami") {
|
if (service === "umami") {
|
||||||
const response = await fetch("https://visitors.taevas.xyz/api/auth/login", {
|
const response = await fetch("https://visitors.taevas.xyz/api/auth/login", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -62,47 +35,9 @@ export const token: Handler = async (params) => {
|
||||||
body: `username=${process.env["USERNAME_UMAMI"]}&password=${process.env["PASSWORD_UMAMI"]}`
|
body: `username=${process.env["USERNAME_UMAMI"]}&password=${process.env["PASSWORD_UMAMI"]}`
|
||||||
});
|
});
|
||||||
const json: {token: string} = await response.json();
|
const json: {token: string} = await response.json();
|
||||||
|
await addToken(db, {access_token: json.token, service: "umami"});
|
||||||
// Assume it expires in one day
|
|
||||||
const date = new Date();
|
|
||||||
date.setHours(date.getHours() + 24);
|
|
||||||
new_tokens = await db.begin(sql => sql`
|
|
||||||
INSERT INTO tokens (access_token, expires, service)
|
|
||||||
VALUES (${json.token}, ${Number(date)}, ${service})
|
|
||||||
RETURNING *
|
|
||||||
`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
|
||||||
console.error(`Service "${service}" doesn't exist! Unable to set a new token...`);
|
|
||||||
return reject();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new_tokens.forEach((token) => {
|
|
||||||
console.log(`New ${service} token in the database, it'll expire on`, new Date(Number(token.expires)));
|
|
||||||
});
|
|
||||||
resolve();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (expiredTokens.length) {
|
|
||||||
promises.push(new Promise(async (resolve) => {
|
|
||||||
console.log(`Deleting old tokens for ${service}...`);
|
|
||||||
await Promise.all(expiredTokens.map(async (t) => {
|
|
||||||
return new Promise<void>(async (resolve) => {
|
|
||||||
await db.begin(sql => sql`
|
|
||||||
DELETE FROM tokens
|
|
||||||
WHERE access_token = ${t.access_token}
|
|
||||||
`);
|
|
||||||
console.log(`Old ${service} token that expired on`, new Date(Number(t.expires)), "has been deleted");
|
|
||||||
resolve();
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
resolve();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
await Promise.all(promises);
|
|
||||||
|
|
||||||
return new Response(null, {status: 200});
|
return new Response(null, {status: 200});
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,19 +1,9 @@
|
||||||
import { SQL } from "bun";
|
|
||||||
import type { Handler } from "../index.ts";
|
import type { Handler } from "../index.ts";
|
||||||
import type { UmamiInfo } from "#Infos/Website/Umami.tsx";
|
import type { UmamiInfo } from "#Infos/Website/Umami.tsx";
|
||||||
import type { Token } from "./token.ts";
|
import { db, getToken } from "../database.ts";
|
||||||
|
|
||||||
export const website_umami: Handler = async () => {
|
export const website_umami: Handler = async () => {
|
||||||
const db = new SQL({
|
const token = await getToken(db, "umami");
|
||||||
username: "postgres"
|
|
||||||
});
|
|
||||||
await db.connect();
|
|
||||||
const tokens: Token[] = await db.begin(sql => sql`
|
|
||||||
SELECT * FROM tokens
|
|
||||||
WHERE service = ${"umami"}
|
|
||||||
LIMIT ${1}
|
|
||||||
`);
|
|
||||||
const token = tokens.at(0);
|
|
||||||
|
|
||||||
const api_server = "https://visitors.taevas.xyz/api";
|
const api_server = "https://visitors.taevas.xyz/api";
|
||||||
const website_id = "f196d626-e609-4841-9a80-0dc60f523ed5";
|
const website_id = "f196d626-e609-4841-9a80-0dc60f523ed5";
|
||||||
|
|
57
database.ts
Normal file
57
database.ts
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
import { SQL } from "bun";
|
||||||
|
import type { Token } from "./api/token";
|
||||||
|
|
||||||
|
export const db = new SQL({
|
||||||
|
username: "postgres"
|
||||||
|
});
|
||||||
|
|
||||||
|
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 *
|
||||||
|
`);
|
||||||
|
if (deleted_tokens.length) {
|
||||||
|
console.log("Removed", deleted_tokens.length, "token(s) that had expired!");
|
||||||
|
}
|
||||||
|
|
||||||
|
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 *
|
||||||
|
`);
|
||||||
|
|
||||||
|
console.log("Added new token for", token.service);
|
||||||
|
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)];
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue