fix: свежие «свои» заявки при отладочной подмене личности
Tests / frontend-test (push) Successful in 5m42s

Search искал заявки подменённого сотрудника, а REST-довесок свежих
черновиков — заявки реальной учётки, поэтому только что созданные
черновики под подменой не находились нигде. Довесок теперь берёт Id
подменённого сотрудника.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-09 12:18:15 +05:00
parent 8e3161f425
commit cdabc3f40b
@@ -22,7 +22,7 @@ import {
REQUEST_STATUS,
siteOrigin,
} from '../../shared/approval';
import { effectiveUserEmail } from '../../shared/impersonation';
import { effectiveUserEmail, getImpersonatedEmail } from '../../shared/impersonation';
import { DATA_SITE_URL } from '../../shared/config';
import { IAssignee, IExecutedStep, IMyRequest } from './models/IMyRequest';
import { parseAuthorOwsUser } from './parseAuthorOwsUser';
@@ -115,6 +115,17 @@ export function currentUserEmail(context: WebPartContext): string {
return effectiveUserEmail(context).toLowerCase();
}
// Id автора «своих» заявок на сайте — для REST-довесков (фильтр AuthorId). По той
// же причине, что currentUserEmail: при отладочной подмене это подменённый
// сотрудник — иначе Search искал бы его заявки, а довесок — заявки реальной
// учётки, и его свежие черновики не находились бы нигде (индекс их ещё не видит).
// Без подмены — реальный пользователь через currentuser (без лишнего ensureUser).
async function ownAuthorIdFor(context: WebPartContext, siteUrl: string): Promise<number> {
const impersonatedEmail = getImpersonatedEmail();
if (!impersonatedEmail) return currentUserIdFor(context, siteUrl);
return ensureUserIdFor(context, siteUrl, `i:0#.f|membership|${impersonatedEmail.toLowerCase()}`);
}
function normalizeSiteUrl(url: string): string {
return url.replace(/\/+$/, '').toLowerCase();
}
@@ -1195,7 +1206,7 @@ async function getOwnRowsForType(context: WebPartContext, type: IRequestType): P
// Кешированный Id (см. shared/approval/siteUser.ts): эта функция зовётся в
// цикле по типам заявок, и без кеша тот же GET /_api/web/currentuser уходил
// бы столько раз, сколько у портала типов.
const myId = await currentUserIdFor(context, target.siteUrl);
const myId = await ownAuthorIdFor(context, target.siteUrl);
const rows = (await sp.web
.getList(target.listId)
@@ -1247,7 +1258,7 @@ async function getRecentlyChangedOwnRowsForType(context: WebPartContext, type: I
try {
const sp = spForSite(target.siteUrl, context);
const myId = await currentUserIdFor(context, target.siteUrl);
const myId = await ownAuthorIdFor(context, target.siteUrl);
const cutoffIso = new Date(Date.now() - RECENT_MS).toISOString();
const rows = (await sp.web