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 "@/logger.ts" import type { UUID } from "node:crypto" import Database from "better-sqlite3" // TODO Transports api for pino https://github.com/pinojs/pino/blob/HEAD/docs/transports.md // TODO create .cache if missing // TODO store oauth tokens in a SQLite db, use same dep as actual 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), ) logger.debug( `Mapped ${JSON.stringify(transactions)} to ${JSON.stringify(actualTransactions)} transactions`, ) // TODO Import transactions into Actual // If multiple accounts, loop over them // Get account ID from mapper const response = await actual.importTransactions( accountId, actualTransactions, ) logger.info(`ImportTransactionsResponse=${JSON.stringify(response)}`) } async function fetchTransactionsFromPastDay( bank: Bank, ): Promise> { return bank.transactionsPastDay(BANK_ACCOUNT_IDS) } async function main(): Promise { logger.info("Starting application") const actual = await ActualImpl.init() const databaseFileName = "default.sqlite" const db = new Database(databaseFileName) logger.info(`Started SQLlite database with filename="${databaseFileName}"`) logger.info("Waiting for CRON job to start") cronJobDaily(async () => { logger.info("Running daily job") await daily(actual, new Sparebank1Impl()) logger.info("Finished daily job") }) // logger.info("Shutting down") // await actual.shutdown() // db.close() } void main()