import { type Actual, ActualImpl } from "@/actual.ts" import { cronJobDaily } from "@/cron.ts" import { type Bank, Sparebank1Impl, type Transaction, } from "@/bank/sparebank1.ts" import { bankTransactionIntoActualTransaction } from "@/mappings.ts" import { ACTUAL_ACCOUNT_IDS, BANK_ACCOUNT_IDS } from "../config.ts" import logger from "pino" import type { UUID } from "node:crypto" // TODO Transports api for pino https://github.com/pinojs/pino/blob/HEAD/docs/transports.md // TODO create .cache if missing export async function daily(actual: Actual, bank: Bank): Promise { // Fetch transactions from the bank const transactions = await fetchTransactionsFromPastDay(bank) logger().info(`Fetched ${transactions.length} transactions`) // TODO multiple accounts const accountId = ACTUAL_ACCOUNT_IDS[0] as UUID const actualTransactions = transactions.map((transaction) => bankTransactionIntoActualTransaction(transaction, accountId), ) // TODO Import transactions into Actual // If multiple accounts, loop over them // Get account ID from mapper // TODO TypeError: Cannot read properties of undefined (reading 'timestamp') await actual.importTransactions(accountId, actualTransactions) } async function fetchTransactionsFromPastDay( bank: Bank, ): Promise> { // TODO refresh token const { access_token } = await bank.refreshToken("my_refresh_token") return bank.transactionsPastDay(BANK_ACCOUNT_IDS, access_token) } async function main(): Promise { logger().info("Starting application") const actual = await ActualImpl.init() logger().info("Initialized Actual Budget API") cronJobDaily(async () => { logger().info("Running daily job") await daily(actual, new Sparebank1Impl()) logger().info("Finished daily job") }) // logger().info("Shutting down") // await actual.shutdown() } void main()