import { defineAction } from "@agent-native/core/action"; import { eq } from "drizzle-orm"; import { z } from "zod"; import { db, schema } from "../server/db/index.js"; import { fetchAllQuoteRows, hydrateQuotes } from "../server/lib/quotes.js"; import { withActionSpan } from "../server/otel.js"; export default defineAction({ description: "List all quotes a given visitor has favorited, most recently favorited first.", schema: z.object({ visitorId: z.string().min(1).describe("Anonymous visitor id (from browser storage)"), }), http: { method: "GET" }, run: async (args) => { return withActionSpan("list-favorites", { visitorId: args.visitorId }, async () => { const favorites = await db() .select() .from(schema.favorites) .where(eq(schema.favorites.visitor_id, args.visitorId)); if (favorites.length === 0) return []; const favoritedAt = new Map(favorites.map((f) => [f.quote_id, f.created_at ?? ""])); const allRows = await fetchAllQuoteRows(); const rows = allRows.filter((row) => favoritedAt.has(row.quote.id)); rows.sort((a, b) => (favoritedAt.get(b.quote.id) ?? "").localeCompare(favoritedAt.get(a.quote.id) ?? "")); return hydrateQuotes(rows, args.visitorId); }); }, });