This commit is contained in:
count-null 2025-02-15 00:21:37 -05:00
parent 9b15ac9fd3
commit 27df1a73b5
28 changed files with 1695 additions and 247 deletions

View file

@ -4,6 +4,7 @@ namespace app\controllers;
use app\models\addresses;
use app\models\users;
use app\models\user_addresses;
use app\models\magic_links;
class account
{
@ -12,8 +13,8 @@ class account
if (!isset($_SESSION['user_id'])) {
header('Location: /account/login');
}
$email = $_SESSION['user_email'];
$user = users::getByEmail($email);
$user_id = $_SESSION['user_id'];
$user = users::getById($user_id);
$default_shipping = null;
$default_billing = null;
$ship_addrs = [];
@ -60,8 +61,8 @@ class account
$bill_id = addresses::add(
$bill['name'],
$bill['company'],
$bill['street'],
$bill['boxapt'],
$bill['addressLine1'],
$bill['addressLine2'],
$bill['city'],
$bill['state'],
$bill['zip'],
@ -76,8 +77,8 @@ class account
$_SESSION['success'] = "Billing address saved!";
header('Location: /account/billing');
}
$email = $_SESSION['user_email'];
$user = users::getByEmail($email);
$user_id = $_SESSION['user_id'];
$user = users::getById($user_id);
$default_billing = null;
$bill_addrs = [];
$bill_addresses = user_addresses::getBillingByUserId($_SESSION['user_id']);
@ -115,8 +116,42 @@ class account
header('Location: /account');
}
}
public static function email()
{
$user_id = $_SESSION['user_id'] ?? null;
if (empty($user_id)){
header('Location: /account/login');
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$email = $_POST['email'] ?? null;
if (empty($email)) {
$_SESSION['error'] = "Enter your email to get a login link";
header('Location: /account');
exit;
} else {
$token = magic_links::add($email, $user_id);
users::updateReplaceEmailTokenById($user_id, $token);
header('Location: /account');
exit;
}
}
}
public static function login($defaults)
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$email = $_POST['email'] ?? false;
if (empty($email)) {
$_SESSION['error'] = "Enter your email to get a login link";
header('Location: /account/login');
exit;
} else {
$token = magic_links::add($email, null);
header('Location: /account/login');
exit;
}
}
if (isset($_SESSION['user_id'])) {
header('Location: /account');
}
@ -131,12 +166,14 @@ class account
]
]));
}
public static function logout()
{
session_unset();
session_destroy();
header('Location: /');
}
public static function orders($defaults)
{
if (!isset($_SESSION['user_id'])) {
@ -185,8 +222,8 @@ class account
$ship_id = addresses::add(
$ship['name'],
$ship['company'],
$ship['street'],
$ship['boxapt'],
$ship['addressLine1'],
$ship['addressLine2'],
$ship['city'],
$ship['state'],
$ship['zip'],
@ -201,8 +238,8 @@ class account
$_SESSION['success'] = "Shipping address saved!";
header('Location: /account/shipping');
}
$email = $_SESSION['user_email'];
$user = users::getByEmail($email);
$user_id = $_SESSION['user_id'];
$user = users::getById($user_id);
$addresses = user_addresses::getShippingByUserId($user['id']);
$default_shipping = null;
$ship_addrs = [];
@ -235,27 +272,30 @@ class account
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$email = $_POST['email'];
if (empty($email)) {
$_SESSION['error'] = 'Email is required.';
}
$existingUser = users::getByEmail($email);
if ($existingUser) {
$_SESSION['error'] = 'Email already exists. Please choose a different email or log in.';
$_SESSION['last_post'] = $_POST;
header('Location: /account/signup');
exit;
}
if (empty($email)) {
$_SESSION['error'] = 'Email is required.';
}
if (isset($_SESSION['error'])) {
$useShipping = $_POST['use_shipping'] ?? false;
$ship = addresses::validatePost("shipping");
if (!isset($ship['name'])){
$_SESSION['error'] = "Shipping address verification failed. Check your entry for errors.";
$_SESSION['last_post'] = $_POST;
header('Location: /account/signup');
}
$useShipping = $_POST['use_shipping'] ?? false;
if ($useShipping) {
$ship = addresses::validatePost("shipping");
} else {
$ship = addresses::validatePost("shipping");
if (!$useShipping) {
$bill = addresses::validatePost("billing");
}
if (empty($email)) {
$_SESSION['error'] = 'Email is required.';
if (!isset($bill['name'])){
$_SESSION['error'] = "Billing address verification failed. Check your entry for errors.";
$_SESSION['last_post'] = $_POST;
header('Location: /account/signup');
}
}
if (isset($_SESSION['error'])) {
$_SESSION['last_post'] = $_POST;
@ -264,8 +304,8 @@ class account
$ship_id = addresses::add(
$ship['name'],
$ship['company'],
$ship['street'],
$ship['boxapt'],
$ship['addressLine1'],
$ship['addressLine2'],
$ship['city'],
$ship['state'],
$ship['zip'],
@ -278,8 +318,8 @@ class account
$bill_id = addresses::add(
$bill['name'],
$bill['company'],
$bill['street'],
$bill['boxapt'],
$bill['addressLine1'],
$bill['addressLine2'],
$bill['city'],
$bill['state'],
$bill['zip'],

View file

@ -8,60 +8,45 @@ class magic_link
{
public static function index()
{
$email = $_GET['email'] ?? null;
$token = $_GET['token'] ?? null;
$signup = $_GET['signup'] ?? null;
if (empty($email) && empty($token)) {
$_SESSION['error'] = "Enter your email to get a login link";
if (!$token) {
$_SESSION['error'] = "Invalid or expired link.";
header('Location: /account/login');
exit;
}
if ($email && empty($token) && empty($signup)) {
$link = magic_links::add(email: $email);
$subject = "Your Magic Sign-In Link";
$message = "Copy and paste the link into your browser: $link";
$HTML_message = "Click the link to sign in: <a href='$link'>$link</a>";
app::send_mail(to: $email, from: $_ENV['SMTP_FROM'], from_name: $_ENV['APP_NAME'], subject: $subject, message: $message, HTML_message: $HTML_message);
$_SESSION['success'] = 'Link sent to your email!';
header('Location: /account/login');
exit;
}
if ($email && empty($token) && $signup == "1") {
$link = magic_links::add(email: $email);
$subject = "Your Magic Sign-In Link";
$message = "Copy and paste the link into your browser: $link";
$HTML_message = "Click the link to sign in: <a href='$link'>$link</a>";
app::send_mail(to: $email, from: $_ENV['SMTP_FROM'], from_name: $_ENV['APP_NAME'], subject: $subject, message: $message, HTML_message: $HTML_message);
$_SESSION['success'] = 'Account created! Please check your email inbox for the verification link.';
header('Location: /account/login');
exit;
}
if ($token && empty($email)) {
$link = magic_links::validate(token: $token);
} else {
$link = magic_links::validateToken(token: $token);
if (!$link) {
$_SESSION['error'] = "Invalid or expired link.";
header('Location: /account/login');
exit;
}
// handle signup vs. login
$user = users::getByEmail($link['email']);
if ($user) {
$user = $link['user_id'] ? users::getById($link['user_id']) : users::getByEmail($link['email']);
if ($user) { // user with this email exists, log them in
$_SESSION['user_email'] = $link['email'];
$_SESSION['user_id'] = $user['id'];
if (!$user['verified']) {
users::verify($link['email']);
}
header('Location: /account');
} else {
// used to pre-fill email signup field
$_SESSION['user_email'] = $link['email'];
header('Location: /account/signup');
exit;
} else { // no users with this email
$user_replacing_email = users::getByReplaceEmailToken($token);
if ($user_replacing_email) { // user is replacing their email
$user_id = $user_replacing_email['id'];
users::updateEmailById($user_id, $link['email']);
$_SESSION['user_email'] = $link['email'];
$_SESSION['user_id'] = $user_id;
if (!$user['verified']) {
users::verify($link['email']);
}
header('Location: /account');
exit;
} else { // new user signup
$_SESSION['user_email'] = $link['email'];
header('Location: /account/signup');
exit;
}
}
exit();
}
}
}