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). Адресуем строку напрямую: (). 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 { 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}`); } }