- Add SQLite database initialization and management in inc/db.php - Implement session authentication and CSRF security helpers in inc/auth.php - Implement announcement querying and saving in inc/announcements.php - Add management dashboard, login, and logout in admin/ - Protect db/ directory with Apache access controls
83 lines
2.7 KiB
PHP
83 lines
2.7 KiB
PHP
<?php
|
|
/**
|
|
* Database connection & schema management for SQLite
|
|
*/
|
|
|
|
function get_db(): PDO {
|
|
static $pdo = null;
|
|
if ($pdo !== null) {
|
|
return $pdo;
|
|
}
|
|
|
|
$dbDir = __DIR__ . '/../db';
|
|
if (!is_dir($dbDir)) {
|
|
mkdir($dbDir, 0755, true);
|
|
}
|
|
|
|
$dbPath = $dbDir . '/fitz.sqlite';
|
|
$isNew = !file_exists($dbPath);
|
|
|
|
$pdo = new PDO('sqlite:' . $dbPath, null, null, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_TIMEOUT => 5
|
|
]);
|
|
|
|
// Enable WAL mode for concurrency and performance
|
|
$pdo->exec('PRAGMA journal_mode = WAL;');
|
|
$pdo->exec('PRAGMA foreign_keys = ON;');
|
|
|
|
// Initialize tables if needed
|
|
init_db_schema($pdo);
|
|
|
|
return $pdo;
|
|
}
|
|
|
|
function init_db_schema(PDO $pdo): void {
|
|
$pdo->exec("
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
role TEXT NOT NULL DEFAULT 'admin',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS announcements (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
is_active INTEGER NOT NULL DEFAULT 1,
|
|
type TEXT NOT NULL DEFAULT 'holiday',
|
|
headline TEXT NOT NULL,
|
|
message TEXT NOT NULL,
|
|
start_date TEXT NULL,
|
|
end_date TEXT NULL,
|
|
show_banner INTEGER NOT NULL DEFAULT 1,
|
|
show_in_hours INTEGER NOT NULL DEFAULT 1,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
");
|
|
|
|
// Seed default admin user if table is empty (username: admin / password: password)
|
|
$stmt = $pdo->query("SELECT COUNT(*) as count FROM users");
|
|
$userCount = $stmt->fetchColumn();
|
|
if ($userCount == 0) {
|
|
$defaultPassHash = password_hash('password', PASSWORD_DEFAULT);
|
|
$insert = $pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES (?, ?, 'admin')");
|
|
$insert->execute(['admin', $defaultPassHash]);
|
|
}
|
|
|
|
// Seed default Labor Day announcement row if table is empty
|
|
$stmtAnn = $pdo->query("SELECT COUNT(*) as count FROM announcements");
|
|
$annCount = $stmtAnn->fetchColumn();
|
|
if ($annCount == 0) {
|
|
$insertAnn = $pdo->prepare("
|
|
INSERT INTO announcements (
|
|
is_active, type, headline, message, start_date, end_date, show_banner, show_in_hours
|
|
) VALUES (
|
|
1, 'holiday', 'Labor Day Closure', 'The Old Fitz will be closed Thursday, Sept 3 through Saturday, Sept 5 for the holiday weekend. Doors reopen Thursday, Sept 10 at 4:00 PM!', NULL, NULL, 1, 1
|
|
)
|
|
");
|
|
$insertAnn->execute();
|
|
}
|
|
}
|