Files
yogibook_aury_new/public/apiwp/bootstrap.php
T

99 lines
2.9 KiB
PHP

<?php
/**
* Bootstrap per gli endpoint PUBBLICI del modulo Eventi (cartella /apiwp).
* NON include headscript.php: niente login/redirect. Serve solo il DB.
*
* CORS: sono ammessi i domini dichiarati dalle scuole attive in
* schools.widget_origins (Opzioni Eventi → Sito WordPress).
*/
require_once dirname(__DIR__) . '/class/db-functions.php';
function pdo_conn(): PDO
{
return DBHandlerSelect::getInstance()->getConnection();
}
// La connessione carica anche il .env (APP_URL, MAIL_*, YSE_CRON_KEY)
pdo_conn();
// URL pubblico di YogiBook: usato per rendere assoluti i path delle immagini.
if (!defined('YB_PUBLIC_BASE')) {
define('YB_PUBLIC_BASE', rtrim($_ENV['APP_URL'] ?? 'https://yogibook.yogasoul.it', '/') . '/');
}
/** "https://Sito.it:443/qualcosa" -> "https://sito.it:443" ('' se non valida) */
function yb_normalize_origin(string $origin): string
{
$p = parse_url(trim($origin));
if (!$p || empty($p['scheme']) || empty($p['host'])) {
return '';
}
$scheme = strtolower($p['scheme']);
if (!in_array($scheme, ['http', 'https'], true)) {
return '';
}
return $scheme . '://' . strtolower($p['host']) . (isset($p['port']) ? ':' . (int) $p['port'] : '');
}
/** L'origine appartiene a una scuola attiva? */
function yb_origin_allowed(string $origin): bool
{
$o = yb_normalize_origin($origin);
if ($o === '') {
return false;
}
try {
$st = pdo_conn()->prepare(
"SELECT 1 FROM schools
WHERE status <> 'suspended' AND FIND_IN_SET(?, widget_origins) > 0
LIMIT 1"
);
$st->execute([$o]);
return (bool) $st->fetchColumn();
} catch (PDOException $e) {
error_log('[apiwp/bootstrap] CORS: ' . $e->getMessage());
return false;
}
}
/** Rende assoluto un path immagine relativo (es. uploads/schools/1/events/x.jpg). */
function public_url(?string $rel): ?string
{
if ($rel === null || $rel === '') {
return null;
}
if (preg_match('#^https?://#i', $rel)) {
return $rel;
}
return YB_PUBLIC_BASE . ltrim($rel, '/');
}
/** Risponde in JSON e termina. */
function send_json($data, int $code = 200): void
{
if (function_exists('ob_get_level') && ob_get_level()) {
ob_clean();
}
http_response_code($code);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit();
}
// --- CORS ---------------------------------------------------------------
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
if ($origin !== '' && yb_origin_allowed($origin)) {
header('Access-Control-Allow-Origin: ' . $origin);
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
}
header('Vary: Origin');
// Preflight CORS
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'OPTIONS') {
http_response_code(204);
exit();
}