completionId: cgen-19a49fcb88134d9f8c20fca743291e9e

cgen-19a49fcb88134d9f8c20fca743291e9e
This commit is contained in:
Builder.io 2025-11-16 10:18:46 +00:00
parent 3710b02a8e
commit a355f2c9fd

View file

@ -353,123 +353,101 @@ export function createServer() {
next(); next();
}); });
// Subdomain Passport Handler - serves the React app with pre-fetched data // Subdomain Passport Data API - returns JSON for the React component to use
app.use(async (req, res, next) => { app.get("/api/passport/subdomain-data/:username", async (req, res) => {
const subdomainInfo = (req as any).subdomainInfo;
// Only handle root path for subdomains
if (!subdomainInfo.domain || req.path !== "/") {
return next();
}
try { try {
let passportData: any = null; const username = String(req.params.username || "")
.toLowerCase()
.trim();
// Creator Passport (aethex.me) if (!username) {
if (subdomainInfo.isCreatorPassport) { return res.status(400).json({ error: "username required" });
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",
};
} }
// Project Passport (aethex.space) console.log("[Passport Data API] Fetching creator:", username);
if (subdomainInfo.isProjectPassport) {
console.log( const { data: user, error } = await adminSupabase
"[Passport Handler] Fetching project:", .from("user_profiles")
subdomainInfo.subdomain, .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",
const { data: project, error } = await adminSupabase )
.from("projects") .eq("username", username)
.select( .single();
"id, slug, name, description, logo_url, banner_url, website_url, github_url, team_size, created_at, updated_at",
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) { return res.json({
console.log("[Passport Handler] Project not found"); type: "creator",
return next(); // Fall through to 404 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 = { app.get("/api/passport/project-data/:projectSlug", async (req, res) => {
type: "group", try {
group: project, const projectSlug = String(req.params.projectSlug || "")
domain: "aethex.space", .toLowerCase()
}; .trim();
if (!projectSlug) {
return res.status(400).json({ error: "projectSlug required" });
} }
// If we found passport data, inject it into the page console.log("[Passport Data API] Fetching project:", projectSlug);
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, "\\u003c")
.replace(/>/g, "\\u003e");
res.set("Content-Type", "text/html; charset=utf-8"); const { data: project, error } = await adminSupabase
res.send(`<!DOCTYPE html> .from("projects")
<html lang="en"> .select(
<head> "id, slug, name, description, logo_url, banner_url, website_url, github_url, team_size, created_at, updated_at",
<meta charset="UTF-8" /> )
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> .eq("slug", projectSlug)
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> .single();
<title>AeThex Passport</title>
</head> if (error || !project) {
<body> console.log("[Passport Data API] Project not found:", projectSlug);
<div id="root"></div> return res.status(404).json({ error: "Project not found", projectSlug });
<script>
window.__PASSPORT_DATA__ = ${dataJson};
</script>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>`);
return;
} }
next(); return res.json({
} catch (error: any) { type: "group",
console.error("[Passport Handler] Error:", error?.message); group: project,
next(); 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",
});
} }
}); });