false, 'error' => 'Error interno del servidor: ' . $err['message'], ]); } }); // Cabeceras JSON estándar header('Content-Type: application/json; charset=utf-8'); header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type'); if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; } requireAuthentication(); /** * ID del admin autenticado actualmente. */ function adminId(): ?int { return isset($_SESSION['admin_user']['id']) ? (int)$_SESSION['admin_user']['id'] : null; } /** * Rol del usuario autenticado ('admin' | 'enfermero'). */ function userRole(): string { return $_SESSION['admin_user']['role'] ?? 'admin'; } /** * Detiene la ejecución con 403 JSON si el usuario no es admin (bloquea enfermeros). */ function requireAdmin(): void { if (userRole() !== 'admin') { jsonError('Acceso restringido a administradores', 403); } } /** * Detiene la ejecución si no se puede actuar como enfermero. * Acepta tanto admins (que pueden actuar en nombre de cualquier enfermera) * como el propio enfermero autenticado. */ function requireEnfermeroAccess(int $enfermeraIdSolicitado): void { if (userRole() === 'admin') return; $propio = enfermeraId(); if (!$propio || $propio !== $enfermeraIdSolicitado) { jsonError('Solo puedes gestionar tus propios domicilios', 403); } } /** * Lee el body JSON del request. */ function inputJson(): array { static $parsed = null; if ($parsed === null) { $raw = file_get_contents('php://input'); $parsed = json_decode($raw, true) ?? []; } return $parsed; } /** * Devuelve una respuesta de éxito. */ function jsonOk(array $payload = [], string $mensaje = ''): void { ob_clean(); $resp = ['ok' => true, 'success' => true]; if ($mensaje) { $resp['message'] = $mensaje; } echo json_encode(array_merge($resp, $payload), JSON_UNESCAPED_UNICODE); exit; } /** * Devuelve un error JSON con código HTTP. */ function jsonError(string $mensaje, int $code = 400): void { ob_clean(); http_response_code($code); echo json_encode(['ok' => false, 'success' => false, 'error' => $mensaje], JSON_UNESCAPED_UNICODE); exit; } /** * Valida que el método HTTP sea el esperado. */ function requireMethod(string $method): void { if ($_SERVER['REQUEST_METHOD'] !== strtoupper($method)) { jsonError('Método no permitido', 405); } }