* chore: repo-wide bloat sweep, remove dead code and fold duplicate helpers Remove 33 dead files, ~270 unreferenced exports/types, 13 dead i18n namespaces and 4 unused dependencies; fold byte-identical helper copies into one canonical home each (lib/utils chunk/sleep/utcDateStamp, lib/dates/iso, lib/invariants/uuid, lib/xml/escape, lib/reports/sru/format, lib/pdf/number-text, lib/browser/panel-request, lib/api/v1/body + v1ValidationError rolled out to ~55 v1 routes, booking-template schemas). No behaviour change: v1 bodies and status codes, MCP tool schemas, DB writes and money math are untouched. Naive ore rounding was deliberately not swapped for roundOre; see DECISIONS.md 2026-09-02 for the full list of things left alone on purpose. tsc, lint, 19588 unit tests and check:guards green; antipattern baseline ratcheted (naive-ore-round 622 -> 620, hand-rolled-invariant 115 -> 113). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * test(transactions): import RawTransaction from @/types after the ingest re-export removal CI's type ratchet (check:types, full tsconfig) caught the one test file that still imported the type through lib/transactions/ingest. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
import { NextResponse } from 'next/server'
|
|
import { z } from 'zod'
|
|
import { withRouteContext } from '@/lib/api/with-route-context'
|
|
import { validateBody } from '@/lib/api/validate'
|
|
import {
|
|
AccountKeySchema,
|
|
reconciliationLinksBodyFields,
|
|
reconciliationLinksBodyRefinement,
|
|
} from '@/lib/reconciliation/schemas'
|
|
import { matchPairs } from '@/lib/reconciliation/actions'
|
|
|
|
const ReconciliationLinksBodySchema = z
|
|
.object({
|
|
...reconciliationLinksBodyFields,
|
|
dry_run: z.boolean().optional(),
|
|
})
|
|
.refine(...reconciliationLinksBodyRefinement)
|
|
|
|
/**
|
|
* POST /api/reconciliation/accounts/{accountKey}/links
|
|
*
|
|
* The page's "Koppla" and "Koppla N föreslagna": link outside rows to existing
|
|
* verifikat (N:1), or one bank transaction to several verifikat (1:N, with
|
|
* optional allocations). A human clicked, so this applies directly (dry_run:
|
|
* true for the preview). Same service function as v1 and the MCP commit
|
|
* executor.
|
|
*/
|
|
export const POST = withRouteContext<{ params: Promise<{ accountKey: string }> }>(
|
|
'reconciliation.accounts.links.create',
|
|
async (request, { supabase, user, companyId }, { params }) => {
|
|
const { accountKey } = await params
|
|
if (!AccountKeySchema.safeParse(accountKey).success) {
|
|
return NextResponse.json({ error: 'Okänt konto' }, { status: 404 })
|
|
}
|
|
const validation = await validateBody(request, ReconciliationLinksBodySchema)
|
|
if (!validation.success) return validation.response
|
|
const { dry_run, ...input } = validation.data
|
|
|
|
const result = await matchPairs(supabase, companyId, user.id, accountKey, input, {
|
|
dryRun: dry_run === true,
|
|
})
|
|
if (!result) {
|
|
return NextResponse.json({ error: 'Okänt konto för det här företaget' }, { status: 404 })
|
|
}
|
|
return NextResponse.json({ data: result })
|
|
},
|
|
{ requireWrite: true },
|
|
)
|