From c4a0b1772a47ab4f169389add6c36f3e6f4f70ea Mon Sep 17 00:00:00 2001 From: DrMaxNix Date: Sun, 4 Feb 2024 20:40:40 +0100 Subject: [PATCH] :sparkles: newsletter signup api (#45) --- .dat/.gitignore | 2 + api/newsletter/subscribe.php | 56 ++++++++++++++++++++++++++ meta.php | 5 ++- page/start/newsletter.js | 36 +++++++++++++++-- src/newsletter.php | 78 ++++++++++++++++++++++++++++++++++++ 5 files changed, 172 insertions(+), 5 deletions(-) create mode 100644 .dat/.gitignore create mode 100644 api/newsletter/subscribe.php create mode 100644 src/newsletter.php diff --git a/.dat/.gitignore b/.dat/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/.dat/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/api/newsletter/subscribe.php b/api/newsletter/subscribe.php new file mode 100644 index 0000000..dc444cd --- /dev/null +++ b/api/newsletter/subscribe.php @@ -0,0 +1,56 @@ + true + ])); +?> diff --git a/meta.php b/meta.php index 850c6b1..0b2f2fb 100644 --- a/meta.php +++ b/meta.php @@ -5,6 +5,7 @@ // DEPENDENCIES // // used extensions + static::$ext[] = "dat"; static::$ext[] = "request"; static::$ext[] = "lang"; static::$ext[] = "page"; @@ -25,6 +26,8 @@ // pages static::$route["sbgg.jetzt"] = [ ["path" => "", "target" => "page/start"], - ["path" => ":lang", "target" => "page/start"] + ["path" => ":lang", "target" => "page/start"], + + ["path" => "api/newsletter/subscribe", "target" => "api/newsletter/subscribe.php"] ]; ?> diff --git a/page/start/newsletter.js b/page/start/newsletter.js index e6a8bfb..0ac3150 100644 --- a/page/start/newsletter.js +++ b/page/start/newsletter.js @@ -187,13 +187,41 @@ async function newsletter_submit(){ // SEND API REQUEST // - /**/setTimeout(function(){ + var xhr = new XMLHttpRequest(); + xhr.open("POST", "/api/newsletter/subscribe", true); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify({ + mail_address: mail_address, + language: language + })); + + xhr.onload = function(){ + let success = true; + + // validate http status code + if(xhr.status !== 200) success = false; + + // check response + if(success){ + let response = null; + try { + response = JSON.parse(xhr.response); + } catch(e){} + + if(typeof response !== "object") success = false; + if(success && response === null) success = false; + if(success && response.success !== true) success = false; + } + // positive feedback - newsletter_feedback_wait.classList.add("gone"); - newsletter_feedback_success.classList.remove("hidden", "gone"); + if(success){ + newsletter_feedback_wait.classList.add("gone"); + newsletter_feedback_success.classList.remove("hidden", "gone"); + return; + } // negative feedback newsletter_feedback_wait.classList.add("gone"); newsletter_feedback_failure.classList.remove("hidden", "gone"); - /**/}, 700); + } } diff --git a/src/newsletter.php b/src/newsletter.php new file mode 100644 index 0000000..93a68e4 --- /dev/null +++ b/src/newsletter.php @@ -0,0 +1,78 @@ +get("list"))){ + // initialize as empty array + $newsletter_db->set("list", []); + } + + + // UPDATE DATABASE // + $entry_key = ["list", $mail_address]; + + // generate unsubscribe key + $unsubscribe_key = Id64::new(length: 16); + + // only allow new entries + $is_new = ($newsletter_db->get($entry_key) === null); + + // maybe add to database + if($is_new){ + $newsletter_db->set($entry_key, [ + "unsubscribe_key" => $unsubscribe_key, + "language" => $language + ]); + } + + + + // FINALIZE // + // close database + $newsletter_db->write_close(); + + if($is_new){ + // send welcome mail + self::send_welcome_mail(mail_address: $mail_address); + + } else { + // fake delay + //*/ TODO + } + + // release runlock + ignore_user_abort($old_ignore_user_abort); + } + + + + /** + * HELPER: Send welcome mail to new recipient. + * + * @param string $mail_address Recipient mail address. + */ + private static function send_welcome_mail(string $mail_address): void { + /**/print_r(["send_welcome_mail" => $mail_address]); + //*/ TODO + } + } +?>