feat(drafting): add fast-path generateAngarya endpoint for routine petitions

This commit is contained in:
mstfyldz
2026-08-11 21:45:17 +03:00
parent 6299a269a1
commit 69edf3aa61
2 changed files with 87 additions and 1 deletions
+85
View File
@@ -110,3 +110,88 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) =>
res.status(500).json({ error: error.message || 'Internal Server Error' });
}
};
const ANGARYA_SYSTEM_PROMPT = `
Sen uzman bir Türk avukatısın. Sana verilen dosya bilgilerine göre, standart, resmî ve kısa bir dilekçe TASLAĞI oluşturacaksın.
Bu işlem "hızlı angarya" işlemi olduğu için hiçbir hukuki tartışmaya girme.
Sadece doğru mahkeme adını, esas numarasını, tarafı ve vekil adını yerleştirip netice-i talebi yaz.
Dilekçe Türüne Göre İstenen Metin:
1. "Süre Tutum": Gerekçeli kararın tebliğine kadar istinaf/temyiz süresinin tutulduğuna dair standart kısa dilekçe.
2. "Mazeret": "Mesleki mazeretim (başka bir duruşmamla çakışması) nedeniyle bugünkü duruşmaya katılamıyorum, mazeretimin kabulüne..." içerikli standart kısa dilekçe.
3. "Vekaletname Sunma": "Ekte sunduğumuz onaylı vekaletname uyarınca dosyanıza vekil olarak kabulümüzü talep ederiz." içerikli standart kısa dilekçe.
ÖNEMLİ: Markdown biçimlendirmesi (**, ##, -, *) ASLA kullanma.
Başlık/vurgu için sadece BÜYÜK HARF kullan.
Dilekçenin başına her zaman ilgili MAHKEME ADI ve ESAS NO ekle.
Sadece dilekçe metnini döndür, ek yorum yapma.
`;
export const generateAngarya = async (req: AuthenticatedRequest, res: Response) => {
try {
const { case_id, type, client_role } = req.body || {};
const userId = req.user?.id;
if (!case_id || !type) {
return res.status(400).json({ error: 'case_id ve type zorunludur.' });
}
const validTypes = {
'sure-tutum': 'Süre Tutum Dilekçesi',
'mazeret': 'Mazeret Dilekçesi',
'vekalet': 'Vekaletname Sunma Dilekçesi'
};
const petitionType = validTypes[type as keyof typeof validTypes];
if (!petitionType) {
return res.status(400).json({ error: 'Geçersiz angarya türü.' });
}
const { data: caseRow, error: caseError } = await supabase
.from('cases')
.select('id, title, parties, user_id')
.eq('id', case_id)
.single();
if (caseError || !caseRow) {
return res.status(404).json({ error: 'Dava dosyası bulunamadı.' });
}
if (caseRow.user_id !== userId) {
return res.status(403).json({ error: 'Bu dosyaya erişim yetkiniz yok.' });
}
const partiesText = Array.isArray(caseRow.parties) && caseRow.parties.length > 0
? caseRow.parties.map((p: any) => `${p.adi || ''} (${p.rol || ''}${p.vekil ? `, Vekil: ${p.vekil}` : ''})`).join('; ')
: 'Belirtilmemiş';
let userContent = `DOSYA BİLGİLERİ:\nDosya: ${caseRow.title}\nTaraflar: ${partiesText}\n`;
if (client_role) {
userContent += `Müvekkil (Bizim Tarafımız): ${client_role}\n`;
}
userContent += `\nİstenen Dilekçe: ${petitionType}\nLütfen sadece bu bilgileri kullanarak yukarıda tarif edilen standart ${petitionType} metnini oluştur.`;
// Fast generation using a lightweight model or quick params
const { aiContent, aiModel } = await callAiModelRaw(ANGARYA_SYSTEM_PROMPT, userContent, 500);
const { data: draftRecord, error: draftError } = await supabase
.from('drafts')
.insert([{
user_id: userId,
case_id,
petition_type: petitionType,
content: aiContent,
template_id: null,
}])
.select('id, created_at')
.single();
if (draftError) {
console.error('Save Draft Error:', draftError);
}
res.json({ draft: aiContent, draftId: draftRecord?.id || null, model: aiModel, usedTemplate: false });
} catch (error: any) {
console.error('Generate Angarya Error:', error);
res.status(500).json({ error: error.message || 'Internal Server Error' });
}
};
+2 -1
View File
@@ -1,9 +1,10 @@
import { Router } from 'express';
import { requireAuth } from '../middleware/auth';
import { generateDraft } from '../controllers/drafting.controller';
import { generateDraft, generateAngarya } from '../controllers/drafting.controller';
const router = Router();
router.post('/generate', requireAuth, generateDraft);
router.post('/generate-angarya', requireAuth, generateAngarya);
export default router;