Benutzer, Ticketzuweißungen

This commit is contained in:
2026-03-23 03:12:08 +01:00
parent e75a2e5e20
commit 08391cdb6c
29 changed files with 592 additions and 111 deletions

View File

@@ -128,7 +128,7 @@ if (!tbl) {
"id" TEXT NOT NULL PRIMARY KEY,
"username" TEXT NOT NULL UNIQUE,
"password_hash" TEXT,
"role" TEXT NOT NULL DEFAULT 'user' CHECK ("role" IN ('admin', 'user')),
"role" TEXT NOT NULL DEFAULT 'after_sales' CHECK ("role" IN ('admin', 'viewer', 'after_sales')),
"source" TEXT NOT NULL DEFAULT 'local' CHECK ("source" IN ('local', 'ldap')),
"ldap_dn" TEXT,
"firstname" TEXT,
@@ -149,6 +149,65 @@ if (!userCols.some((c) => c.name === 'lastname')) {
db.exec('ALTER TABLE users ADD COLUMN lastname TEXT');
}
const usersTableSql = db
.prepare(
"SELECT sql FROM sqlite_master WHERE type='table' AND name='users'",
)
.get()?.sql;
if (usersTableSql && !usersTableSql.includes('after_sales')) {
db.exec('BEGIN');
try {
db.exec(`
CREATE TABLE "users_new" (
"id" TEXT NOT NULL PRIMARY KEY,
"username" TEXT NOT NULL UNIQUE,
"password_hash" TEXT,
"role" TEXT NOT NULL DEFAULT 'after_sales' CHECK ("role" IN ('admin', 'viewer', 'after_sales')),
"source" TEXT NOT NULL DEFAULT 'local' CHECK ("source" IN ('local', 'ldap')),
"ldap_dn" TEXT,
"firstname" TEXT,
"lastname" TEXT,
"active" INTEGER NOT NULL DEFAULT 1 CHECK ("active" IN (0, 1)),
"created_at" TEXT NOT NULL DEFAULT (datetime('now')),
"updated_at" TEXT NOT NULL DEFAULT (datetime('now'))
);
`);
db.exec(`
INSERT INTO users_new (
id, username, password_hash, role, source, ldap_dn, firstname, lastname, active, created_at, updated_at
)
SELECT
id,
username,
password_hash,
CASE
WHEN role = 'user' THEN 'after_sales'
WHEN role IN ('admin', 'viewer', 'after_sales') THEN role
ELSE 'after_sales'
END,
source,
ldap_dn,
firstname,
lastname,
active,
created_at,
updated_at
FROM users;
`);
db.exec('DROP TABLE users');
db.exec('ALTER TABLE users_new RENAME TO users');
db.exec('CREATE INDEX IF NOT EXISTS users_username_idx ON "users" ("username")');
db.exec('COMMIT');
} catch (e) {
try {
db.exec('ROLLBACK');
} catch {
/* ignore */
}
throw e;
}
}
const tblSet = db
.prepare(
"SELECT name FROM sqlite_master WHERE type='table' AND name='app_settings'",
@@ -276,4 +335,14 @@ if (ticketCols2.some((c) => c.name === 'sla_anchor_at')) {
).run();
}
const ticketCols3 = db.prepare('PRAGMA table_info(tickets)').all();
if (!ticketCols3.some((c) => c.name === 'assigned_user_id')) {
db.exec(
'ALTER TABLE tickets ADD COLUMN assigned_user_id TEXT REFERENCES users(id) ON DELETE SET NULL ON UPDATE CASCADE',
);
db.exec(
'CREATE INDEX IF NOT EXISTS tickets_assigned_user_id_idx ON tickets (assigned_user_id)',
);
}
export default db;