46 lines
1.9 KiB
TypeScript
46 lines
1.9 KiB
TypeScript
import { buildFinanceAnalysisContext } from "@/server/ai/context";
|
||
import { getAiRuntime } from "@/server/ai/provider";
|
||
import { aiJsonError } from "@/server/ai/responses";
|
||
import { domainActorFromSession } from "@/server/auth/domain-actor";
|
||
import { getSessionContextFromHeaders } from "@/server/auth/session";
|
||
import { DomainError } from "@/server/domain/errors";
|
||
import { getDomainService } from "@/server/services/runtime";
|
||
import { generateText } from "ai";
|
||
import { NextResponse } from "next/server";
|
||
|
||
export const maxDuration = 120;
|
||
|
||
export async function POST(request: Request) {
|
||
try {
|
||
const context = await getSessionContextFromHeaders(new Headers(request.headers));
|
||
if (!context) {
|
||
throw new DomainError("UNAUTHENTICATED", "Oturum gerekli.");
|
||
}
|
||
if (context.profile.role !== "freelancer") {
|
||
throw new DomainError("FORBIDDEN", "Bu işlem yalnızca freelancer hesabına açıktır.");
|
||
}
|
||
|
||
const actor = domainActorFromSession(context);
|
||
const analysisContext = buildFinanceAnalysisContext(getDomainService(), actor);
|
||
if (!analysisContext.hasData) {
|
||
return NextResponse.json({
|
||
text: "Son 30 güne ait finansal işlem bulunmadığı için analiz yapamıyorum. Lütfen yeni gelir veya gider ekleyin.",
|
||
});
|
||
}
|
||
|
||
const runtime = getAiRuntime(actor);
|
||
const { text } = await generateText({
|
||
model: runtime.model,
|
||
timeout: runtime.timeout,
|
||
system: `Sen profesyonel bir finans danışmanısın.
|
||
Verilen finansal verilere dayanarak kısa, motive edici ve yapıcı bir finansal durum raporu sun.
|
||
Markdown başlıklar kullan, Türkçe konuş ve hukuki ya da finansal kesin hüküm verme.`,
|
||
prompt: `Aşağıdaki server-side finans özetine göre durum ve uygulanabilir öneriler sun:\n\n${analysisContext.text}`,
|
||
});
|
||
|
||
return NextResponse.json({ text });
|
||
} catch (error) {
|
||
return aiJsonError(error);
|
||
}
|
||
}
|