61 lines
2.0 KiB
TypeScript
Raw Normal View History

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"
2024-11-15 22:55:53 +01:00
// TODO Transports api for pino https://github.com/pinojs/pino/blob/HEAD/docs/transports.md
// TODO create .cache if missing
2024-11-15 22:55:53 +01:00
export async function daily(actual: Actual, bank: Bank): Promise<void> {
// Fetch transactions from the bank
const transactions = await fetchTransactionsFromPastDay(bank)
logger.info(`Fetched ${transactions.length} transactions`)
2024-11-15 22:55:53 +01:00
// 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<ReadonlyArray<Transaction>> {
// TODO refresh token
const { access_token } = await bank.refreshToken("my_refresh_token")
return bank.transactionsPastDay(BANK_ACCOUNT_IDS, access_token)
}
2024-11-15 22:55:53 +01:00
async function main(): Promise<void> {
logger.info("Starting application")
const actual = await ActualImpl.init()
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()
2024-11-15 22:55:53 +01:00
}
void main()