api certificate
This commit is contained in:
@@ -0,0 +1,91 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* api_medical_certificates_delete.php
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Elimina un certificato medico dell'utente autenticato (con ownership check).
|
||||||
|
*
|
||||||
|
* Posizione: public/api/api_medical_certificates_delete.php
|
||||||
|
* Metodo: POST
|
||||||
|
* Auth: Bearer token (Sanctum) via _bootstrap.php
|
||||||
|
*
|
||||||
|
* Body:
|
||||||
|
* - cert_id (int) id del certificato (idcertificateuserprofile)
|
||||||
|
* accettato sia via form-urlencoded sia via JSON.
|
||||||
|
*
|
||||||
|
* Tabella: certificateuserprofile
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once __DIR__ . '/_bootstrap.php';
|
||||||
|
$userId = (int) $user->id;
|
||||||
|
|
||||||
|
$uploadDir = __DIR__ . '/../user/document/';
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// INPUT (JSON o form-urlencoded)
|
||||||
|
// ==========================================================================
|
||||||
|
$raw = file_get_contents('php://input');
|
||||||
|
$json = json_decode($raw, true);
|
||||||
|
if (is_array($json) && isset($json['cert_id'])) {
|
||||||
|
$certId = (int) $json['cert_id'];
|
||||||
|
} else {
|
||||||
|
$certId = (int) ($_POST['cert_id'] ?? 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($certId <= 0) {
|
||||||
|
http_response_code(400);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Parametro cert_id mancante.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// 1) Recupera il certificato e verifica ownership
|
||||||
|
// ==========================================================================
|
||||||
|
$stmt = $db->prepare("
|
||||||
|
SELECT idcertificateuserprofile, filenamedocument
|
||||||
|
FROM certificateuserprofile
|
||||||
|
WHERE idcertificateuserprofile = :cid AND iduser = :uid
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmt->execute([':cid' => $certId, ':uid' => $userId]);
|
||||||
|
$cert = $stmt->fetch();
|
||||||
|
|
||||||
|
if (!$cert) {
|
||||||
|
http_response_code(404);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Certificato non trovato.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// 2) Elimina record + file
|
||||||
|
// ==========================================================================
|
||||||
|
try {
|
||||||
|
$del = $db->prepare("
|
||||||
|
DELETE FROM certificateuserprofile
|
||||||
|
WHERE idcertificateuserprofile = :cid AND iduser = :uid
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$del->execute([':cid' => $certId, ':uid' => $userId]);
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
http_response_code(500);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Errore durante la cancellazione.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rimuovi il file fisico (best effort)
|
||||||
|
$filename = (string) ($cert['filenamedocument'] ?? '');
|
||||||
|
if ($filename !== '') {
|
||||||
|
$path = $uploadDir . $filename;
|
||||||
|
if (is_file($path)) {
|
||||||
|
@unlink($path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// OUTPUT
|
||||||
|
// ==========================================================================
|
||||||
|
echo json_encode([
|
||||||
|
'success' => true,
|
||||||
|
'message' => 'Certificato eliminato.',
|
||||||
|
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* api_medical_certificates_list.php
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Restituisce i certificati medici dell'utente autenticato.
|
||||||
|
*
|
||||||
|
* Posizione: public/api/api_medical_certificates_list.php
|
||||||
|
* Metodo: GET
|
||||||
|
* Auth: Bearer token (Sanctum) via _bootstrap.php
|
||||||
|
*
|
||||||
|
* Tabella: certificateuserprofile
|
||||||
|
* idcertificateuserprofile, documentdescription, filenamedocument,
|
||||||
|
* iduser, expirydatedocument, uploaded_at
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once __DIR__ . '/_bootstrap.php';
|
||||||
|
$userId = (int) $user->id;
|
||||||
|
|
||||||
|
$today = date('Y-m-d');
|
||||||
|
|
||||||
|
$stmt = $db->prepare("
|
||||||
|
SELECT idcertificateuserprofile, documentdescription, filenamedocument,
|
||||||
|
expirydatedocument, uploaded_at
|
||||||
|
FROM certificateuserprofile
|
||||||
|
WHERE iduser = :uid
|
||||||
|
ORDER BY uploaded_at DESC, idcertificateuserprofile DESC
|
||||||
|
");
|
||||||
|
$stmt->execute([':uid' => $userId]);
|
||||||
|
$rows = $stmt->fetchAll();
|
||||||
|
|
||||||
|
$certificates = [];
|
||||||
|
foreach ($rows as $r) {
|
||||||
|
$filename = (string) ($r['filenamedocument'] ?? '');
|
||||||
|
$expiry = $r['expirydatedocument'] ?? null;
|
||||||
|
$isExpired = ($expiry !== null && $expiry !== '' && $expiry < $today);
|
||||||
|
|
||||||
|
$certificates[] = [
|
||||||
|
'id' => (int) $r['idcertificateuserprofile'],
|
||||||
|
'document_name' => (string) ($r['documentdescription'] ?? ''),
|
||||||
|
'filename' => $filename,
|
||||||
|
'uploaded_at' => $r['uploaded_at'] ?? null,
|
||||||
|
'expiry_date' => $expiry,
|
||||||
|
'is_expired' => $isExpired,
|
||||||
|
// percorso file relativo (la webapp li serve da public/user/document/)
|
||||||
|
'file_url' => $filename !== '' ? '/user/document/' . $filename : null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'success' => true,
|
||||||
|
'certificates' => $certificates,
|
||||||
|
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* api_medical_certificates_upload.php
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Carica un certificato medico per l'utente autenticato.
|
||||||
|
*
|
||||||
|
* Posizione: public/api/api_medical_certificates_upload.php
|
||||||
|
* Metodo: POST (multipart/form-data)
|
||||||
|
* Auth: Bearer token (Sanctum) via _bootstrap.php
|
||||||
|
*
|
||||||
|
* Campi attesi (form-data):
|
||||||
|
* - certificate (file) campo file (PDF/JPG/PNG, max 16MB)
|
||||||
|
* - document_name (text) descrizione documento
|
||||||
|
* - expiry_date (text) YYYY-MM-DD
|
||||||
|
*
|
||||||
|
* Logica ricalcata da certificate.php (webapp).
|
||||||
|
* Tabella: certificateuserprofile
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once __DIR__ . '/_bootstrap.php';
|
||||||
|
$userId = (int) $user->id;
|
||||||
|
|
||||||
|
// La cartella upload è public/user/document/. Questo file sta in public/api/,
|
||||||
|
// quindi saliamo di un livello.
|
||||||
|
$uploadDir = __DIR__ . '/../user/document/';
|
||||||
|
|
||||||
|
$allowedExt = ['pdf', 'jpg', 'jpeg', 'png'];
|
||||||
|
$allowedMime = ['application/pdf', 'image/jpeg', 'image/png'];
|
||||||
|
$maxBytes = 16 * 1024 * 1024; // 16 MB
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// INPUT
|
||||||
|
// ==========================================================================
|
||||||
|
$documentName = trim($_POST['document_name'] ?? '');
|
||||||
|
$expiryDate = trim($_POST['expiry_date'] ?? '');
|
||||||
|
|
||||||
|
if ($documentName === '') {
|
||||||
|
$documentName = 'Certificato Medico';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($expiryDate === '') {
|
||||||
|
http_response_code(400);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Data di scadenza obbligatoria.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validazione formato data YYYY-MM-DD
|
||||||
|
$d = DateTime::createFromFormat('Y-m-d', $expiryDate);
|
||||||
|
if ($d === false || $d->format('Y-m-d') !== $expiryDate) {
|
||||||
|
http_response_code(400);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Formato data non valido (YYYY-MM-DD).']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// File
|
||||||
|
if (!isset($_FILES['certificate']) || $_FILES['certificate']['error'] !== UPLOAD_ERR_OK) {
|
||||||
|
http_response_code(400);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Nessun file ricevuto o errore upload.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = $_FILES['certificate'];
|
||||||
|
|
||||||
|
if ($file['size'] > $maxBytes) {
|
||||||
|
http_response_code(400);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Il file supera i 16 MB.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
|
||||||
|
$finfo = new finfo(FILEINFO_MIME_TYPE);
|
||||||
|
$realMime = $finfo->file($file['tmp_name']);
|
||||||
|
|
||||||
|
if (!in_array($ext, $allowedExt, true) || !in_array($realMime, $allowedMime, true)) {
|
||||||
|
http_response_code(400);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Formato non consentito. Usa PDF, JPG o PNG.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// SALVATAGGIO FILE
|
||||||
|
// ==========================================================================
|
||||||
|
if (!is_dir($uploadDir)) {
|
||||||
|
@mkdir($uploadDir, 0755, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$safeName = bin2hex(random_bytes(16)) . '.' . $ext;
|
||||||
|
$destination = $uploadDir . $safeName;
|
||||||
|
|
||||||
|
if (!move_uploaded_file($file['tmp_name'], $destination)) {
|
||||||
|
http_response_code(500);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Salvataggio del file non riuscito.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// INSERT DB
|
||||||
|
// ==========================================================================
|
||||||
|
try {
|
||||||
|
$sql = "INSERT INTO certificateuserprofile
|
||||||
|
(iduser, documentdescription, filenamedocument, expirydatedocument, uploaded_at)
|
||||||
|
VALUES (:iduser, :descr, :fname, :expiry, :uploaded)";
|
||||||
|
$stmt = $db->prepare($sql);
|
||||||
|
$stmt->execute([
|
||||||
|
':iduser' => $userId,
|
||||||
|
':descr' => $documentName,
|
||||||
|
':fname' => $safeName,
|
||||||
|
':expiry' => $expiryDate,
|
||||||
|
':uploaded' => date('Y-m-d'),
|
||||||
|
]);
|
||||||
|
$newId = (int) $db->lastInsertId();
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
// rollback file se l'insert fallisce
|
||||||
|
@unlink($destination);
|
||||||
|
http_response_code(500);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Errore nel salvataggio del documento.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// OUTPUT
|
||||||
|
// ==========================================================================
|
||||||
|
echo json_encode([
|
||||||
|
'success' => true,
|
||||||
|
'message' => 'Documento caricato correttamente.',
|
||||||
|
'certificate' => [
|
||||||
|
'id' => $newId,
|
||||||
|
'document_name' => $documentName,
|
||||||
|
'filename' => $safeName,
|
||||||
|
'uploaded_at' => date('Y-m-d'),
|
||||||
|
'expiry_date' => $expiryDate,
|
||||||
|
'is_expired' => false,
|
||||||
|
'file_url' => '/user/document/' . $safeName,
|
||||||
|
],
|
||||||
|
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
Reference in New Issue
Block a user