import { config } from '../config.js' import { deleteUserSession, getUserById } from './appwriteAdmin.js' const DEBUG_LOG = (location, message, data, hypothesisId) => { // #region agent log fetch('http://127.0.0.1:7281/ingest/30e8e71c-b377-4e72-84f9-593826c6d234', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '80bbfc' }, body: JSON.stringify({ sessionId: '80bbfc', location, message, data, hypothesisId, timestamp: Date.now(), }), }).catch(() => {}) // #endregion } function appwriteHeaders() { return { 'Content-Type': 'application/json', 'X-Appwrite-Project': config.appwrite.projectId, } } async function appwriteFetch(path, { method = 'GET', body } = {}) { const url = `${config.appwrite.endpoint}${path}` const response = await fetch(url, { method, headers: appwriteHeaders(), body: body ? JSON.stringify(body) : undefined, }) let data = null const text = await response.text() if (text) { try { data = JSON.parse(text) } catch { data = { message: text } } } if (!response.ok) { const error = new Error(data?.message || `Appwrite ${response.status}`) error.status = response.status === 401 ? 401 : response.status >= 500 ? 500 : 401 error.code = data?.code error.type = data?.type throw error } return data } /** * Appwrite Auth per native fetch (Node 26 + node-appwrite-Agent ist inkompatibel). * Session.secret wird serverseitig oft nicht zurückgegeben – userId aus Session nutzen. */ export async function loginWithAppwrite(email, password) { let session try { session = await appwriteFetch('/account/sessions/email', { method: 'POST', body: { email, password }, }) DEBUG_LOG('appwriteClient.js:session', 'createEmailPasswordSession ok', { hasSecret: Boolean(session?.secret), hasUserId: Boolean(session?.userId), sessionId: session?.$id || null, }, 'H6') } catch (err) { DEBUG_LOG('appwriteClient.js:session', 'createEmailPasswordSession fail', { message: err?.message?.slice(0, 120), code: err?.code, }, 'H1') const error = new Error(err.message || 'Anmeldung fehlgeschlagen') error.status = err.status || 401 throw error } if (!session?.userId) { DEBUG_LOG('appwriteClient.js:session', 'no userId in session', { sessionKeys: session ? Object.keys(session).filter((k) => !k.startsWith('provider')) : [], }, 'H6') const error = new Error('Appwrite-Session ohne userId.') error.status = 500 throw error } let user try { user = await getUserById(session.userId) DEBUG_LOG('appwriteClient.js:getUser', 'users.get ok', { userId: user?.$id || null }, 'H6') } catch (err) { DEBUG_LOG('appwriteClient.js:getUser', 'users.get fail, fallback', { message: err?.message?.slice(0, 80), }, 'H6') user = { $id: session.userId, email, name: '' } } if (session.$id) { try { await deleteUserSession(session.userId, session.$id) } catch { // Portal nutzt eigene Session; Appwrite-Session optional aufräumen } } return user }