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 refreshToken: (refreshToken: string) => Promise transactionsPastDay: ( accountKeys: ReadonlyArray | string, accessToken: string, ) => Promise> } export class Sparebank1Impl implements Sparebank1 { private baseUrl = "https://api.sparebank1.no" async accessToken(): Promise { const response = await fetch(`${this.baseUrl}/oauth/authorize? 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 { throw new Error("Not implemented") } async transactionsPastDay( accountKeys: ReadonlyArray | string, accessToken: string, ): Promise> { throw new Error("Not implemented") } }