feat(drafting): add fast-path generateAngarya endpoint for routine petitions
This commit is contained in:
@@ -110,3 +110,88 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) =>
|
|||||||
res.status(500).json({ error: error.message || 'Internal Server Error' });
|
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' });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Router } from 'express';
|
import { Router } from 'express';
|
||||||
import { requireAuth } from '../middleware/auth';
|
import { requireAuth } from '../middleware/auth';
|
||||||
import { generateDraft } from '../controllers/drafting.controller';
|
import { generateDraft, generateAngarya } from '../controllers/drafting.controller';
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
router.post('/generate', requireAuth, generateDraft);
|
router.post('/generate', requireAuth, generateDraft);
|
||||||
|
router.post('/generate-angarya', requireAuth, generateAngarya);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|||||||
Reference in New Issue
Block a user