initial version of the app

This commit is contained in:
mikicvi
2025-09-21 17:11:02 +01:00
commit c8062cf96b
101 changed files with 23061 additions and 0 deletions
+176
View File
@@ -0,0 +1,176 @@
import Database from 'better-sqlite3';
import bcrypt from 'bcryptjs';
async function setupDatabase() {
const db = new Database('sqlite.db');
// Enable foreign keys
db.pragma('foreign_keys = ON');
// Create tables
db.exec(`
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
surname TEXT NOT NULL,
password TEXT NOT NULL,
role TEXT NOT NULL DEFAULT 'user' CHECK (role IN ('user', 'admin')),
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS courts (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
is_active INTEGER NOT NULL DEFAULT 1,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS settings (
id TEXT PRIMARY KEY,
key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL,
description TEXT,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS time_slots (
id TEXT PRIMARY KEY,
start_time TEXT NOT NULL,
end_time TEXT NOT NULL,
is_active INTEGER NOT NULL DEFAULT 1,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS bookings (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
court_id TEXT NOT NULL,
date TEXT NOT NULL,
time_slot_id TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('confirmed', 'cancelled', 'pending')),
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (court_id) REFERENCES courts(id),
FOREIGN KEY (time_slot_id) REFERENCES time_slots(id)
);
CREATE TABLE IF NOT EXISTS announcements (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
content TEXT NOT NULL,
is_active INTEGER NOT NULL DEFAULT 1,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS activity_logs (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
action TEXT NOT NULL,
details TEXT,
created_at INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
`);
console.log('Tables created successfully!');
// Insert default admin user
const now = Date.now();
const adminPassword = await bcrypt.hash('admin123', 10);
try {
const stmt = db.prepare(`
INSERT OR IGNORE INTO users (id, email, name, surname, password, role, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`);
stmt.run(
'admin-' + crypto.randomUUID(),
'admin@ttbooking.com',
'Admin',
'User',
adminPassword,
'admin',
now,
now
);
console.log('Admin user created: admin@ttbooking.com / admin123');
} catch (error) {
console.log('Admin user might already exist');
}
// Insert default courts
try {
const courtStmt = db.prepare(`
INSERT OR IGNORE INTO courts (id, name, is_active, created_at, updated_at)
VALUES (?, ?, ?, ?, ?)
`);
courtStmt.run('court-1', 'Court 1', 1, now, now);
courtStmt.run('court-2', 'Court 2', 1, now, now);
console.log('Default courts created');
} catch (error) {
console.log('Courts might already exist');
}
// Insert time slots
try {
const timeSlotStmt = db.prepare(`
INSERT OR IGNORE INTO time_slots (id, start_time, end_time, is_active, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?)
`);
const timeSlots = [
['09:00', '10:00'],
['10:00', '11:00'],
['11:00', '12:00'],
['12:00', '13:00'],
['13:00', '14:00'],
['14:00', '15:00'],
['15:00', '16:00'],
['16:00', '17:00'],
['17:00', '18:00'],
['18:00', '19:00'],
['19:00', '20:00'],
['20:00', '21:00'],
];
timeSlots.forEach(([start, end], index) => {
timeSlotStmt.run(`slot-${index + 1}`, start, end, 1, now, now);
});
console.log('Time slots created');
} catch (error) {
console.log('Time slots might already exist');
}
// Insert default settings
try {
const settingsStmt = db.prepare(`
INSERT OR IGNORE INTO settings (id, key, value, description, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?)
`);
settingsStmt.run('setting-1', 'booking_advance_days', '7', 'Days in advance users can book', now, now);
settingsStmt.run('setting-2', 'max_bookings_per_user', '3', 'Maximum bookings per user per week', now, now);
settingsStmt.run('setting-3', 'booking_duration', '60', 'Booking duration in minutes', now, now);
console.log('Default settings created');
} catch (error) {
console.log('Settings might already exist');
}
db.close();
console.log('Database setup completed!');
}
setupDatabase().catch(console.error);