const db = require('../config/db'); const crypto = require('crypto'); const User = { findAll: async (companyId) => { const [rows] = await db.query( 'SELECT id, company_id, nombre, email, rol, is_active, created_at FROM users WHERE company_id = ? ORDER BY created_at DESC', [companyId] ); return rows; }, findById: async (id) => { const [rows] = await db.query( 'SELECT u.*, c.name as company_name, c.plan as company_plan, c.max_users, c.max_tickets FROM users u LEFT JOIN companies c ON u.company_id = c.id WHERE u.id = ?', [id] ); return rows[0]; }, findByEmail: async (email) => { const [rows] = await db.query( 'SELECT u.*, c.name as company_name, c.plan as company_plan, c.max_users, c.max_tickets FROM users u LEFT JOIN companies c ON u.company_id = c.id WHERE u.email = ?', [email] ); return rows[0]; }, create: async (companyId, nombre, email, password, rol = 'client', provider = 'local', providerId = null, avatarUrl = null) => { const [result] = await db.query( 'INSERT INTO users (company_id, nombre, email, password, rol, provider, provider_id, avatar_url) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [companyId, nombre, email, password, rol, provider, providerId, avatarUrl] ); return result.insertId; }, upsertExternal: async (nombre, email, provider, providerId, avatarUrl = null, companyId = 1) => { const existing = await User.findByEmail(email); if (existing) { await User.update(existing.id, { nombre: nombre || existing.nombre, provider: provider || existing.provider, provider_id: providerId || existing.provider_id, avatar_url: avatarUrl || existing.avatar_url }); return await User.findById(existing.id); } const insertId = await User.create(companyId, nombre, email, null, 'client', provider, providerId, avatarUrl); return await User.findById(insertId); }, update: async (id, data) => { const fields = []; const values = []; for (const [key, value] of Object.entries(data)) { fields.push(`${key} = ?`); values.push(value); } if (fields.length === 0) return; values.push(id); await db.query(`UPDATE users SET ${fields.join(', ')} WHERE id = ?`, values); }, delete: async (id) => { await db.query('DELETE FROM users WHERE id = ?', [id]); }, findByInviteToken: async (token) => { const [rows] = await db.query( 'SELECT * FROM users WHERE invite_token = ? AND invite_token_expires > NOW()', [token] ); return rows[0]; }, generateInviteToken: async (userId) => { const token = crypto.randomBytes(32).toString('hex'); const expires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); await db.query( 'UPDATE users SET invite_token = ?, invite_token_expires = ? WHERE id = ?', [token, expires, userId] ); return token; }, countByCompany: async (companyId) => { const [rows] = await db.query( 'SELECT COUNT(*) as total FROM users WHERE company_id = ? AND is_active = 1', [companyId] ); return rows[0].total; } }; module.exports = User;