68 lines
1.7 KiB
TypeScript
Raw Normal View History

2024-11-15 22:55:53 +01:00
import {
SPAREBANK1_OAUTH_CLIENT_ID,
SPAREBANK1_OAUTH_REDIRECT_URI,
SPAREBANK1_OAUTH_STATE,
} from "../config.ts"
// TODO move types
export interface OAuthTokenResponse {
access_token: string
expires_in: number
refresh_token_expires_in: number
refresh_token_absolute_expires_in: number
token_type: "Bearer"
refresh_token: string
}
export interface Transaction {
id: string
date: string
amount: number
description: string
cleanedDescription: string
remoteAccountName: string
[key: string]: string | number | boolean | unknown
}
export type Bank = Sparebank1
export interface Sparebank1 {
accessToken: () => Promise<OAuthTokenResponse>
refreshToken: (refreshToken: string) => Promise<OAuthTokenResponse>
transactionsPastDay: (
accountKeys: ReadonlyArray<string> | string,
accessToken: string,
) => Promise<ReadonlyArray<Transaction>>
}
export class Sparebank1Impl implements Sparebank1 {
private baseUrl = "https://api.sparebank1.no"
async accessToken(): Promise<OAuthTokenResponse> {
const response = await fetch(`${this.baseUrl}/oauth/authorize?
2024-11-15 22:55:53 +01:00
client_id=${SPAREBANK1_OAUTH_CLIENT_ID}&
state=${SPAREBANK1_OAUTH_STATE}&
redirect_uri=${SPAREBANK1_OAUTH_REDIRECT_URI}&
finInst=fid-smn&
response_type=code`)
if (response.ok) {
return await response.json()
}
throw new Error(`Failed to get access token. ${response.statusText}`)
}
async refreshToken(refreshToken: string): Promise<OAuthTokenResponse> {
throw new Error("Not implemented")
}
async transactionsPastDay(
accountKeys: ReadonlyArray<string> | string,
accessToken: string,
): Promise<ReadonlyArray<Transaction>> {
throw new Error("Not implemented")
}
2024-11-15 22:55:53 +01:00
}