import { getDirectusInstance, directusApiUrl } from "$lib/directus"; import { readItems, registerUser, updateMe, readMe, registerUserVerify, passwordRequest, passwordReset, customEndpoint, readFolders, deleteFile, uploadFiles, createComment, readComments, aggregate, } from "@directus/sdk"; import type { Analytics, Article, Model, Recording, Stats, User, Video, VideoLikeStatus, VideoLikeResponse, VideoPlayResponse } from "$lib/types"; import { PUBLIC_URL } from "$env/static/public"; import { logger } from "$lib/logger"; // Helper to log API calls async function loggedApiCall( operationName: string, operation: () => Promise, context?: Record ): Promise { const startTime = Date.now(); try { logger.debug(`🔄 API: ${operationName}`, { context }); const result = await operation(); const duration = Date.now() - startTime; logger.info(`✅ API: ${operationName} succeeded`, { duration, context }); return result; } catch (error) { const duration = Date.now() - startTime; logger.error(`❌ API: ${operationName} failed`, { duration, context, error: error instanceof Error ? error : new Error(String(error)), }); throw error; } } const userFields = [ "*", { avatar: ["*"], policies: ["*", { policy: ["name", "id"] }], role: ["*", { policies: [{ policy: ["name", "id"] }] }], }, ]; export async function isAuthenticated(token: string) { return loggedApiCall( "isAuthenticated", async () => { try { const directus = getDirectusInstance(fetch); directus.setToken(token); const user = await directus.request( readMe({ fields: userFields, }), ); return { authenticated: true, user }; } catch { return { authenticated: false }; } }, { hasToken: !!token }, ); } export async function register( email: string, password: string, firstName: string, lastName: string, ) { return loggedApiCall( "register", async () => { const directus = getDirectusInstance(fetch); return directus.request( registerUser(email, password, { verification_url: `${PUBLIC_URL || "http://localhost:3000"}/signup/verify`, first_name: firstName, last_name: lastName, }), ); }, { email, firstName, lastName }, ); } export async function verify(token: string, fetch?: typeof globalThis.fetch) { return loggedApiCall( "verify", async () => { const directus = fetch ? getDirectusInstance((args) => fetch(args, { redirect: "manual" })) : getDirectusInstance(fetch); return directus.request(registerUserVerify(token)); }, { hasToken: !!token }, ); } export async function login(email: string, password: string) { return loggedApiCall( "login", async () => { const directus = getDirectusInstance(fetch); return directus.login({ email, password }); }, { email }, ); } export async function logout() { return loggedApiCall("logout", async () => { const directus = getDirectusInstance(fetch); return directus.logout(); }); } export async function requestPassword(email: string) { return loggedApiCall( "requestPassword", async () => { const directus = getDirectusInstance(fetch); return directus.request( passwordRequest(email, `${PUBLIC_URL || "http://localhost:3000"}/password/reset`), ); }, { email }, ); } export async function resetPassword(token: string, password: string) { return loggedApiCall( "resetPassword", async () => { const directus = getDirectusInstance(fetch); return directus.request(passwordReset(token, password)); }, { hasToken: !!token }, ); } export async function getArticles(fetch?: typeof globalThis.fetch) { return loggedApiCall("getArticles", async () => { const directus = getDirectusInstance(fetch); return directus.request( customEndpoint({ method: "GET", path: "/sexy/articles", }), ); }); } export async function getArticleBySlug( slug: string, fetch?: typeof globalThis.fetch, ) { return loggedApiCall( "getArticleBySlug", async () => { const directus = getDirectusInstance(fetch); return directus .request( readItems("sexy_articles", { fields: ["*", "author.*"], filter: { slug: { _eq: slug } }, }), ) .then((articles) => { if (articles.length === 0) { throw new Error("Article not found"); } return articles[0]; }); }, { slug }, ); } export async function getVideos(fetch?: typeof globalThis.fetch) { return loggedApiCall("getVideos", async () => { const directus = getDirectusInstance(fetch); return directus.request( customEndpoint({ method: "GET", path: "/sexy/videos", }), ); }); } export async function getVideosForModel(id, fetch?: typeof globalThis.fetch) { return loggedApiCall( "getVideosForModel", async () => { const directus = getDirectusInstance(fetch); return directus.request( customEndpoint({ method: "GET", path: `/sexy/videos?model_id=${id}`, }), ); }, { modelId: id }, ); } export async function getFeaturedVideos( limit: number, fetchFn: typeof globalThis.fetch = globalThis.fetch, ) { return loggedApiCall( "getFeaturedVideos", async () => { const url = `${PUBLIC_URL}/api/sexy/videos?featured=true&limit=${limit}`; const response = await fetchFn(url); if (!response.ok) { throw new Error(`Failed to fetch featured videos: ${response.statusText}`); } return (await response.json()) as Video[]; }, { limit }, ); } export async function getVideoBySlug( slug: string, fetch?: typeof globalThis.fetch, ) { return loggedApiCall( "getVideoBySlug", async () => { const directus = getDirectusInstance(fetch); return directus.request