import { NextRequest, NextResponse } from "next/server"; import { db, recipes, users, userFollows, eq, and, ne } from "@epicure/db"; import { requireSession } from "@/lib/api-auth"; import { desc, inArray } from "@epicure/db"; export async function GET(req: NextRequest) { const { session, response } = await requireSession(); 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: [], limit, offset, message: "Follow some users to see their recipes here." }); } const feedRecipes = await 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, 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((t) => and(inArray(t.authorId, followedIds), ne(recipes.visibility, "private"))) .orderBy(desc(recipes.createdAt)) .limit(limit) .offset(offset); return NextResponse.json({ data: feedRecipes, limit, offset }); }