202 lines
10 KiB
PHP
Executable File
202 lines
10 KiB
PHP
Executable File
<?php
|
|
require_once __DIR__ . '/../includes/session_check.php';
|
|
require_once __DIR__ . '/../includes/db.php';
|
|
require_once __DIR__ . '/../includes/activity_logger.php';
|
|
|
|
// Admin-only access
|
|
if ($_SESSION['role'] !== 'admin') {
|
|
header('Location: ../index.php?error=unauthorized');
|
|
exit();
|
|
}
|
|
|
|
// Inicializar variables para el modo edición
|
|
$edit_mode = false;
|
|
$edit_id = null;
|
|
$edit_username = '';
|
|
$edit_role = 'user';
|
|
$edit_telegram_chat_id = '';
|
|
|
|
// Handle GET actions for editing
|
|
if (isset($_GET['edit'])) {
|
|
$edit_id = $_GET['edit'];
|
|
$stmt = $pdo->prepare("SELECT id, username, role, telegram_chat_id FROM users WHERE id = ?");
|
|
$stmt->execute([$edit_id]);
|
|
$user_to_edit = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if ($user_to_edit) {
|
|
$edit_mode = true;
|
|
$edit_username = $user_to_edit['username'];
|
|
$edit_role = $user_to_edit['role'];
|
|
$edit_telegram_chat_id = $user_to_edit['telegram_chat_id'];
|
|
} else {
|
|
$error = "Usuario no encontrado.";
|
|
}
|
|
}
|
|
|
|
// Handle POST actions
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
// Action: Create or Update User
|
|
if (isset($_POST['save_user'])) {
|
|
$username = $_POST['username'];
|
|
$role = $_POST['role'];
|
|
$telegram_chat_id = trim($_POST['telegram_chat_id']);
|
|
$is_edit = isset($_POST['edit_id']);
|
|
|
|
if (empty($username) || empty($role)) {
|
|
$error = "El nombre de usuario y el rol son obligatorios.";
|
|
} elseif (!empty($telegram_chat_id) && !is_numeric($telegram_chat_id)) {
|
|
$error = "El ID de Chat de Telegram debe ser un número.";
|
|
} else {
|
|
$chat_id_to_save = empty($telegram_chat_id) ? null : $telegram_chat_id;
|
|
try {
|
|
if ($is_edit) {
|
|
$edit_id = $_POST['edit_id'];
|
|
$details = 'Admin ' . $_SESSION['username'] . ' updated user: ' . $username . ' (ID: ' . $edit_id . ').';
|
|
|
|
if (!empty($_POST['password'])) {
|
|
$hashedPassword = password_hash($_POST['password'], PASSWORD_DEFAULT);
|
|
$stmt = $pdo->prepare("UPDATE users SET username = ?, password = ?, role = ?, telegram_chat_id = ? WHERE id = ?");
|
|
$stmt->execute([$username, $hashedPassword, $role, $chat_id_to_save, $edit_id]);
|
|
$details .= ' Password was changed.';
|
|
} else {
|
|
$stmt = $pdo->prepare("UPDATE users SET username = ?, role = ?, telegram_chat_id = ? WHERE id = ?");
|
|
$stmt->execute([$username, $role, $chat_id_to_save, $edit_id]);
|
|
}
|
|
log_activity($_SESSION['user_id'], 'User Updated', $details);
|
|
header('Location: users.php?success=updated');
|
|
exit();
|
|
} else {
|
|
if (empty($_POST['password'])) {
|
|
$error = "La contraseña es obligatoria para nuevos usuarios.";
|
|
} else {
|
|
$hashedPassword = password_hash($_POST['password'], PASSWORD_DEFAULT);
|
|
$stmt = $pdo->prepare("INSERT INTO users (username, password, role, telegram_chat_id) VALUES (?, ?, ?, ?)");
|
|
$stmt->execute([$username, $hashedPassword, $role, $chat_id_to_save]);
|
|
$new_user_id = $pdo->lastInsertId();
|
|
log_activity($_SESSION['user_id'], 'User Created', 'Admin ' . $_SESSION['username'] . ' created new user: ' . $username . ' (ID: ' . $new_user_id . ')');
|
|
header('Location: users.php?success=created');
|
|
exit();
|
|
}
|
|
}
|
|
} catch (PDOException $e) {
|
|
$error = ($e->errorInfo[1] == 1062) ? "El nombre de usuario ya existe." : "Error al guardar el usuario: " . $e->getMessage();
|
|
if ($is_edit) {
|
|
$edit_mode = true;
|
|
$edit_id = $_POST['edit_id'];
|
|
$edit_username = $username;
|
|
$edit_role = $role;
|
|
$edit_telegram_chat_id = $telegram_chat_id;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// ... (Otras acciones POST como eliminar, etc. se mantienen aquí)
|
|
}
|
|
|
|
// Fetch all users to display
|
|
$users = $pdo->query("SELECT id, username, role, created_at, telegram_chat_id FROM users ORDER BY username ASC")->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
require_once __DIR__ . '/../templates/header.php';
|
|
?>
|
|
|
|
<div class="container-fluid">
|
|
<h1 class="mt-4" data-translate="true">Administrar Usuarios</h1>
|
|
|
|
<?php if (isset($error)): ?><div class="alert alert-danger"><?= htmlspecialchars($error) ?></div><?php endif; ?>
|
|
<?php if (isset($_GET['success'])): /* ... Lógica de mensajes de éxito ... */ endif; ?>
|
|
|
|
<!-- Create/Edit User Form -->
|
|
<div class="card shadow-sm mb-4">
|
|
<div class="card-header">
|
|
<h5 class="mb-0" data-translate="true"><?= $edit_mode ? 'Editar Usuario' : 'Crear Nuevo Usuario' ?></h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<form action="users.php" method="POST">
|
|
<?php if ($edit_mode): ?>
|
|
<input type="hidden" name="edit_id" value="<?= $edit_id ?>">
|
|
<?php endif; ?>
|
|
<div class="row align-items-end">
|
|
<div class="col-md-3 mb-3">
|
|
<label for="username" class="form-label" data-translate="true">Usuario</label>
|
|
<input type="text" class="form-control" id="username" name="username"
|
|
value="<?= htmlspecialchars($edit_username) ?>" required>
|
|
</div>
|
|
<div class="col-md-3 mb-3">
|
|
<label for="password" class="form-label">
|
|
<span data-translate="true">Contraseña</span> <?php if ($edit_mode): ?><small class="text-muted" data-translate="true">(no cambiar)</small><?php endif; ?>
|
|
</label>
|
|
<input type="password" class="form-control" id="password" name="password" <?= !$edit_mode ? 'required' : '' ?>>
|
|
</div>
|
|
<div class="col-md-2 mb-3">
|
|
<label for="role" class="form-label" data-translate="true">Rol</label>
|
|
<select class="form-select" id="role" name="role" required>
|
|
<option value="user" <?= ($edit_role === 'user') ? 'selected' : '' ?> data-translate="true">Usuario</option>
|
|
<option value="admin" <?= ($edit_role === 'admin') ? 'selected' : '' ?> data-translate="true">Admin</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-2 mb-3">
|
|
<label for="telegram_chat_id" class="form-label" data-translate="true">ID Chat Telegram</label>
|
|
<input type="text" class="form-control" id="telegram_chat_id" name="telegram_chat_id"
|
|
value="<?= htmlspecialchars($edit_telegram_chat_id) ?>" placeholder="(Opcional)">
|
|
</div>
|
|
<div class="col-md-2 mb-3">
|
|
<button type="submit" name="save_user" class="btn btn-<?= $edit_mode ? 'success' : 'primary' ?> w-100" data-translate="true">
|
|
<?= $edit_mode ? 'Actualizar' : 'Crear' ?>
|
|
</button>
|
|
<?php if ($edit_mode): ?>
|
|
<a href="users.php" class="btn btn-outline-secondary w-100 mt-2" data-translate="true">Cancelar</a>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Users List -->
|
|
<div class="card shadow-sm">
|
|
<div class="card-header"><h5 data-translate="true">Lista de Usuarios</h5></div>
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th data-translate="true">ID</th>
|
|
<th data-translate="true">Usuario</th>
|
|
<th data-translate="true">Rol</th>
|
|
<th data-translate="true">ID Chat Telegram</th>
|
|
<th data-translate="true">Creado en</th>
|
|
<th class="text-center" data-translate="true">Acciones</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($users as $user): ?>
|
|
<tr>
|
|
<td><?= $user['id'] ?></td>
|
|
<td><?= htmlspecialchars($user['username']) ?></td>
|
|
<td><?= ucfirst($user['role']) ?></td>
|
|
<td>
|
|
<?php if (!empty($user['telegram_chat_id'])): ?>
|
|
<span class="badge bg-info text-dark"><?= htmlspecialchars($user['telegram_chat_id']) ?></span>
|
|
<?php else: ?>
|
|
<span class="badge bg-secondary" data-translate="true">No vinculado</span>
|
|
<?php endif; ?>
|
|
</td>
|
|
<td><?= date('d/m/Y H:i', strtotime($user['created_at'])) ?></td>
|
|
<td class="text-center">
|
|
<a href="?edit=<?= $user['id'] ?>#username" class="btn btn-sm btn-primary" title="Editar" data-translate-title="true">
|
|
<i class="bi bi-pencil"></i>
|
|
</a>
|
|
<!-- Otros botones de acción (modal, eliminar) -->
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Modales y Scripts -->
|
|
<?php require_once __DIR__ . '/../templates/footer.php'; ?>
|