JezK
Edit File: citations.php
<?php require_once __DIR__ . '/config.php'; $user = requireAuth(); $input = getInput(); $action = $input['action'] ?? ''; $id = intval($input['id'] ?? 0); switch ($action) { case 'list': listCitations($user, $input); break; case 'add': addCitation($user, $input); break; case 'update': updateCitation($user, $id, $input); break; case 'delete': deleteCitation($user, $id); break; case 'format': formatCitation($input); break; case 'save_analysis': saveAnalysis($user, $input); break; case 'get_analysis': getAnalysis($user, $input); break; default: jsonError('Unknown action'); } function listCitations(array $u, array $d): void { $did = intval($d['document_id'] ?? 0); if (!$did) jsonError('document_id required'); $pdo = getDB(); $stmt = $pdo->prepare('SELECT c.* FROM citations c JOIN documents d ON d.id=c.document_id WHERE c.document_id=? AND d.user_id=? ORDER BY c.id'); $stmt->execute([$did, $u['id']]); jsonSuccess(['citations' => $stmt->fetchAll()]); } function addCitation(array $u, array $d): void { $did = intval($d['document_id'] ?? 0); if (!$did) jsonError('document_id required'); $pdo = getDB(); $style = $d['citation_style'] ?? 'APA'; $formatted = formatCitationString($d, $style); $stmt = $pdo->prepare('INSERT INTO citations (document_id, user_id, source_title, authors, year, journal, doi, url, citation_key, citation_style, formatted_citation, position_in_doc, page_numbers, source_type) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)'); $stmt->execute([$did, $u['id'], $d['source_title'] ?? '', $d['authors'] ?? '', $d['year'] ?? '', $d['journal'] ?? '', $d['doi'] ?? '', $d['url'] ?? '', $d['citation_key'] ?? uniqid('cit_'), $style, $formatted, intval($d['position_in_doc'] ?? 0), $d['page_numbers'] ?? '', $d['source_type'] ?? 'journal']); $cid = (int)$pdo->lastInsertId(); $pdo->prepare('UPDATE documents SET citation_count = citation_count+1 WHERE id=?')->execute([$did]); logActivity($u['id'], 'citation_added', 'citation', $cid, $d['source_title'] ?? ''); $stmt2 = $pdo->prepare('SELECT * FROM citations WHERE id=?'); $stmt2->execute([$cid]); jsonSuccess(['citation' => $stmt2->fetch()], 'Citation added', 201); } function updateCitation(array $u, int $id, array $d): void { if (!$id) jsonError('Citation ID required'); $pdo = getDB(); $style = $d['citation_style'] ?? 'APA'; $fmt = formatCitationString($d, $style); $pdo->prepare('UPDATE citations SET source_title=?, authors=?, year=?, journal=?, doi=?, url=?, citation_style=?, formatted_citation=?, page_numbers=? WHERE id=? AND user_id=?') ->execute([$d['source_title'] ?? '', $d['authors'] ?? '', $d['year'] ?? '', $d['journal'] ?? '', $d['doi'] ?? '', $d['url'] ?? '', $style, $fmt, $d['page_numbers'] ?? '', $id, $u['id']]); jsonSuccess([], 'Citation updated'); } function deleteCitation(array $u, int $id): void { if (!$id) jsonError('Citation ID required'); $pdo = getDB(); $pdo->prepare('DELETE FROM citations WHERE id=? AND user_id=?')->execute([$id, $u['id']]); jsonSuccess([], 'Citation deleted'); } function formatCitation(array $d): void { $style = $d['citation_style'] ?? 'APA'; jsonSuccess(['formatted' => formatCitationString($d, $style)]); } function saveAnalysis(array $u, array $d): void { $did = intval($d['document_id'] ?? 0); $results = $d['results'] ?? []; if (!$did || empty($results)) jsonError('document_id and results required'); $pdo = getDB(); $stmt = $pdo->prepare('INSERT INTO citation_analysis (document_id, sentence_text, sentence_hash, requires_citation, confidence, risk_level, analysis_type, ai_response) VALUES (?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE confidence=VALUES(confidence), risk_level=VALUES(risk_level), ai_response=VALUES(ai_response)'); foreach ($results as $r) { $hash = md5($r['sentence_text'] ?? ''); $stmt->execute([$did, $r['sentence_text'] ?? '', $hash, intval($r['requires_citation'] ?? 0), floatval($r['confidence'] ?? 0), $r['risk_level'] ?? 'low', $r['analysis_type'] ?? 'citation_required', $r['ai_response'] ?? '']); } jsonSuccess(['saved' => count($results)], 'Analysis saved'); } function getAnalysis(array $u, array $d): void { $did = intval($d['document_id'] ?? 0); if (!$did) jsonError('document_id required'); $pdo = getDB(); $stmt = $pdo->prepare('SELECT ca.* FROM citation_analysis ca JOIN documents doc ON doc.id=ca.document_id WHERE ca.document_id=? AND doc.user_id=? AND ca.is_resolved=0 ORDER BY ca.confidence DESC LIMIT 50'); $stmt->execute([$did, $u['id']]); jsonSuccess(['analysis' => $stmt->fetchAll()]); } function formatCitationString(array $d, string $style): string { $authors = $d['authors'] ?? 'Unknown Author'; $year = $d['year'] ?? 'n.d.'; $title = $d['source_title'] ?? 'Untitled'; $journal = $d['journal'] ?? ''; $doi = $d['doi'] ?? ''; $doiStr = $doi ? " https://doi.org/$doi" : ''; switch ($style) { case 'APA': return "$authors ($year). $title." . ($journal ? " *$journal*." : '') . $doiStr; case 'MLA': return "$authors. \"$title.\" $journal, $year." . $doiStr; case 'Chicago': return "$authors. \"$title.\" $journal ($year)." . $doiStr; case 'Harvard': return "$authors ($year) '$title', $journal." . $doiStr; case 'IEEE': return "$authors, \"$title,\" $journal, $year." . $doiStr; case 'Vancouver': return "$authors. $title. $journal. $year." . $doiStr; default: return "$authors ($year). $title."; } }