Append community like/comment endpoints
cgen-975b8ba07f7f4deeab5d630e72e23146
This commit is contained in:
parent
63f7d30070
commit
ab68843cff
1 changed files with 106 additions and 0 deletions
106
server/index.ts
106
server/index.ts
|
|
@ -894,6 +894,112 @@ export function createServer() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Community post likes
|
||||||
|
app.post("/api/community/posts/:id/like", async (req, res) => {
|
||||||
|
const postId = req.params.id;
|
||||||
|
const { user_id } = (req.body || {}) as { user_id?: string };
|
||||||
|
if (!postId || !user_id)
|
||||||
|
return res.status(400).json({ error: "post id and user_id required" });
|
||||||
|
try {
|
||||||
|
const { error: likeErr } = await adminSupabase
|
||||||
|
.from("community_post_likes")
|
||||||
|
.upsert({ post_id: postId, user_id } as any, {
|
||||||
|
onConflict: "post_id,user_id" as any,
|
||||||
|
});
|
||||||
|
if (likeErr) return res.status(500).json({ error: likeErr.message });
|
||||||
|
const { data: c } = await adminSupabase
|
||||||
|
.from("community_post_likes")
|
||||||
|
.select("post_id", { count: "exact", head: true })
|
||||||
|
.eq("post_id", postId);
|
||||||
|
const count = (c as any)?.length ? (c as any).length : (c as any)?.count || null;
|
||||||
|
if (typeof count === "number") {
|
||||||
|
await adminSupabase
|
||||||
|
.from("community_posts")
|
||||||
|
.update({ likes_count: count })
|
||||||
|
.eq("id", postId);
|
||||||
|
}
|
||||||
|
return res.json({ ok: true, likes: typeof count === "number" ? count : undefined });
|
||||||
|
} catch (e: any) {
|
||||||
|
return res.status(500).json({ error: e?.message || String(e) });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post("/api/community/posts/:id/unlike", async (req, res) => {
|
||||||
|
const postId = req.params.id;
|
||||||
|
const { user_id } = (req.body || {}) as { user_id?: string };
|
||||||
|
if (!postId || !user_id)
|
||||||
|
return res.status(400).json({ error: "post id and user_id required" });
|
||||||
|
try {
|
||||||
|
await adminSupabase
|
||||||
|
.from("community_post_likes")
|
||||||
|
.delete()
|
||||||
|
.eq("post_id", postId)
|
||||||
|
.eq("user_id", user_id);
|
||||||
|
const { data: c } = await adminSupabase
|
||||||
|
.from("community_post_likes")
|
||||||
|
.select("post_id", { count: "exact", head: true })
|
||||||
|
.eq("post_id", postId);
|
||||||
|
const count = (c as any)?.length ? (c as any).length : (c as any)?.count || null;
|
||||||
|
if (typeof count === "number") {
|
||||||
|
await adminSupabase
|
||||||
|
.from("community_posts")
|
||||||
|
.update({ likes_count: count })
|
||||||
|
.eq("id", postId);
|
||||||
|
}
|
||||||
|
return res.json({ ok: true, likes: typeof count === "number" ? count : undefined });
|
||||||
|
} catch (e: any) {
|
||||||
|
return res.status(500).json({ error: e?.message || String(e) });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Community post comments
|
||||||
|
app.get("/api/community/posts/:id/comments", async (req, res) => {
|
||||||
|
const postId = req.params.id;
|
||||||
|
try {
|
||||||
|
const { data, error } = await adminSupabase
|
||||||
|
.from("community_comments")
|
||||||
|
.select("*, user_profiles:user_id ( id, full_name, username, avatar_url )")
|
||||||
|
.eq("post_id", postId)
|
||||||
|
.order("created_at", { ascending: true });
|
||||||
|
if (error) return res.status(500).json({ error: error.message });
|
||||||
|
res.json(data || []);
|
||||||
|
} catch (e: any) {
|
||||||
|
res.status(500).json({ error: e?.message || String(e) });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post("/api/community/posts/:id/comments", async (req, res) => {
|
||||||
|
const postId = req.params.id;
|
||||||
|
const { user_id, content } = (req.body || {}) as {
|
||||||
|
user_id?: string;
|
||||||
|
content?: string;
|
||||||
|
};
|
||||||
|
if (!user_id || !content)
|
||||||
|
return res.status(400).json({ error: "user_id and content required" });
|
||||||
|
try {
|
||||||
|
const { data, error } = await adminSupabase
|
||||||
|
.from("community_comments")
|
||||||
|
.insert({ post_id: postId, user_id, content } as any)
|
||||||
|
.select()
|
||||||
|
.single();
|
||||||
|
if (error) return res.status(500).json({ error: error.message });
|
||||||
|
const { data: agg } = await adminSupabase
|
||||||
|
.from("community_comments")
|
||||||
|
.select("post_id", { count: "exact", head: true })
|
||||||
|
.eq("post_id", postId);
|
||||||
|
const count = (agg as any)?.count || null;
|
||||||
|
if (typeof count === "number") {
|
||||||
|
await adminSupabase
|
||||||
|
.from("community_posts")
|
||||||
|
.update({ comments_count: count })
|
||||||
|
.eq("id", postId);
|
||||||
|
}
|
||||||
|
res.json(data);
|
||||||
|
} catch (e: any) {
|
||||||
|
res.status(500).json({ error: e?.message || String(e) });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Endorse with notification
|
// Endorse with notification
|
||||||
app.post("/api/social/endorse", async (req, res) => {
|
app.post("/api/social/endorse", async (req, res) => {
|
||||||
const { endorser_id, endorsed_id, skill } = (req.body || {}) as {
|
const { endorser_id, endorsed_id, skill } = (req.body || {}) as {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue