*/ function parseStringList(mixed $value): array { if ($value === null || $value === '') { return []; } $items = is_array($value) ? $value : [$value]; return array_values(array_filter(array_map('strval', $items), static fn (string $item): bool => $item !== '')); } /** * @return array */ function parseIntList(mixed $value): array { $items = parseStringList($value); return array_values(array_filter(array_map('intval', $items), static fn (int $item): bool => $item > 0)); } $method = $_SERVER['REQUEST_METHOD'] ?? 'GET'; $path = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH) ?: '/'; if ($method === 'OPTIONS') { http_response_code(204); exit; } try { $api = new ReportsApi(); if ($method === 'GET' && $path === '/api/teams') { echo json_encode($api->getTeams(), JSON_UNESCAPED_UNICODE); exit; } if ($method === 'GET' && $path === '/api/config') { echo json_encode($api->getPublicConfig(), JSON_UNESCAPED_UNICODE); exit; } if ($method === 'GET' && preg_match('#^/api/teams/(\d+)/sprints$#', $path, $matches)) { echo json_encode($api->getSprintsByTeamId((int) $matches[1]), JSON_UNESCAPED_UNICODE); exit; } if ($method === 'GET' && preg_match('#^/api/teams/(\d+)/tasks/filters$#', $path, $matches)) { $result = $api->getTeamTaskFilterOptions((int) $matches[1]); if ($result === null) { http_response_code(404); echo json_encode(['error' => 'Team not found'], JSON_UNESCAPED_UNICODE); exit; } echo json_encode($result, JSON_UNESCAPED_UNICODE); exit; } if ($method === 'GET' && preg_match('#^/api/teams/(\d+)/tasks$#', $path, $matches)) { $page = max(1, (int) ($_GET['page'] ?? 1)); $perPage = max(1, min(100, (int) ($_GET['per_page'] ?? 50))); $result = $api->getTasksByTeamId( (int) $matches[1], $page, $perPage, parseStringList($_GET['task_type'] ?? null), parseStringList($_GET['assignee'] ?? null), parseIntList($_GET['sprint_id'] ?? null) ); if ($result === null) { http_response_code(404); echo json_encode(['error' => 'Team not found'], JSON_UNESCAPED_UNICODE); exit; } echo json_encode($result, JSON_UNESCAPED_UNICODE); exit; } if ($method === 'GET' && preg_match('#^/api/sprints/(\d+)/tasks$#', $path, $matches)) { echo json_encode($api->getTasksBySprintId((int) $matches[1]), JSON_UNESCAPED_UNICODE); exit; } if ($method === 'GET' && preg_match('#^/api/sprints/(\d+)$#', $path, $matches)) { $sprint = $api->getSprintById((int) $matches[1]); if ($sprint === null) { http_response_code(404); echo json_encode(['error' => 'Sprint not found'], JSON_UNESCAPED_UNICODE); exit; } echo json_encode($sprint, JSON_UNESCAPED_UNICODE); exit; } http_response_code(404); echo json_encode(['error' => 'Not found'], JSON_UNESCAPED_UNICODE); } catch (Throwable $e) { http_response_code(500); echo json_encode(['error' => $e->getMessage()], JSON_UNESCAPED_UNICODE); }