Fix: hent edited_at og metadata fra PG etter SpacetimeDB-load

SpacetimeDB har ikke edited_at eller metadata-felter, så «redigert»-
indikatoren dukket aldri opp. Etter initial subscription-load gjør
frontend nå et kall til /api/channels/:id/messages/metadata for å
hente redigeringsstatus og AI-metadata fra PG.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-16 03:35:50 +01:00
parent aeda5e7527
commit 0b52266e70
2 changed files with 45 additions and 0 deletions

View file

@ -102,6 +102,26 @@ export function createSpacetimeChat(
}
}
async function enrichFromPg() {
try {
const res = await fetch(`/api/channels/${channelId}/messages/metadata`);
if (!res.ok) return;
const data: { id: string; edited_at: string | null; metadata: any }[] = await res.json();
const lookup = new Map(data.map(d => [d.id, d]));
messages = messages.map(m => {
const meta = lookup.get(m.id);
if (!meta) return m;
return {
...m,
edited_at: meta.edited_at,
metadata: meta.metadata
};
});
} catch {
// Ikke kritisk — meldinger vises uansett
}
}
function connectRealtime() {
try {
conn = DbConnection.builder()
@ -122,6 +142,8 @@ export function createSpacetimeChat(
// Initialload — bygg state fra subscription
rebuildReactions();
rebuildMessages();
// Hent redigeringsstatus fra PG (SpacetimeDB har ikke edited_at/metadata)
enrichFromPg();
})
.onError(() => {
console.error('[spacetime] subscription error');

View file

@ -0,0 +1,23 @@
import { json, error } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { sql } from '$lib/server/db';
/**
* GET /api/channels/:id/messages/metadata
* Returnerer edited_at og metadata for meldinger i kanalen.
* Kun meldinger som faktisk er redigert (edited_at IS NOT NULL).
*/
export const GET: RequestHandler = async ({ params, locals }) => {
if (!locals.workspace || !locals.user) error(401);
const rows = await sql`
SELECT m.id, m.edited_at, m.metadata
FROM messages m
JOIN nodes n ON n.id = m.id
WHERE m.channel_id = ${params.id}::uuid
AND n.workspace_id = ${locals.workspace.id}
AND m.edited_at IS NOT NULL
`;
return json(rows);
};