import { NextRequest, NextResponse } from "next/server"; import { db, recipes, users, userFollows, eq, and, ne, sql } from "@epicure/db"; import { requireSessionOrApiKey } from "@/lib/api-auth"; import { desc, inArray } from "@epicure/db"; import { attachCardExtras } from "@/lib/recipe-card-extras"; export async function GET(req: NextRequest) { const { session, response } = await requireSessionOrApiKey(req); if (response) return response; const { searchParams } = new URL(req.url); const limit = Math.min(parseInt(searchParams.get("limit") ?? "20"), 50); const offset = parseInt(searchParams.get("offset") ?? "0"); // Get IDs of users the current user follows const followedRows = await db .select({ followingId: userFollows.followingId }) .from(userFollows) .where(eq(userFollows.followerId, session!.user.id)); const followedIds = followedRows.map((r) => r.followingId); if (followedIds.length === 0) { return NextResponse.json({ data: [], total: 0, limit, offset, message: "Follow some users to see their recipes here." }); } const where = and(inArray(recipes.authorId, followedIds), ne(recipes.visibility, "private")); const [feedRecipes, totalRow] = await Promise.all([ db .select({ id: recipes.id, title: recipes.title, description: recipes.description, baseServings: recipes.baseServings, prepMins: recipes.prepMins, cookMins: recipes.cookMins, difficulty: recipes.difficulty, visibility: recipes.visibility, tags: recipes.tags, isBatchCook: recipes.isBatchCook, sourceUrl: recipes.sourceUrl, recipeType: recipes.recipeType, coverIcon: recipes.coverIcon, coverColor: recipes.coverColor, createdAt: recipes.createdAt, updatedAt: recipes.updatedAt, authorId: recipes.authorId, authorName: users.name, authorUsername: users.username, authorAvatarUrl: users.avatarUrl, }) .from(recipes) .innerJoin(users, eq(recipes.authorId, users.id)) .where(where) .orderBy(desc(recipes.createdAt)) .limit(limit) .offset(offset), db .select({ total: sql`count(*)::int` }) .from(recipes) .innerJoin(users, eq(recipes.authorId, users.id)) .where(where), ]); const total = totalRow[0]?.total ?? 0; const data = await attachCardExtras(feedRecipes, session!.user.id); return NextResponse.json({ data, total, limit, offset }); }