import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http'; import { WebPartContext } from '@microsoft/sp-webpart-base'; import { APPROVAL_API_CLIENT_ID, APPROVAL_API_BASE_URL } from '../config'; import { ApprovalStatus, IApiResponse, IRequestType, IResolvedRoute } from './models/IApprovalRouteApi'; // Все обращения к внешнему approval-route API — только здесь. // Клиент авторизуется через AadHttpClient (SSO по текущему пользователю). async function client(context: WebPartContext): Promise { return context.aadHttpClientFactory.getClient(APPROVAL_API_CLIENT_ID); } // GET /api/request-types — список типов заявок (id + имя). Пригодится, чтобы // сопоставить форму с RequestTypeId, если он неизвестен заранее. export async function getRequestTypes(context: WebPartContext): Promise { const c = await client(context); const response: HttpClientResponse = await c.get( `${APPROVAL_API_BASE_URL}/api/request-types`, AadHttpClient.configurations.v1 ); if (!response.ok) { throw new Error(`request-types: ${response.status} ${response.statusText}`); } const body: IApiResponse = await response.json(); return body.data ?? []; } // POST /api/template-routes/resolve — планируемый маршрут для типа заявки и // пользователя. Бэкенд сам подставляет исполнителей шага (executorEmail/position) // по ролям исходя из userEmail. Параметр status выбирает ФАЗУ маршрута: // 'Approval' — согласующие (кто одобряет), // 'Execution' — исполнители (кто выполняет после согласования). // Один и тот же маршрут, разные наборы шагов. export async function resolveRoute( context: WebPartContext, requestTypeId: number, userEmail: string, status: ApprovalStatus = 'Approval', departmentId: string | null = null ): Promise { const c = await client(context); const url = `${APPROVAL_API_BASE_URL}/api/template-routes/resolve`; // Эндпоинт сменился с GET (query) на POST (JSON-тело). const response: HttpClientResponse = await c.post(url, AadHttpClient.configurations.v1, { headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ requestTypeId, userEmail, projectId: null, status, fieldValues: [], departmentId: departmentId || null }) }); if (!response.ok) { throw new Error(`resolve: ${response.status} ${response.statusText}`); } const body: IApiResponse = await response.json(); return body.data; }