fix: в «Моих заявках» исключены типы заявок с чужих сайтов (ct-forms-portal /sites/sed)
Tests / frontend-test (push) Successful in 1m15s

This commit is contained in:
Тимур Городецкий
2026-09-28 09:53:29 +05:00
parent cef8d51378
commit 36922af942
@@ -23,6 +23,7 @@ import {
siteOrigin, siteOrigin,
} from '../../shared/approval'; } from '../../shared/approval';
import { effectiveUserEmail } from '../../shared/impersonation'; import { effectiveUserEmail } from '../../shared/impersonation';
import { DATA_SITE_URL } from '../../shared/config';
import { IMyRequest } from './models/IMyRequest'; import { IMyRequest } from './models/IMyRequest';
import { IMyRequestsTypeDebug } from './models/IMyRequestsDebug'; import { IMyRequestsTypeDebug } from './models/IMyRequestsDebug';
import { traceLinkedTypes, traceResultRows, traceSearchHits } from './searchTrace'; import { traceLinkedTypes, traceResultRows, traceSearchHits } from './searchTrace';
@@ -127,14 +128,27 @@ export function currentUserEmail(context: WebPartContext): string {
return effectiveUserEmail(context).toLowerCase(); return effectiveUserEmail(context).toLowerCase();
} }
function normalizeSiteUrl(url: string): string {
return url.replace(/\/+$/, '').toLowerCase();
}
// Типы заявок, у которых approval-route API уже отдал listId/siteUrl (готовы к чтению). // Типы заявок, у которых approval-route API уже отдал listId/siteUrl (готовы к чтению).
//
// Только типы НАШЕГО сайта данных: approval-route общий с ct-forms-portal
// (/sites/sed), и /api/request-types отдаёт его типы тоже. Search ищет по
// всему тенанту, поэтому без этого фильтра Path-условие по спискам sed
// притягивало в «Мои заявки» и очереди заявки CT (СТ ОМТС и т.п.), которые
// этот портал не умеет ни показать (нет RequestStatus), ни открыть (нет View).
export async function getLinkedTypes(context: WebPartContext): Promise<IRequestType[]> { export async function getLinkedTypes(context: WebPartContext): Promise<IRequestType[]> {
// Кешированный вариант: getLinkedTypes зовут и счётчики меню, и каждая // Кешированный вариант: getLinkedTypes зовут и счётчики меню, и каждая
// таблица, и «Поиск» — на одно открытие портала это было 4-5 одинаковых // таблица, и «Поиск» — на одно открытие портала это было 4-5 одинаковых
// AAD-запросов к /api/request-types. Ответ меняется только когда админ // AAD-запросов к /api/request-types. Ответ меняется только когда админ
// заводит тип заявки, то есть заведомо не в пределах загрузки страницы. // заводит тип заявки, то есть заведомо не в пределах загрузки страницы.
const types = await getRequestTypesCached(context); const types = await getRequestTypesCached(context);
const linked = types.filter((t) => !!t.listId && !!t.siteUrl); const ownSiteUrl = normalizeSiteUrl(DATA_SITE_URL);
const linked = types.filter(
(t) => !!t.listId && !!t.siteUrl && normalizeSiteUrl(t.siteUrl) === ownSiteUrl
);
traceLinkedTypes(types, linked); traceLinkedTypes(types, linked);
return linked; return linked;
} }