184 lines
7.0 KiB
JavaScript
184 lines
7.0 KiB
JavaScript
const { getDatabase } = require('../config/database');
|
|
|
|
class User {
|
|
static getAll() {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
SELECT
|
|
u.id, u.username, u.email, u.first_name, u.last_name,
|
|
u.is_active, u.must_change_password, u.email_notifications, u.last_login,
|
|
u.created_at, u.updated_at, u.role_id, u.azure_id,
|
|
u.department, u.position, u.phone, u.location, u.manager_id,
|
|
u.cost_center, u.employment_type, u.work_hours, u.joined_date, u.avatar_url,
|
|
r.name as role_name, r.description as role_description
|
|
FROM users u
|
|
LEFT JOIN roles r ON u.role_id = r.id
|
|
ORDER BY u.created_at DESC
|
|
`);
|
|
return stmt.all();
|
|
}
|
|
|
|
static getById(id) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
SELECT
|
|
u.id, u.username, u.email, u.first_name, u.last_name,
|
|
u.is_active, u.must_change_password, u.email_notifications, u.last_login,
|
|
u.created_at, u.updated_at, u.role_id, u.azure_id,
|
|
u.department, u.position, u.phone, u.location, u.manager_id,
|
|
u.cost_center, u.employment_type, u.work_hours, u.joined_date, u.avatar_url,
|
|
r.name as role_name, r.description as role_description
|
|
FROM users u
|
|
LEFT JOIN roles r ON u.role_id = r.id
|
|
WHERE u.id = ?
|
|
`);
|
|
return stmt.get(id);
|
|
}
|
|
|
|
static getByIdWithPassword(id) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
SELECT u.*, r.name as role_name, r.description as role_description
|
|
FROM users u
|
|
LEFT JOIN roles r ON u.role_id = r.id
|
|
WHERE u.id = ?
|
|
`);
|
|
return stmt.get(id);
|
|
}
|
|
|
|
static getByUsername(username) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
SELECT u.*, r.name as role_name
|
|
FROM users u
|
|
LEFT JOIN roles r ON u.role_id = r.id
|
|
WHERE u.username = ?
|
|
`);
|
|
return stmt.get(username);
|
|
}
|
|
|
|
static getByEmail(email) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
SELECT u.*, r.name as role_name
|
|
FROM users u
|
|
LEFT JOIN roles r ON u.role_id = r.id
|
|
WHERE u.email = ?
|
|
`);
|
|
return stmt.get(email);
|
|
}
|
|
|
|
static getByAzureId(azureId) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
SELECT u.*, r.name as role_name
|
|
FROM users u
|
|
LEFT JOIN roles r ON u.role_id = r.id
|
|
WHERE u.azure_id = ?
|
|
`);
|
|
return stmt.get(azureId);
|
|
}
|
|
|
|
static createFromAzure({ azure_id, email, first_name, last_name, username }) {
|
|
const db = getDatabase();
|
|
const role = db.prepare("SELECT id FROM roles WHERE name = 'benutzer'").get();
|
|
const stmt = db.prepare(`
|
|
INSERT INTO users (username, email, password_hash, role_id, first_name, last_name, is_active, must_change_password, azure_id)
|
|
VALUES (?, ?, 'AZURE_SSO_NO_PASSWORD', ?, ?, ?, 1, 0, ?)
|
|
`);
|
|
const result = stmt.run(username, email, role.id, first_name || null, last_name || null, azure_id);
|
|
return this.getById(result.lastInsertRowid);
|
|
}
|
|
|
|
static create(userData) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
INSERT INTO users (
|
|
username, email, password_hash, role_id,
|
|
first_name, last_name, is_active, must_change_password
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
`);
|
|
const result = stmt.run(
|
|
userData.username,
|
|
userData.email,
|
|
userData.password_hash,
|
|
userData.role_id,
|
|
userData.first_name || null,
|
|
userData.last_name || null,
|
|
userData.is_active !== undefined ? (userData.is_active ? 1 : 0) : 1,
|
|
userData.must_change_password !== undefined ? (userData.must_change_password ? 1 : 0) : 1
|
|
);
|
|
return this.getById(result.lastInsertRowid);
|
|
}
|
|
|
|
static update(id, userData) {
|
|
const db = getDatabase();
|
|
const fields = [];
|
|
const values = [];
|
|
|
|
if (userData.username !== undefined) { fields.push('username = ?'); values.push(userData.username); }
|
|
if (userData.email !== undefined) { fields.push('email = ?'); values.push(userData.email); }
|
|
if (userData.password_hash !== undefined) { fields.push('password_hash = ?'); values.push(userData.password_hash); }
|
|
if (userData.role_id !== undefined) { fields.push('role_id = ?'); values.push(userData.role_id); }
|
|
if (userData.first_name !== undefined) { fields.push('first_name = ?'); values.push(userData.first_name); }
|
|
if (userData.last_name !== undefined) { fields.push('last_name = ?'); values.push(userData.last_name); }
|
|
if (userData.is_active !== undefined) { fields.push('is_active = ?'); values.push(userData.is_active ? 1 : 0); }
|
|
if (userData.must_change_password !== undefined) { fields.push('must_change_password = ?'); values.push(userData.must_change_password ? 1 : 0); }
|
|
if (userData.azure_id !== undefined) { fields.push('azure_id = ?'); values.push(userData.azure_id); }
|
|
|
|
fields.push('updated_at = CURRENT_TIMESTAMP');
|
|
values.push(id);
|
|
|
|
const stmt = db.prepare(`UPDATE users SET ${fields.join(', ')} WHERE id = ?`);
|
|
stmt.run(...values);
|
|
return this.getById(id);
|
|
}
|
|
|
|
static delete(id) {
|
|
const db = getDatabase();
|
|
const result = db.prepare('DELETE FROM users WHERE id = ?').run(id);
|
|
return result.changes > 0;
|
|
}
|
|
|
|
static updateLastLogin(id) {
|
|
const db = getDatabase();
|
|
db.prepare('UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE id = ?').run(id);
|
|
}
|
|
|
|
static changePassword(id, passwordHash, mustChange = false) {
|
|
const db = getDatabase();
|
|
db.prepare(`
|
|
UPDATE users SET password_hash = ?, must_change_password = ?, updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = ?
|
|
`).run(passwordHash, mustChange ? 1 : 0, id);
|
|
}
|
|
|
|
static updateEmailNotifications(id, enabled) {
|
|
const db = getDatabase();
|
|
db.prepare('UPDATE users SET email_notifications = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?')
|
|
.run(enabled ? 1 : 0, id);
|
|
return this.getById(id);
|
|
}
|
|
|
|
static updateStaffNotifications(id, prefs) {
|
|
const db = getDatabase();
|
|
db.prepare(`UPDATE users SET
|
|
notif_ticket_created = ?,
|
|
notif_ticket_assigned = ?,
|
|
notif_new_comment = ?,
|
|
notif_weekly_report = ?,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = ?`
|
|
).run(
|
|
prefs.notif_ticket_created ? 1 : 0,
|
|
prefs.notif_ticket_assigned ? 1 : 0,
|
|
prefs.notif_new_comment ? 1 : 0,
|
|
prefs.notif_weekly_report ? 1 : 0,
|
|
id
|
|
);
|
|
return this.getById(id);
|
|
}
|
|
}
|
|
|
|
module.exports = User;
|