Replace old team system with work teams (equipos de trabajo)
- New migration 003_teams.sql: teams, team_user, team_server tables - New Team model with CRUD, members, and server assignment - New TeamController with full team management - New views: teams/index, teams/create, teams/show - Server model: getUserRole and getAccessibleServerIds now include team-based access - Sidebar: Teams link under Administration (admin+ only) - Routes: old /team routes removed, new /teams routes added - Removed old ServerController team methods and views - Fixed sidebar empty accessible IDs returning all servers - Fixed dashboard and API to show empty when no accessible servers
This commit is contained in:
@@ -64,9 +64,7 @@ class ServerController
|
||||
if ($group) $filters['group_name'] = $group;
|
||||
|
||||
$accessibleIds = $this->serverModel->getAccessibleServerIds($userId);
|
||||
if (!empty($accessibleIds)) {
|
||||
$filters['accessible_ids'] = $accessibleIds;
|
||||
}
|
||||
$filters['accessible_ids'] = !empty($accessibleIds) ? $accessibleIds : [-1];
|
||||
|
||||
$servers = $this->serverModel->getAll($page, 15, $filters);
|
||||
$groups = $this->serverModel->getGroups();
|
||||
@@ -1797,140 +1795,4 @@ class ServerController
|
||||
]);
|
||||
}
|
||||
|
||||
public function team(): void
|
||||
{
|
||||
$userId = (int) Session::get('user_id');
|
||||
$servers = $this->serverModel->getOwnedServers($userId);
|
||||
|
||||
$result = [];
|
||||
foreach ($servers as $server) {
|
||||
$memberCount = count($this->serverModel->getTeam((int) $server['id']));
|
||||
$result[] = [
|
||||
'id' => $server['id'],
|
||||
'name' => $server['name'],
|
||||
'ip_address' => $server['ip_address'],
|
||||
'member_count' => $memberCount,
|
||||
'status' => $server['current_status'] ?? 'unknown',
|
||||
];
|
||||
}
|
||||
|
||||
$this->view->display('servers.team', [
|
||||
'title' => 'Team Management - ServerManager',
|
||||
'servers' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
public function teamServer(int $id): void
|
||||
{
|
||||
$userId = (int) Session::get('user_id');
|
||||
$server = $this->serverModel->findById($id);
|
||||
|
||||
if (!$server || (int) $server['created_by'] !== $userId) {
|
||||
$this->view->error(404);
|
||||
}
|
||||
|
||||
$members = $this->serverModel->getTeam($id);
|
||||
|
||||
$userModel = new User();
|
||||
$users = $userModel->getAll(1, 999);
|
||||
$availableUsers = [];
|
||||
$memberIds = array_map(fn($m) => $m['user_id'], $members);
|
||||
foreach ($users['data'] as $u) {
|
||||
if (!in_array((int) $u['id'], $memberIds, true)) {
|
||||
$availableUsers[] = $u;
|
||||
}
|
||||
}
|
||||
|
||||
$this->view->display('servers.team_server', [
|
||||
'title' => 'Team - ' . $server['name'] . ' - ServerManager',
|
||||
'server' => $server,
|
||||
'members' => $members,
|
||||
'availableUsers' => $availableUsers,
|
||||
]);
|
||||
}
|
||||
|
||||
public function addTeamUser(int $id): void
|
||||
{
|
||||
$userId = (int) Session::get('user_id');
|
||||
$server = $this->serverModel->findById($id);
|
||||
|
||||
if (!$server || (int) $server['created_by'] !== $userId) {
|
||||
$this->view->json(['success' => false, 'message' => 'Server not found'], 404);
|
||||
}
|
||||
|
||||
$targetUserId = (int) ($_POST['user_id'] ?? 0);
|
||||
$role = $_POST['role'] ?? 'viewer';
|
||||
|
||||
if ($targetUserId <= 0) {
|
||||
$this->view->json(['success' => false, 'message' => 'Invalid user']);
|
||||
}
|
||||
|
||||
if (!in_array($role, ['viewer', 'manager'], true)) {
|
||||
$this->view->json(['success' => false, 'message' => 'Invalid role']);
|
||||
}
|
||||
|
||||
if ($this->serverModel->addUser($id, $targetUserId, $role)) {
|
||||
$this->auditService->log('team_user_added', 'server', $id, [
|
||||
'target_user_id' => $targetUserId,
|
||||
'role' => $role,
|
||||
]);
|
||||
$this->view->json(['success' => true, 'message' => 'User added to server.']);
|
||||
}
|
||||
|
||||
$this->view->json(['success' => false, 'message' => 'User is already assigned to this server.']);
|
||||
}
|
||||
|
||||
public function removeTeamUser(int $id): void
|
||||
{
|
||||
$userId = (int) Session::get('user_id');
|
||||
$server = $this->serverModel->findById($id);
|
||||
|
||||
if (!$server || (int) $server['created_by'] !== $userId) {
|
||||
$this->view->json(['success' => false, 'message' => 'Server not found'], 404);
|
||||
}
|
||||
|
||||
$targetUserId = (int) ($_POST['user_id'] ?? 0);
|
||||
|
||||
if ($targetUserId <= 0) {
|
||||
$this->view->json(['success' => false, 'message' => 'Invalid user']);
|
||||
}
|
||||
|
||||
$this->serverModel->removeUser($id, $targetUserId);
|
||||
|
||||
$this->auditService->log('team_user_removed', 'server', $id, [
|
||||
'target_user_id' => $targetUserId,
|
||||
]);
|
||||
|
||||
$this->view->json(['success' => true, 'message' => 'User removed from server.']);
|
||||
}
|
||||
|
||||
public function updateTeamUserRole(int $id): void
|
||||
{
|
||||
$userId = (int) Session::get('user_id');
|
||||
$server = $this->serverModel->findById($id);
|
||||
|
||||
if (!$server || (int) $server['created_by'] !== $userId) {
|
||||
$this->view->json(['success' => false, 'message' => 'Server not found'], 404);
|
||||
}
|
||||
|
||||
$targetUserId = (int) ($_POST['user_id'] ?? 0);
|
||||
$role = $_POST['role'] ?? 'viewer';
|
||||
|
||||
if ($targetUserId <= 0) {
|
||||
$this->view->json(['success' => false, 'message' => 'Invalid user']);
|
||||
}
|
||||
|
||||
if (!in_array($role, ['viewer', 'manager'], true)) {
|
||||
$this->view->json(['success' => false, 'message' => 'Invalid role']);
|
||||
}
|
||||
|
||||
$this->serverModel->updateUserRole($id, $targetUserId, $role);
|
||||
|
||||
$this->auditService->log('team_user_role_updated', 'server', $id, [
|
||||
'target_user_id' => $targetUserId,
|
||||
'role' => $role,
|
||||
]);
|
||||
|
||||
$this->view->json(['success' => true, 'message' => 'User role updated.']);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user