diff --git a/api/assign_ticket.php b/api/assign_ticket.php index 1046909..28ced6c 100644 --- a/api/assign_ticket.php +++ b/api/assign_ticket.php @@ -1,11 +1,7 @@ false, 'error' => 'Ticket ID required']); - exit; -} -$ticketId = $ticketIdRaw; - -$ticketModel = new TicketModel($conn); -$auditLogModel = new AuditLogModel($conn); -$userModel = new UserModel($conn); - -// Verify ticket exists and user can access it -$ticket = $ticketModel->getTicketById($ticketId); -if (!$ticket || !$ticketModel->canUserAccessTicket($ticket, $currentUser)) { - http_response_code(404); - echo json_encode(['success' => false, 'error' => 'Ticket not found']); - exit; -} - -// Authorization: only admins or the ticket creator/assignee can reassign -if (!$isAdmin && (int)$ticket['created_by'] !== (int)$userId && (int)$ticket['assigned_to'] !== (int)$userId) { - http_response_code(403); - echo json_encode(['success' => false, 'error' => 'Permission denied']); - exit; -} - -if ($assignedTo === null || $assignedTo === '') { - // Unassign ticket - $success = $ticketModel->unassignTicket($ticketId, $userId); - if ($success) { - $auditLogModel->log($userId, 'unassign', 'ticket', $ticketId); - } -} else { - // Validate assigned_to is a valid user ID - $assignedTo = (int)$assignedTo; - $targetUser = $userModel->getUserById($assignedTo); - if (!$targetUser) { - http_response_code(400); - echo json_encode(['success' => false, 'error' => 'Invalid user ID']); - exit; - } - - // Assign ticket - $success = $ticketModel->assignTicket($ticketId, $assignedTo, $userId); - if ($success) { - $auditLogModel->log($userId, 'assign', 'ticket', $ticketId, ['assigned_to' => $assignedTo]); - - if (!empty($GLOBALS['config']['MATRIX_NOTIFY_ASSIGNMENTS'])) { - $changedByDisplay = $currentUser['display_name'] ?? $currentUser['username'] ?? null; - $assigneeName = $targetUser['display_name'] ?? $targetUser['username'] ?? null; - $assigneeMatrix = isset($targetUser['username']) - ? SynapseHelper::resolveUsername($targetUser['username']) - : null; - NotificationHelper::sendAssignmentNotification( - $ticketId, - $ticket['title'] ?? "Ticket #{$ticketId}", - $assigneeName, - $assigneeMatrix, - $changedByDisplay, - $ticket['visibility'] ?? 'public' - ); - } - } -} - -if (!$success) { - http_response_code(500); - apiRespond(['success' => false, 'error' => 'Failed to update ticket assignment']); -} else { - require_once dirname(__DIR__) . '/models/StatsModel.php'; - (new StatsModel($conn))->invalidateCache(); - apiRespond(['success' => true]); +if (!empty($result['http_status'])) { + http_response_code($result['http_status']); + unset($result['http_status']); } +apiRespond($result); diff --git a/services/AssignmentService.php b/services/AssignmentService.php new file mode 100644 index 0000000..706fcba --- /dev/null +++ b/services/AssignmentService.php @@ -0,0 +1,98 @@ + false, 'error' => 'Ticket ID required', 'http_status' => 400]; + } + $ticketId = $ticketIdRaw; + + $ticketModel = new TicketModel($conn); + $auditLogModel = new AuditLogModel($conn); + $userModel = new UserModel($conn); + + // Verify ticket exists and user can access it + $ticket = $ticketModel->getTicketById($ticketId); + if (!$ticket || !$ticketModel->canUserAccessTicket($ticket, $currentUser)) { + return ['success' => false, 'error' => 'Ticket not found', 'http_status' => 404]; + } + + // Authorization: only admins or the ticket creator/assignee can reassign + if (!$isAdmin && (int)$ticket['created_by'] !== (int)$userId && (int)$ticket['assigned_to'] !== (int)$userId) { + return ['success' => false, 'error' => 'Permission denied', 'http_status' => 403]; + } + + if ($assignedTo === null || $assignedTo === '') { + // Unassign ticket + $success = $ticketModel->unassignTicket($ticketId, $userId); + if ($success) { + $auditLogModel->log($userId, 'unassign', 'ticket', $ticketId); + } + } else { + // Validate assigned_to is a valid user ID + $assignedTo = (int)$assignedTo; + $targetUser = $userModel->getUserById($assignedTo); + if (!$targetUser) { + return ['success' => false, 'error' => 'Invalid user ID', 'http_status' => 400]; + } + + // Assign ticket + $success = $ticketModel->assignTicket($ticketId, $assignedTo, $userId); + if ($success) { + $auditLogModel->log($userId, 'assign', 'ticket', $ticketId, ['assigned_to' => $assignedTo]); + + if (!empty($GLOBALS['config']['MATRIX_NOTIFY_ASSIGNMENTS'])) { + $changedByDisplay = $currentUser['display_name'] ?? $currentUser['username'] ?? null; + $assigneeName = $targetUser['display_name'] ?? $targetUser['username'] ?? null; + $assigneeMatrix = isset($targetUser['username']) + ? SynapseHelper::resolveUsername($targetUser['username']) + : null; + NotificationHelper::sendAssignmentNotification( + $ticketId, + $ticket['title'] ?? "Ticket #{$ticketId}", + $assigneeName, + $assigneeMatrix, + $changedByDisplay, + $ticket['visibility'] ?? 'public' + ); + } + } + } + + if (!$success) { + return ['success' => false, 'error' => 'Failed to update ticket assignment', 'http_status' => 500]; + } + + (new StatsModel($conn))->invalidateCache(); + return ['success' => true]; + } +}