server/web/src/routes/entities/[id]/+page.server.ts
vegard 50e26e3c48 Entiteter: merge-verktøy, detaljside og AI-worker
Admin-side for merge av duplikate entiteter med edge-migrering.
Entitetsside med inline redigering, slett, relasjoner og mentions.
AI text process worker-handler (fix_text, extract_facts, rewrite,
translate) med API-endepunkt som oppretter jobbkø-oppgaver.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:45:45 +01:00

71 lines
2.1 KiB
TypeScript

import { error } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
import { sql } from '$lib/server/db';
export const load: PageServerLoad = async ({ params, locals }) => {
if (!locals.workspace || !locals.user) error(401);
const workspace = locals.workspace;
const entityId = params.id;
// 1. Hent entiteten
const [entity] = await sql`
SELECT e.id, e.name, e.type, e.aliases, e.avatar_url,
n.created_at, n.updated_at
FROM entities e
JOIN nodes n ON n.id = e.id
WHERE e.id = ${entityId} AND n.workspace_id = ${workspace.id}
`;
if (!entity) error(404, 'Entitet ikke funnet');
// 2. Hent relasjoner (edges) med info om tilkoblede noder
const edges = await sql`
SELECT
ge.id AS edge_id,
ge.source_id,
ge.target_id,
ge.relation_type,
ge.confidence,
ge.origin,
ge.created_at,
CASE
WHEN ge.source_id = ${entityId} THEN target_e.name
ELSE source_e.name
END AS connected_name,
CASE
WHEN ge.source_id = ${entityId} THEN target_e.type
ELSE source_e.type
END AS connected_type,
CASE
WHEN ge.source_id = ${entityId} THEN ge.target_id
ELSE ge.source_id
END AS connected_id,
CASE
WHEN ge.source_id = ${entityId} THEN 'outgoing'
ELSE 'incoming'
END AS direction
FROM graph_edges ge
LEFT JOIN entities source_e ON source_e.id = ge.source_id
LEFT JOIN entities target_e ON target_e.id = ge.target_id
WHERE ge.workspace_id = ${workspace.id}
AND (ge.source_id = ${entityId} OR ge.target_id = ${entityId})
ORDER BY ge.created_at DESC
`;
// 3. Hent meldinger som nevner denne entiteten (via MENTIONS-edges)
const mentions = await sql`
SELECT m.id, m.body, m.title, m.message_type, m.created_at,
u.display_name AS author_name,
c.id AS channel_id
FROM graph_edges ge
JOIN messages m ON m.id = ge.source_id
LEFT JOIN users u ON u.authentik_id = m.author_id
LEFT JOIN channels c ON c.id = m.channel_id
WHERE ge.target_id = ${entityId}
AND ge.relation_type = 'MENTIONS'
AND ge.workspace_id = ${workspace.id}
ORDER BY m.created_at DESC
LIMIT 50
`;
return { entity, edges, mentions };
};