- v1.1.0 - Redesign
This commit is contained in:
+46
-5
@@ -18,8 +18,8 @@ function db(): PDO {
|
||||
]);
|
||||
$pdo->exec("PRAGMA journal_mode=WAL; PRAGMA foreign_keys=ON; PRAGMA synchronous=NORMAL;");
|
||||
if ($isNew) { _schema($pdo); _seed($pdo); }
|
||||
// Always ensure the edit_requests table exists (for existing DBs)
|
||||
_ensureEditRequests($pdo);
|
||||
// Always ensure app upgrade tables/columns exist (for existing DBs)
|
||||
_ensureAppUpgrades($pdo);
|
||||
if (file_exists(DB_FILE)) @chmod(DB_FILE, 0666);
|
||||
return $pdo;
|
||||
}
|
||||
@@ -31,8 +31,20 @@ function qone(string $sql, array $p=[]): ?array { $r=qr($sql,$p)->fetch(); retu
|
||||
function qval(string $sql, array $p=[]): mixed { return qr($sql,$p)->fetchColumn(); }
|
||||
function qrun(string $sql, array $p=[]): int { $s=db()->prepare($sql); $s->execute($p); return (int)db()->lastInsertId(); }
|
||||
|
||||
/* ── Ensure edit requests table exists on old DBs ─── */
|
||||
function _ensureEditRequests(PDO $db): void {
|
||||
/* ── Ensure upgraded tables/columns exist on old DBs ─── */
|
||||
function _hasColumn(PDO $db, string $table, string $column): bool {
|
||||
$cols = $db->query("PRAGMA table_info($table)")->fetchAll(PDO::FETCH_ASSOC);
|
||||
foreach ($cols as $col) {
|
||||
if (($col['name'] ?? '') === $column) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function _ensureAppUpgrades(PDO $db): void {
|
||||
if (!_hasColumn($db, 'businesses', 'video_url')) {
|
||||
$db->exec("ALTER TABLE businesses ADD COLUMN video_url TEXT NOT NULL DEFAULT ''");
|
||||
}
|
||||
|
||||
$db->exec("
|
||||
CREATE TABLE IF NOT EXISTS business_edit_requests (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
@@ -46,7 +58,24 @@ function _ensureEditRequests(PDO $db): void {
|
||||
created_at TEXT NOT NULL DEFAULT(datetime('now')),
|
||||
reviewed_at TEXT
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS business_claim_requests (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
business_id INTEGER NOT NULL REFERENCES businesses(id) ON DELETE CASCADE,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
contact_phone TEXT NOT NULL DEFAULT '',
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
admin_notes TEXT NOT NULL DEFAULT '',
|
||||
created_at TEXT NOT NULL DEFAULT(datetime('now')),
|
||||
reviewed_at TEXT
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_claim_requests_status ON business_claim_requests(status, created_at);
|
||||
");
|
||||
|
||||
$defaults = [
|
||||
'home_random_interval' => '2hours',
|
||||
];
|
||||
$stmt = $db->prepare("INSERT OR IGNORE INTO settings(key,value)VALUES(?,?)");
|
||||
foreach ($defaults as $k => $v) $stmt->execute([$k, $v]);
|
||||
}
|
||||
|
||||
/* ══════════════════════════════════════════════════════
|
||||
@@ -84,6 +113,7 @@ function _schema(PDO $db): void {
|
||||
phone TEXT NOT NULL DEFAULT '',
|
||||
email TEXT NOT NULL DEFAULT '',
|
||||
website TEXT NOT NULL DEFAULT '',
|
||||
video_url TEXT NOT NULL DEFAULT '',
|
||||
hours TEXT NOT NULL DEFAULT '{}',
|
||||
lat REAL NOT NULL DEFAULT 39.4364,
|
||||
lng REAL NOT NULL DEFAULT -78.9762,
|
||||
@@ -108,6 +138,16 @@ function _schema(PDO $db): void {
|
||||
created_at TEXT NOT NULL DEFAULT(datetime('now')),
|
||||
reviewed_at TEXT
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS business_claim_requests(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
business_id INTEGER NOT NULL REFERENCES businesses(id) ON DELETE CASCADE,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
contact_phone TEXT NOT NULL DEFAULT '',
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
admin_notes TEXT NOT NULL DEFAULT '',
|
||||
created_at TEXT NOT NULL DEFAULT(datetime('now')),
|
||||
reviewed_at TEXT
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS reviews(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
business_id INTEGER NOT NULL REFERENCES businesses(id) ON DELETE CASCADE,
|
||||
@@ -198,7 +238,8 @@ function _seed(PDO $db): void {
|
||||
foreach (['registration_enabled'=>'1','site_name'=>'Discover Keyser WV',
|
||||
'site_tagline'=>'The Friendliest City in the U.S.A.',
|
||||
'contact_email'=>'info@discoverkeyser.com',
|
||||
'events_require_approval'=>'1'] as $k=>$v)
|
||||
'events_require_approval'=>'1',
|
||||
'home_random_interval'=>'2hours'] as $k=>$v)
|
||||
qrun("INSERT OR IGNORE INTO settings(key,value)VALUES(?,?)",[$k,$v]);
|
||||
|
||||
/* Admin user — password "password123" */
|
||||
|
||||
@@ -135,3 +135,17 @@ function uniqueSlug(string $base): string {
|
||||
while (qval("SELECT id FROM businesses WHERE slug=?", [$slug.($i ? "-$i" : "")])) $i++;
|
||||
return $slug . ($i ? "-$i" : "");
|
||||
}
|
||||
|
||||
function businessVideoProvider(string $url): string {
|
||||
$host = strtolower((string)(parse_url(trim($url), PHP_URL_HOST) ?? ''));
|
||||
$host = preg_replace('/^www\./', '', $host);
|
||||
if ($host === 'youtu.be' || $host === 'youtube.com' || str_ends_with($host, '.youtube.com') || $host === 'youtube-nocookie.com' || str_ends_with($host, '.youtube-nocookie.com')) return 'YouTube';
|
||||
if ($host === 'vimeo.com' || str_ends_with($host, '.vimeo.com')) return 'Vimeo';
|
||||
return '';
|
||||
}
|
||||
function validBusinessVideoUrl(string $url): bool {
|
||||
$url = trim($url);
|
||||
if ($url === '') return true;
|
||||
$scheme = strtolower((string)(parse_url($url, PHP_URL_SCHEME) ?? ''));
|
||||
return in_array($scheme, ['http','https'], true) && businessVideoProvider($url) !== '';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user