- Email verification (regular, business owner), CLI administration

This commit is contained in:
Ty Clifford
2026-06-18 14:50:48 -04:00
parent 66f93757b6
commit cfd1fba5ab
9 changed files with 778 additions and 28 deletions
+45 -3
View File
@@ -41,6 +41,13 @@ function _hasColumn(PDO $db, string $table, string $column): bool {
}
function _ensureAppUpgrades(PDO $db): void {
if (!_hasColumn($db, 'users', 'email_verified_at')) {
$db->exec("ALTER TABLE users ADD COLUMN email_verified_at TEXT");
$db->exec("UPDATE users SET email_verified_at=datetime('now') WHERE is_active=1");
}
if (!_hasColumn($db, 'users', 'member_type')) {
$db->exec("ALTER TABLE users ADD COLUMN member_type TEXT NOT NULL DEFAULT 'member'");
}
if (!_hasColumn($db, 'businesses', 'video_url')) {
$db->exec("ALTER TABLE businesses ADD COLUMN video_url TEXT NOT NULL DEFAULT ''");
}
@@ -69,10 +76,27 @@ function _ensureAppUpgrades(PDO $db): void {
reviewed_at TEXT
);
CREATE INDEX IF NOT EXISTS idx_claim_requests_status ON business_claim_requests(status, created_at);
CREATE TABLE IF NOT EXISTS email_verification_tokens (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
token_hash TEXT NOT NULL UNIQUE,
purpose TEXT NOT NULL DEFAULT 'email_verify',
expires_at TEXT NOT NULL,
used_at TEXT,
created_at TEXT NOT NULL DEFAULT(datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_email_tokens_user ON email_verification_tokens(user_id, purpose, used_at);
");
$defaults = [
'home_random_interval' => '2hours',
'site_base_url' => '',
'mailgun_region' => 'us',
'mailgun_domain' => '',
'mailgun_api_key' => '',
'mailgun_from_name' => 'Discover Keyser WV',
'mailgun_from_email' => '',
'mailgun_send_mode' => 'html',
];
$stmt = $db->prepare("INSERT OR IGNORE INTO settings(key,value)VALUES(?,?)");
foreach ($defaults as $k => $v) $stmt->execute([$k, $v]);
@@ -93,6 +117,8 @@ function _schema(PDO $db): void {
password TEXT NOT NULL,
is_admin INTEGER NOT NULL DEFAULT 0,
is_active INTEGER NOT NULL DEFAULT 1,
email_verified_at TEXT,
member_type TEXT NOT NULL DEFAULT 'member',
created_at TEXT NOT NULL DEFAULT(datetime('now')),
last_login TEXT
);
@@ -148,6 +174,15 @@ function _schema(PDO $db): void {
created_at TEXT NOT NULL DEFAULT(datetime('now')),
reviewed_at TEXT
);
CREATE TABLE IF NOT EXISTS email_verification_tokens(
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
token_hash TEXT NOT NULL UNIQUE,
purpose TEXT NOT NULL DEFAULT 'email_verify',
expires_at TEXT NOT NULL,
used_at TEXT,
created_at TEXT NOT NULL DEFAULT(datetime('now'))
);
CREATE TABLE IF NOT EXISTS reviews(
id INTEGER PRIMARY KEY AUTOINCREMENT,
business_id INTEGER NOT NULL REFERENCES businesses(id) ON DELETE CASCADE,
@@ -239,13 +274,20 @@ function _seed(PDO $db): void {
'site_tagline'=>'The Friendliest City in the U.S.A.',
'contact_email'=>'info@discoverkeyser.com',
'events_require_approval'=>'1',
'home_random_interval'=>'2hours'] as $k=>$v)
'home_random_interval'=>'2hours',
'site_base_url'=>'',
'mailgun_region'=>'us',
'mailgun_domain'=>'',
'mailgun_api_key'=>'',
'mailgun_from_name'=>'Discover Keyser WV',
'mailgun_from_email'=>'',
'mailgun_send_mode'=>'html'] as $k=>$v)
qrun("INSERT OR IGNORE INTO settings(key,value)VALUES(?,?)",[$k,$v]);
/* Admin user — password "password123" */
$hash = password_hash('password123', PASSWORD_BCRYPT);
qrun("INSERT OR IGNORE INTO users(username,email,password,is_admin)
VALUES('administrator','admin@discoverkeyser.com',?,1)",[$hash]);
qrun("INSERT OR IGNORE INTO users(username,email,password,is_admin,email_verified_at,member_type)
VALUES('administrator','admin@discoverkeyser.com',?,1,datetime('now'),'member')",[$hash]);
/* Categories */
foreach ([