fix: свежие «свои» заявки при отладочной подмене личности
Tests / frontend-test (push) Successful in 5m42s
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:
@@ -22,7 +22,7 @@ import {
|
|||||||
REQUEST_STATUS,
|
REQUEST_STATUS,
|
||||||
siteOrigin,
|
siteOrigin,
|
||||||
} from '../../shared/approval';
|
} from '../../shared/approval';
|
||||||
import { effectiveUserEmail } from '../../shared/impersonation';
|
import { effectiveUserEmail, getImpersonatedEmail } from '../../shared/impersonation';
|
||||||
import { DATA_SITE_URL } from '../../shared/config';
|
import { DATA_SITE_URL } from '../../shared/config';
|
||||||
import { IAssignee, IExecutedStep, IMyRequest } from './models/IMyRequest';
|
import { IAssignee, IExecutedStep, IMyRequest } from './models/IMyRequest';
|
||||||
import { parseAuthorOwsUser } from './parseAuthorOwsUser';
|
import { parseAuthorOwsUser } from './parseAuthorOwsUser';
|
||||||
@@ -115,6 +115,17 @@ export function currentUserEmail(context: WebPartContext): string {
|
|||||||
return effectiveUserEmail(context).toLowerCase();
|
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 {
|
function normalizeSiteUrl(url: string): string {
|
||||||
return url.replace(/\/+$/, '').toLowerCase();
|
return url.replace(/\/+$/, '').toLowerCase();
|
||||||
}
|
}
|
||||||
@@ -1195,7 +1206,7 @@ async function getOwnRowsForType(context: WebPartContext, type: IRequestType): P
|
|||||||
// Кешированный Id (см. shared/approval/siteUser.ts): эта функция зовётся в
|
// Кешированный Id (см. shared/approval/siteUser.ts): эта функция зовётся в
|
||||||
// цикле по типам заявок, и без кеша тот же GET /_api/web/currentuser уходил
|
// цикле по типам заявок, и без кеша тот же GET /_api/web/currentuser уходил
|
||||||
// бы столько раз, сколько у портала типов.
|
// бы столько раз, сколько у портала типов.
|
||||||
const myId = await currentUserIdFor(context, target.siteUrl);
|
const myId = await ownAuthorIdFor(context, target.siteUrl);
|
||||||
|
|
||||||
const rows = (await sp.web
|
const rows = (await sp.web
|
||||||
.getList(target.listId)
|
.getList(target.listId)
|
||||||
@@ -1247,7 +1258,7 @@ async function getRecentlyChangedOwnRowsForType(context: WebPartContext, type: I
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const sp = spForSite(target.siteUrl, context);
|
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 cutoffIso = new Date(Date.now() - RECENT_MS).toISOString();
|
||||||
|
|
||||||
const rows = (await sp.web
|
const rows = (await sp.web
|
||||||
|
|||||||
Reference in New Issue
Block a user