diff options
| author | ivar <i@oiee.no> | 2026-06-22 00:46:09 +0200 |
|---|---|---|
| committer | ivar <i@oiee.no> | 2026-06-22 00:46:09 +0200 |
| commit | b8b6e229281be13258715870ddd0c2e1866dee12 (patch) | |
| tree | cc136a2d0c2d9c031ec0b21f62c8a9f302e0ff57 /app/src/routes | |
| parent | 1aa60ed7f0b0af6c55df4a32bf2620934df63e6d (diff) | |
| download | sparebank1-actualbudget-b8b6e229281be13258715870ddd0c2e1866dee12.tar.xz sparebank1-actualbudget-b8b6e229281be13258715870ddd0c2e1866dee12.zip | |
Diffstat (limited to 'app/src/routes')
| -rw-r--r-- | app/src/routes/+page.server.ts | 15 | ||||
| -rw-r--r-- | app/src/routes/+page.svelte | 94 | ||||
| -rw-r--r-- | app/src/routes/methods.remote.ts | 38 | ||||
| -rw-r--r-- | app/src/routes/sb1-authorize/+server.ts | 48 | ||||
| -rw-r--r-- | app/src/routes/status.svelte | 17 |
5 files changed, 0 insertions, 212 deletions
diff --git a/app/src/routes/+page.server.ts b/app/src/routes/+page.server.ts deleted file mode 100644 index df076d7..0000000 --- a/app/src/routes/+page.server.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { PageServerLoad } from './$types'; -import actual from '$lib/server/actual'; -import sb1 from "$lib/server/sb1" - -export const load = (async () => { - return { - actual: { - budgets: await actual.budget.get_budgets(), - accounts: await actual.budget.get_accounts(), - }, - sb1: { - accounts: (await sb1.data.get_accounts())?.accounts - } - }; -}) satisfies PageServerLoad;
\ No newline at end of file diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte deleted file mode 100644 index 693a430..0000000 --- a/app/src/routes/+page.svelte +++ /dev/null @@ -1,94 +0,0 @@ -<script lang="ts"> - import Button from "$lib/ui/button.svelte"; - import { - clear_auth_session, - init_auth_session, - do_import, - } from "./methods.remote"; - import type { PageProps } from "./$types"; - import type { ImportForm } from "$lib/shared"; - - let { data }: PageProps = $props(); - let navigating = $state(false); - let form = $state<ImportForm>({ - budgetId: "", - mappings: [], - dryRun: true, - }); - - async function run(e: SubmitEvent) { - e.preventDefault(); - if (!form.mappings.length) { - return; - } - await do_import(form); - } - - async function authorize() { - navigating = true; - location.href = await init_auth_session(); - } - - async function logout() { - navigating = true; - await clear_auth_session(); - location.reload(); - } - - function onMappingChanged(sb1Id: string, actualId: string) { - let mappings = form.mappings; - if (mappings.find((c) => c.sb1Id === sb1Id)) - mappings = mappings.filter((c) => c.sb1Id !== sb1Id); - mappings.push({ sb1Id, actualId }); - form.mappings = mappings; - } -</script> - -<main> - {#if data.sb1.accounts?.length} - <form onsubmit={run}> - <h3>Importer</h3> - <fieldset> - <h4>Kontoer</h4> - {#each data.sb1.accounts as account} - {@const actualId = `mapping-${account.key}-actual`} - <div> - <code>{account.name}</code> - <span>→</span> - <label for={actualId}>Actual</label> - <select - name={actualId} - id={actualId} - onchange={(e) => - onMappingChanged( - account.key, - e.currentTarget.value, - )} - > - <option value="-" selected>-</option> - {#each data.actual.accounts as actual} - <option value={actual.id}> - {actual.name} - </option> - {/each} - </select> - </div> - {/each} - <h4>Ellers</h4> - <input - type="checkbox" - id="dry" - bind:checked={form.dryRun} - /><label for="dry">Tørrkjøring</label><br /><br /> - <input type="submit" /> - </fieldset> - </form> - <h3>Annet</h3> - <Button onclick={logout} loading={navigating}>Logg ut</Button> - <div></div> - {:else} - <Button onclick={authorize} loading={navigating} - >Autentisér hos Sparebanken 1</Button - > - {/if} -</main> diff --git a/app/src/routes/methods.remote.ts b/app/src/routes/methods.remote.ts deleted file mode 100644 index d6fd908..0000000 --- a/app/src/routes/methods.remote.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { db } from "$lib/server/db"; -import { SyncSessionTable } from "$lib/server/db/schema"; -import { command, query } from "$app/server"; -import sb1 from "$lib/server/sb1"; -import actual from "$lib/server/actual"; -import { ImportForm } from "$lib/shared"; - -const init_auth_session = command(async () => { - return await sb1.auth.init_auth_session() -}) - -const clear_auth_session = query(async () => { - await db.delete(SyncSessionTable) -}) - -const do_import = command(ImportForm, async (form) => { - for (const mapping of form.mappings) { - const transactions = await sb1.data.get_transactions(mapping.sb1Id) - if (!transactions?.length) continue - console.log(await actual.budget.import_transactions(mapping.actualId, transactions, form.dryRun)) - } -}) - -const init_sb1 = command(async () => { - return await sb1.init() -}) - -const init_actual = command(async () => { - return await actual.init() -}) - -export { - init_auth_session, - do_import, - init_actual, - init_sb1, - clear_auth_session -} diff --git a/app/src/routes/sb1-authorize/+server.ts b/app/src/routes/sb1-authorize/+server.ts deleted file mode 100644 index d6b8fbf..0000000 --- a/app/src/routes/sb1-authorize/+server.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { error, redirect, json } from '@sveltejs/kit'; -import type { RequestHandler } from './$types'; -import { db } from '$lib/server/db'; -import { SyncSessionTable } from '$lib/server/db/schema'; -import { eq } from 'drizzle-orm'; -import { SB1_ID, SB1_REDIRECT_URI, SB1_SECRET } from '$env/static/private'; -import { Temporal } from "temporal-polyfill" -import sb1 from "$lib/server/sb1" - -export const GET: RequestHandler = async ({ url }) => { - const code = url.searchParams.get('code') - const state = url.searchParams.get('state'); - - if (!code) error(400, "?code is missing") - if (!state) error(400, "?state is missing") - - const session = await db.select().from(SyncSessionTable).where(eq(SyncSessionTable.authzState, state)) - const { id } = session[0] - if (!id) return error(500, "Ingen session") - - const fd = new URLSearchParams() - - fd.set("client_id", SB1_ID) - fd.set("client_secret", SB1_SECRET) - fd.set("redirect_uri", SB1_REDIRECT_URI) - fd.set("code", code) - fd.set("state", state) - fd.set("grant_type", "authorization_code") - - const response = await fetch("https://api.sparebank1.no/oauth/token", { - method: "post", - headers: { - "Content-Type": "application/x-www-form-urlencoded" - }, - body: fd - }) - - const responseJson = await response.json() - - if (response.ok) { - const epoch = Temporal.Now.instant().epochMilliseconds - await db.update(SyncSessionTable).set({ tokens: responseJson, accessTokenCreated: epoch.toString(), refreshTokenCreated: epoch.toString() }).where(eq(SyncSessionTable.id, id)) - await sb1.init() - redirect(302, "/") - } else { - return json(responseJson) - } -} diff --git a/app/src/routes/status.svelte b/app/src/routes/status.svelte deleted file mode 100644 index fe09193..0000000 --- a/app/src/routes/status.svelte +++ /dev/null @@ -1,17 +0,0 @@ -<script lang="ts"> - type Props = { - type: "sb1" | "actual"; - }; - import { onMount } from "svelte"; - let { type }: Props = $props(); - - onMount(() => {}); -</script> - -<div> - <span>{type}</span> - <div class="status"></div> - <div class="refresh">⟲</div> -</div> - -<style></style> |
