"use server"; import { headers } from "next/headers"; import { auth } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; import { TOOL_IDS, type ToolId } from "@/lib/tools/_shared/types"; // Дедуп-окно: один (userId, tool) пишем раз в N минут — чистит аналитику и // снимает storage-abuse (Server Action — публичный RPC, не покрыт Better Auth rateLimit). const DEDUP_WINDOW_MS = 10 * 60 * 1000; export async function logToolUsage({ tool }: { tool: ToolId }): Promise<{ ok: boolean }> { // auth-first: сессия раньше валидации ввода const session = await auth.api.getSession({ headers: await headers() }); if (!session) return { ok: false }; if (!TOOL_IDS.includes(tool)) return { ok: false }; const recent = await prisma.toolUsage.findFirst({ where: { userId: session.user.id, tool, createdAt: { gte: new Date(Date.now() - DEDUP_WINDOW_MS) } }, select: { id: true }, }); if (recent) return { ok: true }; await prisma.toolUsage.create({ data: { userId: session.user.id, tool } }); return { ok: true }; }