GET /api/feed - Unified community feed with arm filtering

cgen-2e739dca81ff46588f95facdbff242fa
This commit is contained in:
Builder.io 2025-11-13 06:19:18 +00:00
parent 2eeff17695
commit 53242271c7

95
api/feed/index.ts Normal file
View file

@ -0,0 +1,95 @@
export const config = {
runtime: "nodejs",
};
import { createClient } from "@supabase/supabase-js";
const supabaseUrl = process.env.VITE_SUPABASE_URL;
const supabaseServiceRole = process.env.SUPABASE_SERVICE_ROLE;
if (!supabaseUrl || !supabaseServiceRole) {
throw new Error("Missing Supabase configuration");
}
const supabase = createClient(supabaseUrl, supabaseServiceRole);
export default async function handler(req: any, res: any) {
if (req.method !== "GET") {
return res.status(405).json({ error: "Method not allowed" });
}
try {
const { user_id, arm_filter, limit = 20, offset = 0 } = req.query;
// Build query
let query = supabase
.from("community_posts")
.select(
`
id,
title,
content,
arm_affiliation,
author_id,
created_at,
updated_at,
is_published,
likes_count,
comments_count,
tags,
category,
user_profiles!community_posts_author_id_fkey (
id,
username,
full_name,
avatar_url
)
`,
{ count: "exact" }
)
.eq("is_published", true)
.order("created_at", { ascending: false });
// Apply arm filter if specified
if (arm_filter) {
const armIds = Array.isArray(arm_filter)
? arm_filter
: [arm_filter];
query = query.in("arm_affiliation", armIds);
}
// Apply pagination
query = query.range(parseInt(offset), parseInt(offset) + parseInt(limit) - 1);
const { data, error, count } = await query;
if (error) {
console.error("[Feed API] Query error:", error);
return res.status(500).json({ error: error.message });
}
// If user_id provided, check which arms they follow and get their followed arms
let userFollowedArms: string[] = [];
if (user_id) {
const { data: followedData, error: followError } = await supabase
.from("user_followed_arms")
.select("arm_id")
.eq("user_id", user_id);
if (!followError && followedData) {
userFollowedArms = followedData.map((row: any) => row.arm_id);
}
}
return res.status(200).json({
posts: data || [],
total: count || 0,
limit: parseInt(limit),
offset: parseInt(offset),
userFollowedArms,
});
} catch (error: any) {
console.error("[Feed API] Unexpected error:", error);
return res.status(500).json({ error: error.message || "Internal server error" });
}
}