Files
request-portal/src/webparts/requestPortal/shared/approval/approvalRoute.service.ts
T
2026-08-04 12:36:40 +05:00

62 lines
2.8 KiB
TypeScript

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<AadHttpClient> {
return context.aadHttpClientFactory.getClient(APPROVAL_API_CLIENT_ID);
}
// GET /api/request-types — список типов заявок (id + имя). Пригодится, чтобы
// сопоставить форму с RequestTypeId, если он неизвестен заранее.
export async function getRequestTypes(context: WebPartContext): Promise<IRequestType[]> {
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<IRequestType[]> = 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'
): Promise<IResolvedRoute> {
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: []
})
});
if (!response.ok) {
throw new Error(`resolve: ${response.status} ${response.statusText}`);
}
const body: IApiResponse<IResolvedRoute> = await response.json();
return body.data;
}