/
KDP
/
ADOS
Обзор
Документация
Войти
/
KDP
/
ADOS
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
services/azureDevOpsService.ts
79 строк
3 KB
Krylov Dmitry
Рыба
01 янв 2026, 20:44
01 янв 2026, 20:44
f51b546
Код
Авторство
О чём код?
import { DevOpsSettings, WorkItem, WiqlResponse } from '../types'; export class AzureDevOpsService { private settings: DevOpsSettings; constructor(settings: DevOpsSettings) { this.settings = settings; } private get authHeader() { const fullUsername = this.settings.domain ? `${this.settings.domain}\\${this.settings.username}` : this.settings.username; const token = btoa(`${fullUsername}:${this.settings.password}`); return { Authorization: `Basic ${token}` }; } private getBaseUrl() { const { serverUrl, collection, project } = this.settings; const cleanUrl = serverUrl.endsWith('/') ? serverUrl.slice(0, -1) : serverUrl; return project ? `${cleanUrl}/${collection}/${project}` : `${cleanUrl}/${collection}`; } async getMyWorkItems(): Promise<WorkItem[]> { const baseUrl = this.getBaseUrl(); const wiqlUrl = `${baseUrl}/_apis/wit/wiql?api-version=6.0`; const query = { query: `SELECT [System.Id], [System.Title], [System.State] FROM WorkItems WHERE [System.AssignedTo] = @Me AND [System.State] <> 'Closed' AND [System.State] <> 'Removed' ORDER BY [System.ChangedDate] DESC` }; try { const response = await fetch(wiqlUrl, { method: 'POST', headers: { ...this.authHeader, 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(query), mode: 'cors' // Явно указываем режим }); if (!response.ok) { if (response.status === 401) throw new Error("401: Ошибка авторизации. Проверьте логин и пароль."); if (response.status === 403) throw new Error("403: Доступ запрещен (CORS или права доступа)."); throw new Error(`Ошибка сервера: ${response.status}`); } const data: WiqlResponse = await response.json(); if (!data.workItems || data.workItems.length === 0) return []; const ids = data.workItems.slice(0, 50).map(item => item.id).join(','); const detailsUrl = `${baseUrl}/_apis/wit/workitems?ids=${ids}&$expand=all&api-version=6.0`; const detailsResponse = await fetch(detailsUrl, { headers: this.authHeader }); if (!detailsResponse.ok) throw new Error(`Ошибка получения деталей: ${detailsResponse.status}`); const detailsData = await detailsResponse.json(); return detailsData.value; } catch (error: any) { if (error.name === 'TypeError' && error.message === 'Failed to fetch') { throw new Error("CORS_ERROR: Браузер заблокировал запрос. Вероятно, сервер не разрешает внешние подключения или используется невалидный SSL-сертификат."); } throw error; } } }