import db from "./db.js"; async function createUsersTable() { await db.query(` CREATE TABLE IF NOT EXISTS users ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, name VARCHAR(120) NOT NULL, email VARCHAR(120) NOT NULL UNIQUE, is_admin TINYINT(1) NOT NULL DEFAULT 0, password_hash VARCHAR(255) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; `); const [columns] = await db.query(`SHOW COLUMNS FROM users LIKE 'is_admin'`); if (columns.length === 0) { await db.query(`ALTER TABLE users ADD COLUMN is_admin TINYINT(1) NOT NULL DEFAULT 0 AFTER email`); } } async function ensureColumn(table, column, definition) { const [columns] = await db.query(`SHOW COLUMNS FROM ${table} LIKE ?`, [column]); if (columns.length === 0) { await db.query(`ALTER TABLE ${table} ADD COLUMN ${definition}`); } } async function createLicensesTable() { await db.query(` CREATE TABLE IF NOT EXISTS licenses ( id CHAR(36) NOT NULL PRIMARY KEY, user_id INT UNSIGNED NOT NULL, license_key VARCHAR(64) NOT NULL UNIQUE, label VARCHAR(255), note TEXT, repo_provider VARCHAR(32) NOT NULL, repo_name VARCHAR(255) NOT NULL, repo_base_url VARCHAR(255), repo_id INT UNSIGNED NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, last_version_check_at DATETIME NULL, last_used_version VARCHAR(64) NULL, primary_hostname VARCHAR(255) NULL, primary_hostname_normalized VARCHAR(255) NULL, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; `); await ensureColumn( "licenses", "last_used_version", "last_used_version VARCHAR(64) NULL AFTER last_version_check_at" ); await ensureColumn( "licenses", "repo_id", "repo_id INT UNSIGNED NULL AFTER repo_base_url" ); await db .query( `ALTER TABLE licenses ADD CONSTRAINT fk_licenses_repo_id FOREIGN KEY (repo_id) REFERENCES repos(id) ON DELETE SET NULL` ) .catch(() => {}); } async function createLicenseHostnamesTable() { await db.query(` CREATE TABLE IF NOT EXISTS license_hostnames ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, license_id CHAR(36) NOT NULL, hostname VARCHAR(255) NOT NULL, normalized VARCHAR(255) NOT NULL, first_seen_at DATETIME NOT NULL, last_seen_at DATETIME NOT NULL, hits INT UNSIGNED NOT NULL DEFAULT 1, UNIQUE KEY unique_license_host (license_id, normalized), FOREIGN KEY (license_id) REFERENCES licenses(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; `); } async function createReposTable() { await db.query(` CREATE TABLE IF NOT EXISTS repos ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, provider VARCHAR(32) NOT NULL DEFAULT 'github', owner_repo VARCHAR(255) NOT NULL, base_url VARCHAR(255), label VARCHAR(255), created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY unique_repo_provider (provider, owner_repo) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; `); } export async function ensureSchema() { await createUsersTable(); await createReposTable(); await createLicensesTable(); await createLicenseHostnamesTable(); }