7f1e36874a
Владельцы внешней системы указали другую колонку строки заявки (cr498_cree9_tmctransferurl) вместо прежней cr498_portalrequesturl. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
59 lines
2.7 KiB
TypeScript
59 lines
2.7 KiB
TypeScript
import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';
|
|
import { WebPartContext } from '@microsoft/sp-webpart-base';
|
|
import {
|
|
DATAVERSE_API_VERSION,
|
|
DATAVERSE_DEMANDLINE_ENTITY_SET,
|
|
DATAVERSE_DEMANDLINE_LINK_FIELD,
|
|
DATAVERSE_RESOURCE_URL
|
|
} from '../config';
|
|
|
|
/**
|
|
* Обратная связь во внешнюю систему: записать ссылку на заявку портала в
|
|
* строку-источник таблицы Dataverse «Строка заявки» (cree9_demandline).
|
|
*
|
|
* positionId — GUID первичного ключа строки (приходит в URL как positionId, см.
|
|
* shared/routing). Адресуем строку напрямую: <entitySet>(<guid>). PATCH пишет
|
|
* URL в колонку DATAVERSE_DEMANDLINE_LINK_FIELD (см. shared/config).
|
|
*
|
|
* Заголовок If-Match: * ОБЯЗАТЕЛЕН: без него PATCH в Dataverse — это upsert (нет
|
|
* строки с таким id → СОЗДАЁТ новую). Нам нужно строго обновление существующей
|
|
* строки-источника; If-Match: * это гарантирует — если строки нет, вернётся 404,
|
|
* а не появится «пустая» запись.
|
|
*
|
|
* Авторизация — AadHttpClient с ресурсом среды Dataverse (SSO текущего
|
|
* пользователя); заголовки OData — как в stroy-bot-report/DataverseService.
|
|
*/
|
|
export async function writeDemandLinePortalLink(
|
|
context: WebPartContext,
|
|
positionId: string,
|
|
portalRequestUrl: string
|
|
): Promise<void> {
|
|
const client = await context.aadHttpClientFactory.getClient(DATAVERSE_RESOURCE_URL);
|
|
const url =
|
|
`${DATAVERSE_RESOURCE_URL}/api/data/${DATAVERSE_API_VERSION}/` +
|
|
`${DATAVERSE_DEMANDLINE_ENTITY_SET}(${positionId})`;
|
|
|
|
const response: HttpClientResponse = await client.fetch(url, AadHttpClient.configurations.v1, {
|
|
method: 'PATCH',
|
|
headers: {
|
|
'Accept': 'application/json',
|
|
'Content-Type': 'application/json;odata.metadata=minimal',
|
|
'OData-MaxVersion': '4.0',
|
|
'OData-Version': '4.0',
|
|
// Только обновление существующей строки, без upsert-создания.
|
|
'If-Match': '*'
|
|
},
|
|
body: JSON.stringify({ [DATAVERSE_DEMANDLINE_LINK_FIELD]: portalRequestUrl })
|
|
});
|
|
|
|
if (!response.ok) {
|
|
let errBody = '';
|
|
try {
|
|
errBody = await response.text();
|
|
} catch {
|
|
// тело ошибки прочитать не удалось — оставляем пустым
|
|
}
|
|
throw new Error(`Dataverse PATCH ${DATAVERSE_DEMANDLINE_ENTITY_SET}: ${response.status} — ${errBody}`);
|
|
}
|
|
}
|