feat: added notifications workflow
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
import { AadHttpClient } from '@microsoft/sp-http';
|
||||
import { WebPartContext } from '@microsoft/sp-webpart-base';
|
||||
import { FLOW_RESOURCE, FLOW_NOTIFY_URL } from '../config';
|
||||
import { ApprovalListService } from './approvalList.service';
|
||||
import { REQUEST_STATUS } from './models/statuses';
|
||||
|
||||
// Данные формы для тела запроса к потоку (постоянны для формы).
|
||||
export interface INotifyTarget {
|
||||
requestTypeId: number; // RequestTypeId (id типа заявки во внешнем API маршрутов)
|
||||
dataListName: string; // ListName (список данных заявки)
|
||||
approvalListName: string; // ApproveListName (список согласования)
|
||||
}
|
||||
|
||||
// POST в поток оповещения (Entra-триггер) через AadHttpClient — обычный fetch → 401,
|
||||
// AadHttpClient даёт токен Flow Service (и снимает вопрос CORS).
|
||||
async function postNotify(context: WebPartContext, body: Record<string, unknown>): Promise<void> {
|
||||
if (!FLOW_NOTIFY_URL) {
|
||||
return;
|
||||
}
|
||||
const client = await context.aadHttpClientFactory.getClient(FLOW_RESOURCE);
|
||||
const res = await client.post(FLOW_NOTIFY_URL, AadHttpClient.configurations.v1, {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(body),
|
||||
});
|
||||
if (!res.ok) {
|
||||
throw new Error(`Поток оповещения: ${res.status} ${res.statusText}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Находит АКТИВНЫЙ шаг маршрута (На согласовании / На исполнении) и уведомляет его.
|
||||
// Вызывать после отправки заявки и после каждого положительного решения. Поток по
|
||||
// переданным полям сам находит согласующего/исполнителя и шлёт уведомление.
|
||||
// Уведомление некритично — ошибки глотаем, чтобы не ронять основной сценарий.
|
||||
export async function notifyActiveStep(
|
||||
context: WebPartContext,
|
||||
approval: ApprovalListService,
|
||||
requestId: number,
|
||||
target: INotifyTarget
|
||||
): Promise<void> {
|
||||
try {
|
||||
const rows = await approval.getForRequest(requestId);
|
||||
const active = rows.filter(
|
||||
(r) => r.status === REQUEST_STATUS.onApproval || r.status === REQUEST_STATUS.onExecution
|
||||
)[0];
|
||||
if (!active) {
|
||||
return;
|
||||
}
|
||||
await postNotify(context, {
|
||||
RequestTypeId: target.requestTypeId,
|
||||
RowID: active.id,
|
||||
RequestID: requestId,
|
||||
ListName: target.dataListName,
|
||||
ApproveListName: target.approvalListName,
|
||||
});
|
||||
} catch {
|
||||
// не критично — просто не отправили уведомление
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user