2025-01-22 21:00:04 +01:00
|
|
|
import Database from "better-sqlite3"
|
|
|
|
|
2024-12-26 14:08:09 +01:00
|
|
|
import { type OAuthTokenResponse } from "@/bank/sparebank1.ts"
|
2025-01-22 21:00:04 +01:00
|
|
|
import dayjs, { type Dayjs } from "dayjs"
|
|
|
|
|
|
|
|
export type TokenResponse = {
|
|
|
|
key: TokenKey
|
|
|
|
token: string
|
|
|
|
expires_at: Dayjs
|
|
|
|
}
|
2024-12-26 14:08:09 +01:00
|
|
|
|
2025-01-25 18:01:47 +01:00
|
|
|
export type TokenResponseRaw = {
|
|
|
|
key: TokenResponse["key"]
|
|
|
|
token: TokenResponse["token"]
|
|
|
|
expires_at: string
|
|
|
|
}
|
|
|
|
|
2025-01-22 21:00:04 +01:00
|
|
|
export type TokenKey = "access-token" | "refresh-token"
|
|
|
|
|
|
|
|
export function createDb(filename: string) {
|
|
|
|
const db = new Database(filename)
|
|
|
|
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,
|
|
|
|
) {
|
|
|
|
insert(db, "refresh-token", refreshToken, expiresIn)
|
|
|
|
}
|
|
|
|
|
|
|
|
function insert(
|
|
|
|
db: Database.Database,
|
|
|
|
key: TokenKey,
|
|
|
|
token: string,
|
|
|
|
expiresIn: number,
|
|
|
|
) {
|
|
|
|
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
|
|
|
)
|
|
|
|
}
|