Create group passport endpoint for aethex.space subdomains
cgen-b94963558c424a0b9b67b67f9ce16534
This commit is contained in:
parent
235eb48b1b
commit
34315d4e37
1 changed files with 160 additions and 0 deletions
160
api/passport/group/[groupname].ts
Normal file
160
api/passport/group/[groupname].ts
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
import type { VercelRequest, VercelResponse } from "@vercel/node";
|
||||
import { getAdminClient } from "../../_supabase";
|
||||
|
||||
export default async function handler(req: VercelRequest, res: VercelResponse) {
|
||||
if (req.method !== "GET") {
|
||||
return res.status(405).json({ error: "Method not allowed" });
|
||||
}
|
||||
|
||||
const { groupname } = req.query;
|
||||
|
||||
if (!groupname || typeof groupname !== "string") {
|
||||
return res.status(400).json({ error: "Group name is required" });
|
||||
}
|
||||
|
||||
try {
|
||||
console.log("[Group Passport] Initializing admin client...");
|
||||
const admin = getAdminClient();
|
||||
console.log("[Group Passport] Admin client initialized successfully");
|
||||
|
||||
// Try to find group by name (case-insensitive)
|
||||
let group: any = null;
|
||||
|
||||
try {
|
||||
const result = await admin
|
||||
.from("squads")
|
||||
.select(
|
||||
`
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
logo_url,
|
||||
banner_url,
|
||||
website,
|
||||
github_url,
|
||||
created_at,
|
||||
updated_at,
|
||||
member_count,
|
||||
created_by
|
||||
`,
|
||||
)
|
||||
.ilike("name", `%${groupname}%`)
|
||||
.limit(1)
|
||||
.single();
|
||||
group = result.data;
|
||||
} catch (e) {
|
||||
// Continue to ID lookup
|
||||
}
|
||||
|
||||
// If not found by name, try by exact ID match
|
||||
if (!group) {
|
||||
try {
|
||||
const result = await admin
|
||||
.from("squads")
|
||||
.select(
|
||||
`
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
logo_url,
|
||||
banner_url,
|
||||
website,
|
||||
github_url,
|
||||
created_at,
|
||||
updated_at,
|
||||
member_count,
|
||||
created_by
|
||||
`,
|
||||
)
|
||||
.eq("id", groupname)
|
||||
.single();
|
||||
group = result.data;
|
||||
} catch (e) {
|
||||
// Continue to error handling
|
||||
}
|
||||
}
|
||||
|
||||
if (!group) {
|
||||
return res.status(404).json({ error: "Group not found" });
|
||||
}
|
||||
|
||||
// Get group members
|
||||
const { data: members = [] } = await admin
|
||||
.from("squad_members")
|
||||
.select(
|
||||
`
|
||||
user_id,
|
||||
role,
|
||||
joined_at,
|
||||
user_profiles(
|
||||
id,
|
||||
username,
|
||||
full_name,
|
||||
avatar_url
|
||||
)
|
||||
`,
|
||||
)
|
||||
.eq("squad_id", group.id);
|
||||
|
||||
// Get group projects
|
||||
const { data: projects = [] } = await admin
|
||||
.from("projects")
|
||||
.select(
|
||||
`
|
||||
id,
|
||||
title,
|
||||
slug,
|
||||
description,
|
||||
image_url,
|
||||
created_at
|
||||
`,
|
||||
)
|
||||
.eq("squad_id", group.id)
|
||||
.limit(10);
|
||||
|
||||
// Get creator/owner info
|
||||
let owner = null;
|
||||
if (group.created_by) {
|
||||
const { data: ownerData } = await admin
|
||||
.from("user_profiles")
|
||||
.select("id, username, full_name, avatar_url")
|
||||
.eq("id", group.created_by)
|
||||
.single();
|
||||
owner = ownerData;
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
type: "group",
|
||||
group: {
|
||||
...group,
|
||||
memberCount: members.length,
|
||||
members: members.map((m: any) => ({
|
||||
userId: m.user_id,
|
||||
role: m.role,
|
||||
joinedAt: m.joined_at,
|
||||
user: m.user_profiles,
|
||||
})),
|
||||
},
|
||||
projects: projects || [],
|
||||
owner,
|
||||
domain: req.headers.host || "",
|
||||
});
|
||||
} catch (error: any) {
|
||||
console.error("[Group Passport Error]", {
|
||||
message: error?.message || String(error),
|
||||
code: error?.code,
|
||||
status: error?.status,
|
||||
details: error?.details || error?.hint,
|
||||
});
|
||||
|
||||
if (/SUPABASE_/.test(String(error?.message || ""))) {
|
||||
return res.status(500).json({
|
||||
error: `Server misconfigured: ${error.message}`,
|
||||
});
|
||||
}
|
||||
|
||||
return res.status(500).json({
|
||||
error: error?.message || "Failed to load group passport",
|
||||
});
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue