From a355f2c9fdd7b2cec82fd0b9576e8920865c50fe Mon Sep 17 00:00:00 2001 From: "Builder.io" Date: Sun, 16 Nov 2025 10:18:46 +0000 Subject: [PATCH] completionId: cgen-19a49fcb88134d9f8c20fca743291e9e cgen-19a49fcb88134d9f8c20fca743291e9e --- server/index.ts | 188 +++++++++++++++++++++--------------------------- 1 file changed, 83 insertions(+), 105 deletions(-) diff --git a/server/index.ts b/server/index.ts index cd058098..001a9335 100644 --- a/server/index.ts +++ b/server/index.ts @@ -353,123 +353,101 @@ export function createServer() { next(); }); - // Subdomain Passport Handler - serves the React app with pre-fetched data - app.use(async (req, res, next) => { - const subdomainInfo = (req as any).subdomainInfo; - - // Only handle root path for subdomains - if (!subdomainInfo.domain || req.path !== "/") { - return next(); - } - + // Subdomain Passport Data API - returns JSON for the React component to use + app.get("/api/passport/subdomain-data/:username", async (req, res) => { try { - let passportData: any = null; + const username = String(req.params.username || "") + .toLowerCase() + .trim(); - // Creator Passport (aethex.me) - if (subdomainInfo.isCreatorPassport) { - console.log( - "[Passport Handler] Fetching creator:", - subdomainInfo.subdomain, - ); - const { data: user, error } = await adminSupabase - .from("user_profiles") - .select( - "id, username, full_name, bio, avatar_url, banner_url, location, website_url, github_url, linkedin_url, twitter_url, role, level, total_xp, user_type, experience_level, current_streak, longest_streak, created_at, updated_at", - ) - .eq("username", subdomainInfo.subdomain) - .single(); - - if (error || !user) { - console.log("[Passport Handler] Creator not found"); - return next(); // Fall through to 404 - } - - // Fetch achievements - const { data: achievements = [] } = await adminSupabase - .from("user_achievements") - .select( - ` - achievement_id, - achievements( - id, - name, - description, - icon, - category, - badge_color - ) - `, - ) - .eq("user_id", user.id); - - passportData = { - type: "creator", - user, - achievements: achievements - .map((a: any) => a.achievements) - .filter(Boolean), - domain: "aethex.me", - }; + if (!username) { + return res.status(400).json({ error: "username required" }); } - // Project Passport (aethex.space) - if (subdomainInfo.isProjectPassport) { - console.log( - "[Passport Handler] Fetching project:", - subdomainInfo.subdomain, - ); - const { data: project, error } = await adminSupabase - .from("projects") - .select( - "id, slug, name, description, logo_url, banner_url, website_url, github_url, team_size, created_at, updated_at", + console.log("[Passport Data API] Fetching creator:", username); + + const { data: user, error } = await adminSupabase + .from("user_profiles") + .select( + "id, username, full_name, bio, avatar_url, banner_url, location, website_url, github_url, linkedin_url, twitter_url, role, level, total_xp, user_type, experience_level, current_streak, longest_streak, created_at, updated_at", + ) + .eq("username", username) + .single(); + + if (error || !user) { + console.log("[Passport Data API] Creator not found:", username); + return res.status(404).json({ error: "Creator not found", username }); + } + + // Fetch achievements + const { data: achievements = [] } = await adminSupabase + .from("user_achievements") + .select( + ` + achievement_id, + achievements( + id, + name, + description, + icon, + category, + badge_color ) - .eq("slug", subdomainInfo.subdomain) - .single(); + `, + ) + .eq("user_id", user.id); - if (error || !project) { - console.log("[Passport Handler] Project not found"); - return next(); // Fall through to 404 - } + return res.json({ + type: "creator", + user, + achievements: achievements + .map((a: any) => a.achievements) + .filter(Boolean), + domain: "aethex.me", + }); + } catch (e: any) { + console.error("[Passport Data API] Error:", e?.message); + return res.status(500).json({ + error: e?.message || "Failed to fetch creator passport", + }); + } + }); - passportData = { - type: "group", - group: project, - domain: "aethex.space", - }; + app.get("/api/passport/project-data/:projectSlug", async (req, res) => { + try { + const projectSlug = String(req.params.projectSlug || "") + .toLowerCase() + .trim(); + + if (!projectSlug) { + return res.status(400).json({ error: "projectSlug required" }); } - // If we found passport data, inject it into the page - if (passportData) { - console.log("[Passport Handler] Serving passport with pre-fetched data"); - // The React app will receive this data via window.__PASSPORT_DATA__ - const dataJson = JSON.stringify(passportData) - .replace(//g, "\\u003e"); + console.log("[Passport Data API] Fetching project:", projectSlug); - res.set("Content-Type", "text/html; charset=utf-8"); - res.send(` - - - - - - AeThex Passport - - -
- - - -`); - return; + const { data: project, error } = await adminSupabase + .from("projects") + .select( + "id, slug, name, description, logo_url, banner_url, website_url, github_url, team_size, created_at, updated_at", + ) + .eq("slug", projectSlug) + .single(); + + if (error || !project) { + console.log("[Passport Data API] Project not found:", projectSlug); + return res.status(404).json({ error: "Project not found", projectSlug }); } - next(); - } catch (error: any) { - console.error("[Passport Handler] Error:", error?.message); - next(); + return res.json({ + type: "group", + group: project, + domain: "aethex.space", + }); + } catch (e: any) { + console.error("[Passport Data API] Error:", e?.message); + return res.status(500).json({ + error: e?.message || "Failed to fetch project passport", + }); } });