prepare("SELECT id, title, description, scheduled_at, presenter FROM webinars WHERE id = ?"); $stmt->execute([$id]); return $stmt->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { error_log("Database error fetching webinar ID $id: " . $e->getMessage()); return null; } } // --- Only allow POST requests --- if ($_SERVER["REQUEST_METHOD"] !== "POST") { echo json_encode(['success' => false, 'error' => 'Invalid request method.']); exit; } $webinar_id = filter_input(INPUT_POST, 'webinar_id', FILTER_VALIDATE_INT) ?: 1; $webinar = get_webinar_details($webinar_id); if (!$webinar) { http_response_code(404); echo json_encode(['success' => false, 'error' => 'Webinar not found.']); exit; } // --- DATA CAPTURE --- $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); $first_name = filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING); $last_name = filter_input(INPUT_POST, 'last_name', FILTER_SANITIZE_STRING); $company = filter_input(INPUT_POST, 'company', FILTER_SANITIZE_STRING); $how_did_you_hear = filter_input(INPUT_POST, 'how_did_you_hear', FILTER_SANITIZE_STRING); $timezone = filter_input(INPUT_POST, 'timezone', FILTER_SANITIZE_STRING); // --- VALIDATION --- if (!$first_name || !$last_name || !$email) { echo json_encode(['success' => false, 'error' => 'Please fill out all required fields.']); exit; } try { // --- CHECK IF ALREADY REGISTERED OR SOFT-DELETED -- - $stmt = db()->prepare("SELECT id, deleted_at FROM attendees WHERE webinar_id = ? AND email = ?"); $stmt->execute([$webinar_id, $email]); $existing_user = $stmt->fetch(PDO::FETCH_ASSOC); if ($existing_user) { if ($existing_user['deleted_at'] !== null) { // --- USER IS SOFT-DELETED, SO REACTIVATE AND UPDATE --- $sql = "UPDATE attendees SET first_name = ?, last_name = ?, company = ?, how_did_you_hear = ?, timezone = ?, deleted_at = NULL, consented = 1 WHERE id = ?"; $stmt = db()->prepare($sql); $stmt->execute([$first_name, $last_name, $company, $how_did_you_hear, $timezone, $existing_user['id']]); } else { // --- USER IS ACTIVE, SO REJECT --- echo json_encode(['success' => false, 'error' => 'You are already registered for this webinar.']); exit; } } else { // --- REGISTER NEW USER --- $password_hash = password_hash($email . time(), PASSWORD_DEFAULT); $sql = "INSERT INTO attendees (webinar_id, first_name, last_name, email, company, how_did_you_hear, password, timezone) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; $stmt = db()->prepare($sql); $stmt->execute([$webinar_id, $first_name, $last_name, $email, $company, $how_did_you_hear, $password_hash, $timezone]); } // --- SEND CONFIRMATION EMAIL --- $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST']; $logo_url = $protocol . '://' . $host . '/assets/pasted-20251030-095744-1b7c02ab.png'; $subject = "Confirmation: You're Registered for Building Scalable Apps with AppWizzy"; $webinar_date_obj = new DateTime('2025-11-19 10:00:00', new DateTimeZone('America/New_York')); $body_html = << Webinar Registration Confirmation
AppWizzy Logo

You're Registered!

Hello {$first_name},

Thank you for registering for the Building Scalable Apps with AppWizzy webinar.

We're excited to have you join us for this professional vibe-coding session.

Webinar Details:

{$webinar_date_obj->format('l, F j, Y | g:i A T')}

You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.

Access Your Dashboard

Meet the Speakers

Philip Daineka

CEO, AppWizzy

Alexandr Rubanau

Lead Engineer

Alexey Vertel

Lead Engineer

© 2025 AppWizzy. All rights reserved.

You can visit our website for more information.

HTML; MailService::sendMail($email, $subject, $body_html); // --- PREPARE SUCCESS RESPONSE --- $webinar_date = new DateTime('2025-11-19 10:00:00', new DateTimeZone('America/New_York')); $webinar_date->setTimezone(new DateTimeZone('UTC')); $start_time_utc = $webinar_date->format('Ymd\THis\Z'); $webinar_date->add(new DateInterval('PT1H')); // Assume 1 hour duration $end_time_utc = $webinar_date->format('Ymd\THis\Z'); $event_title = 'Building Scalable Apps with AppWizzy at 4PM CET'; $event_description = 'Professional Vibe-Coding Webinar\n\nJoin us for this webinar at 4PM CET | 10AM EST | 7AM PST. The fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.'; $google_link = 'https://www.google.com/calendar/render?action=TEMPLATE&text=' . urlencode($event_title) . '&dates=' . $start_time_utc . '/' . $end_time_utc . '&details=' . urlencode($event_description) . '&location=' . urlencode('Online') . '&ctz=UTC'; $ics_content = implode("\r\n", [ 'BEGIN:VCALENDAR', 'VERSION:2.0', 'PRODID:-//Flatlogic//Building Scalable Apps with AppWizzy//EN', 'BEGIN:VEVENT', 'URL:' . 'http://' . $_SERVER['HTTP_HOST'], 'DTSTART:' . $start_time_utc, 'DTEND:' . $end_time_utc, 'SUMMARY:' . $event_title, 'DESCRIPTION:' . str_replace("\n", "\\n", $event_description), 'LOCATION:Online', 'END:VEVENT', 'END:VCALENDAR' ]); $outlook_link = 'data:text/calendar;charset=utf-8,' . rawurlencode($ics_content); echo json_encode([ 'success' => true, 'webinar_title' => 'Building Scalable Apps with AppWizzy
Professional Vibe-Coding Webinar', 'google_link' => $google_link, 'outlook_link' => $outlook_link ]); } catch (Exception $e) { error_log("Registration error: " . $e->getMessage()); http_response_code(500); echo json_encode(['success' => false, 'error' => 'An unexpected server error occurred. Please try again.']); }