forked from Public/pics
Switch from email-based OIDC matching to the stable `sub` claim. Existing users are migrated by email on first login, new users are auto-enrolled from OIDC claims, and admin status is synced from the IdP's groups claim. Also expose oidc_sub on the admin edit-user page. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
105 lines
2.3 KiB
SQL
105 lines
2.3 KiB
SQL
-- SQLite schema for Kabuki CMS / pics
|
|
--
|
|
-- Usage:
|
|
-- sqlite3 data/pics.sqlite < schema.sqlite.sql
|
|
--
|
|
-- Config (add to config.php):
|
|
-- define('DB_DRIVER', 'sqlite');
|
|
-- define('DB_FILE', __DIR__ . '/data/pics.sqlite');
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id_user INTEGER PRIMARY KEY,
|
|
first_name TEXT NOT NULL,
|
|
surname TEXT NOT NULL,
|
|
slug TEXT NOT NULL UNIQUE,
|
|
emailaddress TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
creation_time INTEGER NOT NULL,
|
|
last_action_time INTEGER,
|
|
ip_address TEXT,
|
|
is_admin INTEGER NOT NULL DEFAULT 0,
|
|
reset_key TEXT,
|
|
reset_blocked_until INTEGER,
|
|
oidc_sub TEXT UNIQUE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS assets (
|
|
id_asset INTEGER PRIMARY KEY,
|
|
id_user_uploaded INTEGER NOT NULL,
|
|
subdir TEXT NOT NULL,
|
|
filename TEXT NOT NULL,
|
|
title TEXT,
|
|
slug TEXT UNIQUE,
|
|
mimetype TEXT,
|
|
image_width INTEGER,
|
|
image_height INTEGER,
|
|
date_captured TEXT,
|
|
priority INTEGER DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS assets_meta (
|
|
id_asset INTEGER NOT NULL,
|
|
variable TEXT NOT NULL,
|
|
value TEXT,
|
|
PRIMARY KEY (id_asset, variable)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS assets_thumbs (
|
|
id_asset INTEGER NOT NULL,
|
|
width INTEGER NOT NULL,
|
|
height INTEGER NOT NULL,
|
|
mode TEXT,
|
|
filename TEXT,
|
|
PRIMARY KEY (id_asset, width, height, mode)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tags (
|
|
id_tag INTEGER PRIMARY KEY,
|
|
id_parent INTEGER,
|
|
id_asset_thumb INTEGER,
|
|
id_user_owner INTEGER,
|
|
tag TEXT NOT NULL,
|
|
slug TEXT NOT NULL UNIQUE,
|
|
description TEXT,
|
|
kind TEXT NOT NULL DEFAULT 'Tag',
|
|
count INTEGER DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS assets_tags (
|
|
id_asset INTEGER NOT NULL,
|
|
id_tag INTEGER NOT NULL,
|
|
PRIMARY KEY (id_asset, id_tag)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS posts_assets (
|
|
id_post INTEGER NOT NULL,
|
|
id_asset INTEGER NOT NULL,
|
|
PRIMARY KEY (id_post, id_asset)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS posts_tags (
|
|
id_post INTEGER NOT NULL,
|
|
id_tag INTEGER NOT NULL,
|
|
PRIMARY KEY (id_post, id_tag)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS settings (
|
|
id_user INTEGER NOT NULL,
|
|
variable TEXT NOT NULL,
|
|
value TEXT,
|
|
time_set TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (id_user, variable)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS log_errors (
|
|
id_entry INTEGER PRIMARY KEY,
|
|
id_user INTEGER,
|
|
message TEXT,
|
|
debug_info TEXT,
|
|
file TEXT,
|
|
line INTEGER,
|
|
request_uri TEXT,
|
|
time TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
ip_address TEXT
|
|
);
|