2024-11-15 22:55:53 +01:00
|
|
|
import * as actual from "@actual-app/api"
|
|
|
|
import {
|
|
|
|
ACTUAL_DATA_DIR,
|
|
|
|
ACTUAL_PASSWORD,
|
|
|
|
ACTUAL_SERVER_URL,
|
|
|
|
} from "../config.ts"
|
2024-11-17 22:27:29 +01:00
|
|
|
import type { TransactionEntity } from "@actual-app/api/@types/loot-core/types/models"
|
|
|
|
import { type UUID } from "node:crypto"
|
|
|
|
|
|
|
|
export interface Actual {
|
|
|
|
importTransactions: (
|
|
|
|
accountId: UUID,
|
|
|
|
transactions: ReadonlyArray<TransactionEntity>,
|
|
|
|
) => Promise<ImportTransactionsResponse>
|
|
|
|
|
|
|
|
shutdown: () => Promise<void>
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface Message {
|
|
|
|
message: string
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface ImportTransactionsResponse {
|
|
|
|
errors?: Message[]
|
|
|
|
added: number
|
|
|
|
updated: number
|
|
|
|
}
|
|
|
|
|
|
|
|
export class ActualImpl implements Actual {
|
|
|
|
private constructor() {}
|
|
|
|
|
|
|
|
static async init(): Promise<Actual> {
|
|
|
|
await actual.init({
|
|
|
|
// Budget data will be cached locally here, in subdirectories for each file.
|
|
|
|
dataDir: ACTUAL_DATA_DIR,
|
|
|
|
// This is the URL of your running server
|
|
|
|
serverURL: ACTUAL_SERVER_URL,
|
|
|
|
// This is the password you use to log into the server
|
|
|
|
password: ACTUAL_PASSWORD,
|
|
|
|
})
|
|
|
|
return new ActualImpl()
|
|
|
|
}
|
|
|
|
|
|
|
|
async importTransactions(
|
|
|
|
accountId: UUID,
|
|
|
|
transactions: ReadonlyArray<TransactionEntity>,
|
|
|
|
): Promise<ImportTransactionsResponse> {
|
|
|
|
return await actual.importTransactions(accountId, transactions)
|
|
|
|
}
|
|
|
|
|
|
|
|
async shutdown() {
|
|
|
|
return await actual.shutdown()
|
|
|
|
}
|
|
|
|
}
|