99 lines
2.9 KiB
PHP
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();
|
|
}
|