Files
siti-plugin-repo/server/lib/schema.js

64 lines
2.4 KiB
JavaScript

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 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),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
last_version_check_at DATETIME 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;
`);
}
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;
`);
}
export async function ensureSchema() {
await createUsersTable();
await createLicensesTable();
await createLicenseHostnamesTable();
}