62 lines
2.8 KiB
TypeScript
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;
|
|
}
|