|
|
|
@@ -14,6 +14,23 @@ function createPool() {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function addColumnIfMissing(pool, tableName, columnName, columnDefinition) {
|
|
|
|
|
const [rows] = await pool.query(
|
|
|
|
|
`SELECT COUNT(*) AS column_count
|
|
|
|
|
FROM information_schema.columns
|
|
|
|
|
WHERE table_schema = DATABASE()
|
|
|
|
|
AND table_name = ?
|
|
|
|
|
AND column_name = ?`,
|
|
|
|
|
[tableName, columnName]
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (rows.length && Number(rows[0].column_count) > 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await pool.query(`ALTER TABLE \`${tableName}\` ADD COLUMN \`${columnName}\` ${columnDefinition}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function ensureSchema(pool) {
|
|
|
|
|
await pool.query(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS canvas_sizes (
|
|
|
|
@@ -26,9 +43,9 @@ async function ensureSchema(pool) {
|
|
|
|
|
UNIQUE KEY uq_canvas_sizes_dimensions (width, height)
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
await pool.query('ALTER TABLE canvas_sizes ADD COLUMN IF NOT EXISTS modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE canvas_sizes ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE canvas_sizes ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER modified_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'canvas_sizes', 'modified_at', 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
|
|
|
|
|
await addColumnIfMissing(pool, 'canvas_sizes', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'canvas_sizes', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
await pool.query(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS playlists (
|
|
|
|
@@ -39,10 +56,10 @@ async function ensureSchema(pool) {
|
|
|
|
|
modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
await pool.query('ALTER TABLE playlists ADD COLUMN IF NOT EXISTS fade_between_slides TINYINT(1) NOT NULL DEFAULT 0 AFTER name');
|
|
|
|
|
await pool.query('ALTER TABLE playlists ADD COLUMN IF NOT EXISTS modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE playlists ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE playlists ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER modified_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlists', 'fade_between_slides', 'TINYINT(1) NOT NULL DEFAULT 0');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlists', 'modified_at', 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlists', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlists', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
await pool.query(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS slide_templates (
|
|
|
|
@@ -55,11 +72,11 @@ async function ensureSchema(pool) {
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
await pool.query('ALTER TABLE slide_templates ADD COLUMN IF NOT EXISTS canvas_size_id INT NULL AFTER name');
|
|
|
|
|
await pool.query('ALTER TABLE slide_templates ADD COLUMN IF NOT EXISTS background_image_path VARCHAR(512) NULL');
|
|
|
|
|
await pool.query('ALTER TABLE slide_templates ADD COLUMN IF NOT EXISTS modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE slide_templates ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE slide_templates ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER modified_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_templates', 'canvas_size_id', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_templates', 'background_image_path', 'VARCHAR(512) NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_templates', 'modified_at', 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_templates', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_templates', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
await pool.query(`
|
|
|
|
|
INSERT IGNORE INTO canvas_sizes (name, width, height) VALUES
|
|
|
|
@@ -103,10 +120,10 @@ async function ensureSchema(pool) {
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
await pool.query('ALTER TABLE slide_template_regions ADD COLUMN IF NOT EXISTS font_family VARCHAR(100) NULL AFTER label');
|
|
|
|
|
await pool.query('ALTER TABLE slide_template_regions ADD COLUMN IF NOT EXISTS modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE slide_template_regions ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE slide_template_regions ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER modified_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_template_regions', 'font_family', 'VARCHAR(100) NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_template_regions', 'modified_at', 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_template_regions', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slide_template_regions', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
await pool.query(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS slides (
|
|
|
|
@@ -122,14 +139,14 @@ async function ensureSchema(pool) {
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
await pool.query('ALTER TABLE slides ADD COLUMN IF NOT EXISTS body TEXT NULL AFTER title');
|
|
|
|
|
await pool.query('ALTER TABLE slides ADD COLUMN IF NOT EXISTS template_id INT NULL AFTER body');
|
|
|
|
|
await pool.query('ALTER TABLE slides ADD COLUMN IF NOT EXISTS content_json JSON NULL AFTER template_id');
|
|
|
|
|
await pool.query('ALTER TABLE slides ADD COLUMN IF NOT EXISTS media_path VARCHAR(512) NULL AFTER content_json');
|
|
|
|
|
await pool.query('ALTER TABLE slides ADD COLUMN IF NOT EXISTS media_type VARCHAR(100) NULL AFTER media_path');
|
|
|
|
|
await pool.query('ALTER TABLE slides ADD COLUMN IF NOT EXISTS modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE slides ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE slides ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER modified_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'slides', 'body', 'TEXT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slides', 'template_id', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slides', 'content_json', 'JSON NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slides', 'media_path', 'VARCHAR(512) NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slides', 'media_type', 'VARCHAR(100) NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slides', 'modified_at', 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
|
|
|
|
|
await addColumnIfMissing(pool, 'slides', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'slides', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
await pool.query(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS playlist_slides (
|
|
|
|
@@ -151,16 +168,16 @@ async function ensureSchema(pool) {
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS duration_seconds INT NOT NULL DEFAULT 10 AFTER position');
|
|
|
|
|
await pool.query("ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS schedule_mode VARCHAR(20) NOT NULL DEFAULT 'always' AFTER duration_seconds");
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS schedule_start_datetime DATETIME NULL AFTER schedule_mode');
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS schedule_end_datetime DATETIME NULL AFTER schedule_start_datetime');
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS schedule_start_time TIME NULL AFTER schedule_end_datetime');
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS schedule_end_time TIME NULL AFTER schedule_start_time');
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS schedule_days_json JSON NULL AFTER schedule_end_time');
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE playlist_slides ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER modified_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'duration_seconds', 'INT NOT NULL DEFAULT 10');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'schedule_mode', "VARCHAR(20) NOT NULL DEFAULT 'always'");
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'schedule_start_datetime', 'DATETIME NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'schedule_end_datetime', 'DATETIME NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'schedule_start_time', 'TIME NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'schedule_end_time', 'TIME NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'schedule_days_json', 'JSON NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'modified_at', 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'playlist_slides', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
await pool.query(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS screens (
|
|
|
|
@@ -174,10 +191,10 @@ async function ensureSchema(pool) {
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
await pool.query('ALTER TABLE screens ADD COLUMN IF NOT EXISTS playlist_id INT NULL AFTER slug');
|
|
|
|
|
await pool.query('ALTER TABLE screens ADD COLUMN IF NOT EXISTS modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE screens ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE screens ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER modified_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'screens', 'playlist_id', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'screens', 'modified_at', 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
|
|
|
|
|
await addColumnIfMissing(pool, 'screens', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'screens', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
await pool.query(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
|
|
@@ -191,13 +208,13 @@ async function ensureSchema(pool) {
|
|
|
|
|
modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
await pool.query('ALTER TABLE users ADD COLUMN IF NOT EXISTS name VARCHAR(255) NULL AFTER id');
|
|
|
|
|
await pool.query('ALTER TABLE users ADD COLUMN IF NOT EXISTS password_hash CHAR(64) NOT NULL AFTER username');
|
|
|
|
|
await pool.query('ALTER TABLE users ADD COLUMN IF NOT EXISTS password_salt VARCHAR(64) NOT NULL AFTER password_hash');
|
|
|
|
|
await pool.query('ALTER TABLE users ADD COLUMN IF NOT EXISTS password_iterations INT NOT NULL AFTER password_salt');
|
|
|
|
|
await pool.query('ALTER TABLE users ADD COLUMN IF NOT EXISTS modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE users ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE users ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER modified_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'users', 'name', 'VARCHAR(255) NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'users', 'password_hash', 'CHAR(64) NOT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'users', 'password_salt', 'VARCHAR(64) NOT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'users', 'password_iterations', 'INT NOT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'users', 'modified_at', 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
|
|
|
|
|
await addColumnIfMissing(pool, 'users', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'users', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
await pool.query(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS auth_sessions (
|
|
|
|
@@ -209,8 +226,8 @@ async function ensureSchema(pool) {
|
|
|
|
|
CONSTRAINT fk_auth_sessions_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
|
|
|
`);
|
|
|
|
|
await pool.query('ALTER TABLE auth_sessions ADD COLUMN IF NOT EXISTS created_by INT NULL AFTER created_at');
|
|
|
|
|
await pool.query('ALTER TABLE auth_sessions ADD COLUMN IF NOT EXISTS modified_by INT NULL AFTER last_used_at');
|
|
|
|
|
await addColumnIfMissing(pool, 'auth_sessions', 'created_by', 'INT NULL');
|
|
|
|
|
await addColumnIfMissing(pool, 'auth_sessions', 'modified_by', 'INT NULL');
|
|
|
|
|
|
|
|
|
|
const [userCountRows] = await pool.query('SELECT COUNT(*) AS user_count FROM users');
|
|
|
|
|
if (!userCountRows.length || Number(userCountRows[0].user_count) === 0) {
|
|
|
|
|