initial version of the app
This commit is contained in:
@@ -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);
|
||||
Reference in New Issue
Block a user