From a2584b97a17318640274037312f10ee708bb8661 Mon Sep 17 00:00:00 2001 From: Martin Berg Alstad Date: Thu, 27 Feb 2025 21:13:01 +0100 Subject: [PATCH] :sparkles: Added Sb1 Actual integration to projects. - Code style is Catppuccin Mocha - Added lang tag to project - Added keywords to project - Sort projects by latest updated --- TODO.md | 10 +- astro.config.mjs | 5 + src/components/projects/MyProjectsPage.astro | 8 +- src/components/projects/ProjectGrid.astro | 36 +++--- src/components/projects/ProjectPage.astro | 10 +- src/content/config.ts | 2 + .../projects/assets/is_it_worth_the_time.png | Bin 0 -> 64050 bytes src/content/projects/homepage.mdx | 2 + src/content/projects/sb1budget.mdx | 115 ++++++++++++++++++ src/pages/en/projects/[project].astro | 5 +- src/pages/en/projects/index.astro | 5 +- src/pages/projects/[project].astro | 5 +- src/pages/projects/index.astro | 5 +- 13 files changed, 175 insertions(+), 33 deletions(-) create mode 100644 src/content/projects/assets/is_it_worth_the_time.png create mode 100644 src/content/projects/sb1budget.mdx diff --git a/TODO.md b/TODO.md index 1c4cebf..d3bb1fd 100644 --- a/TODO.md +++ b/TODO.md @@ -6,6 +6,7 @@ - [ ] Nix Shell - [ ] Analytics - [ ] Organize code better +- [ ] Type slug of project ## SEO - [ ] Meta tags on each page @@ -13,6 +14,7 @@ ## Layout - [ ] Dark mode toggle - [ ] Navigate using pathname / breadcrumbs +- [ ] Better style for blocks ## Accessibility - [ ] All interactable elements have labels @@ -31,10 +33,16 @@ ## ~/projects - [ ] Translate projects +- [ ] NixOS on desktop +- [ ] RSS Feed + +## ~/projects/[project] +- [ ] Only use Gitea icon for Gitea links - [ ] Bachelor project - [ ] Sparebank1 ActualBudget service - [ ] More about this website -- [ ] RSS Feed +- [ ] Copy link to h tag and scroll to h tag on load +- [x] External links should open in new tab ## ~/slashes - [ ] List of all slashes diff --git a/astro.config.mjs b/astro.config.mjs index c11c5ff..de004ed 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -38,6 +38,11 @@ export default defineConfig({ vite: { plugins: [tailwindcss()], }, + markdown: { + shikiConfig: { + theme: "catppuccin-mocha", + }, + }, env: { schema: { DOMAIN: envField.string({ context: "client", access: "public" }), diff --git a/src/components/projects/MyProjectsPage.astro b/src/components/projects/MyProjectsPage.astro index 92d16ad..9701290 100644 --- a/src/components/projects/MyProjectsPage.astro +++ b/src/components/projects/MyProjectsPage.astro @@ -1,12 +1,8 @@ --- +import { getCollection } from "astro:content" import ProjectGrid from "./ProjectGrid.astro" -import { type CollectionEntry } from "astro:content" -interface Props { - projects: CollectionEntry<"projects">[] -} - -const { projects } = Astro.props +const projects = await getCollection("projects") --- diff --git a/src/components/projects/ProjectGrid.astro b/src/components/projects/ProjectGrid.astro index fe8b2dc..6451c93 100644 --- a/src/components/projects/ProjectGrid.astro +++ b/src/components/projects/ProjectGrid.astro @@ -2,6 +2,7 @@ import type { Project } from "@/types/types" import type { NavLink } from "@/utils/linking" import ProjectCard from "./ProjectCard.astro" +import dayjs from "dayjs" interface Props { projects: ReadonlyArray @@ -14,19 +15,26 @@ const baseUrl: NavLink = "/projects"
{ - projects.map( - ({ data: { title, description, tags, heroImage, heroImageAlt }, id }) => ( -
- -
- ), - ) + projects + .toSorted((a, b) => + dayjs(a.data.updatedAt).isBefore(dayjs(b.data.updatedAt)) ? 1 : -1, + ) + .map( + ({ + data: { title, description, tags, heroImage, heroImageAlt }, + id, + }) => ( +
+ +
+ ), + ) }
diff --git a/src/components/projects/ProjectPage.astro b/src/components/projects/ProjectPage.astro index f54a0c4..526508e 100644 --- a/src/components/projects/ProjectPage.astro +++ b/src/components/projects/ProjectPage.astro @@ -18,6 +18,7 @@ const { project } = Astro.props const entry = await getEntry("projects", project) const { Content } = await render(entry!) const { + lang, title, description, tags, @@ -29,7 +30,10 @@ const { } = entry!.data function localeDateString(isoString: string): string { - return dayjs(isoString).locale(languageTag()).format("YYYY-MM-DD") + if (languageTag() === "nb") { + return dayjs(isoString).locale(languageTag()).format("DD/MM/YYYY") + } + return dayjs(isoString).locale(languageTag()).format("DD-MM-YYYY") } --- @@ -53,5 +57,7 @@ function localeDateString(isoString: string): string {

{description}

- +
+ +
diff --git a/src/content/config.ts b/src/content/config.ts index fa2fb71..36633ba 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -5,11 +5,13 @@ const projectCollection = defineCollection({ loader: glob({ pattern: "**\/*.mdx", base: "./src/content/projects" }), schema: ({ image }) => z.object({ + lang: z.union([z.literal("en"), z.literal("nb")]), title: z.string(), description: z.string(), heroImage: image(), heroImageAlt: z.string(), tags: z.array(z.string()), + keywords: z.array(z.string()), source: z.string().url(), createdAt: z.string().date(), updatedAt: z.string().date(), diff --git a/src/content/projects/assets/is_it_worth_the_time.png b/src/content/projects/assets/is_it_worth_the_time.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ac46e84b6706c31bf757d96b593c5bddf9f65c GIT binary patch literal 64050 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 literal 0 HcmV?d00001 diff --git a/src/content/projects/homepage.mdx b/src/content/projects/homepage.mdx index bc085c5..6b4a561 100644 --- a/src/content/projects/homepage.mdx +++ b/src/content/projects/homepage.mdx @@ -1,9 +1,11 @@ --- +lang: "en" title: "Welcome" description: "Welcome to my homepage / portfolio" heroImage: "assets/recursive-meme.png" heroImageAlt: "A recursive meme that says: Self-reference, recursive meme is self-referential" tags: [Astro, Svelte, TypeScript, I18n, TailwindCSS, Docker] +keywords: [] source: "https://git.martials.no/martials/martials.no" createdAt: "2024-09-22" updatedAt: "2025-02-15" diff --git a/src/content/projects/sb1budget.mdx b/src/content/projects/sb1budget.mdx new file mode 100644 index 0000000..f94dd4e --- /dev/null +++ b/src/content/projects/sb1budget.mdx @@ -0,0 +1,115 @@ +--- +lang: "en" +title: "Sparebank1 - Actual Budget" +description: "Automatically import transactions from Sparebank1 bank accounts to Actual Budget." +heroImage: "assets/is_it_worth_the_time.png" +heroImageAlt: "A diagram that shows how much time is saved automating a tasks rather than doing it manually." +tags: [TypeScript, Docker, Node, CronJob, Sqlite, API-management] +keywords: [Finance, Sparebank1, Sparebank1 Utvikling, Sparebank1 API, Actual Budget API] +source: "https://git.martials.no/martials/sparebank1_actual_budget_integration" +createdAt: "2025-02-27" +updatedAt: "2025-02-27" +--- + +import ExternalLink from "@/components/links/ExternalLink.astro" + +## What is it? + +Actual Budget is an open-source budgeting platform, it can very simply be self-hosted and accessed throught the browser. +While Sparebank1 is a Norwegian bank, with a great developer experience and an easy to use API that can be used to fetch transactions for example. + +Actual has an API that can be used to interact with your own instance of Actual, like importing transactions. + +Which is what the Sparebank1 Actual Budget integration does. It fetches transactions from my accounts in Sparebank1 and imports them automatically into Actual. +The operation runs daily and can be configured to import from multiple accounts at once. + +The purpose of this application is to automatically transfer transactions to the budget, to avoid doing it manually often, or once in a while. + +
+ +## The techy stuff + +Since the Actual Budget API is an NPM package, the application had to be created in TypeScript. +I looked at options to NodeJS but neither Bun or Deno was compatible with the *better-sqlite3* package which was a dependency to the API, +so the best option for now was NodeJS. + +The application runs a cronJob that executes once a day at 1 am. The specific time is not really that important since it fetches transactions from 3-4 days before the day it runs. +This is done to avoid fetching transactions which are not fully cleared yet. Some transactions can even be cleared but the unique Id for the transaction might not be set yet. +Actual uses that unique Id in order to avoid duplicate transactions, and makes it possible to update transactions if the content has changed. + +Rules can be defined within the Actual application, so transactions are automatically sorted into the correct categories on import. + +The application supports importing multiple accounts from a single user. +This is done by specifying the account keys to Sparebank1 and a equal length array of ids for the Actual accounts. + +
+ +### Low Coupling + +In order to make it easy to reuse the same application for other banks, it was created with low coupling in mind. +Interfaces are defined for the different parts of the application, and in order to implement it for any other bank, +the `Bank` interface can be implemented on any class, and requires two methods. + +
+ +```ts +export interface Bank { + fetchTransactions: ( + interval: Interval, + ...accountKeys: ReadonlyArray + ) => Promise> + + shutdown: () => Promise | void +} +``` + +
+ +### Authentication + +Both Sparebank1 and Actual requires different secrets and keys to work. + +Actual only requires that secrets are passed into the client that handles the requests, but Sparebank1 requires more effort in order to fetch data. +First it requires a *authentication code* that can only be fetched using my own BankID account. +The authentication code must be swapped for a *refresh token* within 2 minutes or the process must be started over. +The refresh token has a lifetime of a year unless used, so it can be saved for later use. +The refresh token is added as an environmental variable that can be used to fetch the first *access token*. +After that, both the new refresh token and access token is stored in a Sqlite database so they can be reused until they expire. + +
+ +### Deployement + +The application runs in a docker container on my [Homelab](/uses). +It is build from a Gitea Act runner that adds the needed secrets and variables from the Gitea instance. + +
+ +```yaml +name: Deploy application + +on: + push: + branches: [main] + +jobs: + deploy: + runs-on: host + + env: + # Secrets and vars + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Run docker-compose + run: docker compose up -d --build +``` + +
+ +## The road ahead + +Future plans incude adding more features to the application and some more error handling. +Then potentially implementing the integration for other banks or credit cards to automate even more. + +I also want to rewrite it in Bun when they implement the needed APIs to get Better-sqlite3 working. diff --git a/src/pages/en/projects/[project].astro b/src/pages/en/projects/[project].astro index 225c1da..f879eff 100644 --- a/src/pages/en/projects/[project].astro +++ b/src/pages/en/projects/[project].astro @@ -7,7 +7,10 @@ import "@/styles/global.css" export const prerender = true export function getStaticPaths(): GetStaticPathsResult { - return [{ params: { project: "homepage" } }] + return [ + { params: { project: "homepage" } }, + { params: { project: "sb1budget" } }, + ] } const { project } = Astro.params diff --git a/src/pages/en/projects/index.astro b/src/pages/en/projects/index.astro index e66cc42..f83d8f5 100644 --- a/src/pages/en/projects/index.astro +++ b/src/pages/en/projects/index.astro @@ -1,12 +1,9 @@ --- -import { getCollection } from "astro:content" import Layout from "@/layouts/Layout.astro" import MyProjectsPage from "@/components/projects/MyProjectsPage.astro" import "@/styles/global.css" - -const projects = await getCollection("projects") --- - + diff --git a/src/pages/projects/[project].astro b/src/pages/projects/[project].astro index 225c1da..f879eff 100644 --- a/src/pages/projects/[project].astro +++ b/src/pages/projects/[project].astro @@ -7,7 +7,10 @@ import "@/styles/global.css" export const prerender = true export function getStaticPaths(): GetStaticPathsResult { - return [{ params: { project: "homepage" } }] + return [ + { params: { project: "homepage" } }, + { params: { project: "sb1budget" } }, + ] } const { project } = Astro.params diff --git a/src/pages/projects/index.astro b/src/pages/projects/index.astro index ff76802..ee450ee 100644 --- a/src/pages/projects/index.astro +++ b/src/pages/projects/index.astro @@ -1,12 +1,9 @@ --- -import { getCollection } from "astro:content" import Layout from "@/layouts/Layout.astro" import MyProjectsPage from "@/components/projects/MyProjectsPage.astro" import "@/styles/global.css" - -const projects = await getCollection("projects") --- - +