Перейти к содержанию

Вызов методов от имени другого сотрудника

Вызов методов от имени другого сотрудника

Большинство средств API, таких как ICardRepository (действия с карточками) и INotificationManager (отправка писем уведомлений) используют объект сессии текущего сотрудника ISession. Например, при отправке писем может использоваться плейсхолдер {userName} для вывода имени текущего сотрудника.

Если требуется сформировать такое письмо для имени другого сотрудника, то на сервере (и в плагинах Chronos) можно “подменить” сотрудника в объекте сессии, используя конструкцию using(SessionContext.Create(...)) { ... }, где любой запрос внутри фигурных скобок, использующий ISession, получит текущего сотрудника с идентификатором и именем, указанным в вызове метода. Такой сотрудник может физически отсутствовать в справочнике сотрудников.

// объект ISession можно получить или из контекста расширения context, или из конструктора, // если код выполняется в классе расширения, или из контейнера unityContainer, // если выполнение производится в Chronos

var session = unityContainer.Resolve<ISession>();

// имя и идентификатор пользователя, которые будут возвращаться объектом текущей сессии ISession // для всех вызовов внутри выражения using

Guid userID = new Guid("userID"); string userName = "User Name";

using (SessionContext.Create(session.CreateNestedSessionToken(userID, userName, seal: true)) { // отправляем уведомление или выполняем любой другой запрос от имени пользователя userID / userName await notificationManager.SendAsync( "Notification_Name", cardID, new[] { new Guid("roleID"), }, excludeDeputies: true); }

Если необходимо более гибко управлять свойствами такой сессии, например, указать параметр session.Token.HostName с именем компьютера пользователя, то используйте конструктор класса SessionToken. При этом необходимо указать корректный код сервера serverCode, чтобы ссылки tessa:// также корректно генерировались.

// объект ITessaServerSettings можно получить из конструктора, // если код выполняется в классе расширения, или из контейнера unityContainer, // если выполнение производится в Chronos

var serverSettings = unityContainer.Resolve<ITessaServerSettings>(); string serverCode = serverSettings?.ServerCode ?? string.Empty;

// имя и идентификатор пользователя, которые будут возвращаться объектом текущей сессии ISession // для всех вызовов внутри выражения using

Guid userID = new Guid("userID"); string userName = "User Name";

using (SessionContext.Create(new SessionToken(userID, userName, serverCode: serverCode, hostName: "ComputerName", seal: true)) { // отправляем уведомление или выполняем любой другой запрос от имени пользователя userID / userName await notificationManager.SendAsync("Notification_Name", cardID, new[] { new Guid("roleID"), }, excludeDeputies: true); }

Back to top