Files
IT-Nexus/backend/src/models/User.js

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;