2025-01-22 21:00:04 +01:00
|
|
|
import Database from "better-sqlite3"
|
2025-02-13 21:07:30 +01:00
|
|
|
import dayjs from "dayjs"
|
2025-02-09 12:35:08 +01:00
|
|
|
import type { OAuthTokenResponse } from "@sb1/types.ts"
|
2025-02-13 21:07:30 +01:00
|
|
|
import type {
|
|
|
|
TokenKey,
|
|
|
|
TokenResponse,
|
|
|
|
TokenResponseRaw,
|
|
|
|
} from "@sb1impl/db/types.ts"
|
|
|
|
import logger from "@common/logger.ts"
|
2025-01-22 21:00:04 +01:00
|
|
|
|
2025-01-26 19:29:43 +01:00
|
|
|
export function createDb(filepath: string) {
|
|
|
|
const db = new Database(filepath)
|
2025-02-13 21:07:30 +01:00
|
|
|
logger.info(`Started Sqlite database at '${filepath}'`)
|
2025-01-22 21:00:04 +01:00
|
|
|
db.pragma("journal_mode = WAL")
|
|
|
|
db.exec(
|
|
|
|
"CREATE TABLE IF NOT EXISTS tokens ('key' VARCHAR PRIMARY KEY, token VARCHAR NOT NULL, expires_at DATETIME NOT NULL)",
|
|
|
|
)
|
|
|
|
return db
|
|
|
|
}
|
2024-12-26 14:08:09 +01:00
|
|
|
|
|
|
|
export function insertTokens(
|
2025-01-22 21:00:04 +01:00
|
|
|
db: Database.Database,
|
2024-12-26 14:08:09 +01:00
|
|
|
oAuthToken: OAuthTokenResponse,
|
|
|
|
): void {
|
2025-01-22 21:00:04 +01:00
|
|
|
insertAccessToken(db, oAuthToken.access_token, oAuthToken.expires_in)
|
|
|
|
insertRefreshToken(
|
|
|
|
db,
|
|
|
|
oAuthToken.refresh_token,
|
|
|
|
oAuthToken.refresh_token_absolute_expires_in,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
function insertAccessToken(
|
|
|
|
db: Database.Database,
|
|
|
|
accessToken: string,
|
|
|
|
expiresIn: number,
|
|
|
|
) {
|
|
|
|
insert(db, "access-token", accessToken, expiresIn)
|
|
|
|
}
|
|
|
|
|
|
|
|
function insertRefreshToken(
|
|
|
|
db: Database.Database,
|
|
|
|
refreshToken: string,
|
|
|
|
expiresIn: number,
|
2025-02-06 19:13:23 +01:00
|
|
|
): void {
|
2025-01-22 21:00:04 +01:00
|
|
|
insert(db, "refresh-token", refreshToken, expiresIn)
|
|
|
|
}
|
|
|
|
|
|
|
|
function insert(
|
|
|
|
db: Database.Database,
|
|
|
|
key: TokenKey,
|
|
|
|
token: string,
|
|
|
|
expiresIn: number,
|
2025-02-06 19:13:23 +01:00
|
|
|
): void {
|
2025-01-22 21:00:04 +01:00
|
|
|
db.prepare("INSERT OR REPLACE INTO tokens VALUES (?, ?, ?)").run(
|
|
|
|
key,
|
|
|
|
token,
|
2025-01-25 18:01:47 +01:00
|
|
|
dayjs().add(expiresIn, "seconds").toISOString(),
|
2025-01-22 21:00:04 +01:00
|
|
|
)
|
2024-12-26 14:08:09 +01:00
|
|
|
}
|
|
|
|
|
2025-01-22 21:00:04 +01:00
|
|
|
export function fetchToken(
|
|
|
|
db: Database.Database,
|
|
|
|
tokenKey: TokenKey,
|
|
|
|
): TokenResponse | null {
|
2025-01-25 18:01:47 +01:00
|
|
|
const response = db
|
|
|
|
.prepare("SELECT * FROM tokens WHERE key = ?")
|
|
|
|
.get(tokenKey) as TokenResponseRaw | null
|
|
|
|
|
2024-12-26 14:08:09 +01:00
|
|
|
return (
|
2025-01-25 18:01:47 +01:00
|
|
|
response && {
|
|
|
|
...response,
|
|
|
|
expires_at: dayjs(response.expires_at),
|
|
|
|
}
|
2024-12-26 14:08:09 +01:00
|
|
|
)
|
|
|
|
}
|
2025-02-06 19:13:23 +01:00
|
|
|
|
|
|
|
export function clearTokens(db: Database.Database): void {
|
|
|
|
db.prepare("DELETE FROM tokens WHERE key in ( ?, ? )").run([
|
|
|
|
"access-token",
|
|
|
|
"refresh-token",
|
|
|
|
] as TokenKey[])
|
|
|
|
}
|