Система уведомлений
Система уведомлений¶
Добавление простых уведомлений по заданиям.¶
Система предоставляет методы для упрощения отправки уведомлений по отправляемым заданиям. Для того, чтобы отправить уведомление о созданном задании - нужно воспользоваться классом Tessa.Extensions.Shared\Notices\NotificationHelper. Этот класс реализует перегруженный AddNotification, с помощью которого отправляются уведомления.
Уведомления отправляются только в том случае, если сохранение карточки прошло успешно. Для этого метод добавляет информацию о необходимости отправки уведомлений в специальный раздел секции Info Request’а на сохранение карточки. Если сохранение карточки прошло успешно, специальное расширение AfterRequest срабатывает после сохранения, получает информацию из секции Info и формирует и передает сообщения в сервис отправки почты. За это отвечает расширение Tessa.Extensions.Server\Notices\NotificationTaskExtension.
Все это позволяет создавать типовые уведомления одной строкой кода, реализуя самый распространенный сценарий отправки уведомлений.
Метод имеет четыре перегрузки:
public static void AddNotification(CardInfoStorageObject request, IList<TaskNotification> notifications)
public static void AddNotification(CardInfoStorageObject request, TaskNotification notification)
public static void AddNotification(CardInfoStorageObject request, List<CustomNotification> notifications)
public static void AddNotification(CardInfoStorageObject request, CustomNotification notification)
Первая и вторая перегрузка позволяет автоматически создать уведомления для заданий, идентификаторы и тексты сообщений которых переданы внутри обёртки TaskNotification.
Причём, если оставить параметр Body пустым, то уведомления будут сформированы по стандартному шаблону и будут иметь вид:
Д-00007, тема
Исполнитель: Администратор
Автор: Администратор
Выдано: 09.07.2014 14:35
Срок: 10.07.2014 14:35
Тип: Задача
Тестовое содержание задания
С переносом строк
Если передать параметр Body, то в качестве тела письма будет использовано содержимое этого параметра.
Пример использования в Tessa.Extensions.Server\Workflow\TaskManager:
public void NewExecuteTaskTask(CardStoreRequest request, CardSection infoSection)
{
CardType cardType;
if (!this.cardMetadata.CardTypes.TryGetValue("execute_task", out cardType))
{
return;
}
var taskResponse = this.cardRepository.New(new CardNewRequest { CardTypeID = cardType.ID });
taskResponse.Card.ID = Guid.NewGuid();
var cardTask = request.Card.Tasks.Add();
cardTask.SetCard(taskResponse.Card);
cardTask.SectionRows = taskResponse.SectionRows;
cardTask.RoleID = infoSection.Fields.Get<Guid>("RoleID");
cardTask.RoleName = infoSection.Fields.Get<string>("RoleName");
cardTask.Planned = infoSection.Fields.Get<DateTime>("CompleteTo");
cardTask.State = CardRowState.Inserted;
// Записываем данные в TaskCommonInfo
var commonInfo = cardTask.Card.Sections.GetOrAdd("TaskCommonInfo");
commonInfo.Fields["Info"] = infoSection.Fields.Get<string>("TaskComment");
this.MergeStorage(cardTask, infoSection, "Test_Task_short_info");
// Добавляем уведомление
NotificationHelper.AddNotification(request, cardTask.Card.ID);
}
Третья и четвёртая перегрузки позволяют отправить полностью уникальное уведомление, которое не зависит от содержания задания.
Этот метод принимает на вход адрес получателя, тему и тело сообщения внутри обёртки CustomNotification, что позволяет отправить любое уведомление любому пользователю.
Методы добавления можно использовать одновременно оба и сколь угодно много раз. Забота об отсутствии повторяющихся уведомлений целиком и полностью лежит на плечах разработчика расширений.
MailService. Как отправлять письма напрямую.¶
Для отправки писем независимо от цепочки сохранения, можно использовать API MailService. Для этого вы резолвите из Unity IMailService (см. ниже пример) и дергаете его метод PostMessage.
this.mailService.PostMessage(email, subject, body, validationResult);
Сам по себе IMailService не занимается отправкой сообщений. Он добавляет подготовленные к отправке данные в таблицу Outbox, откуда их в свою очередь забирает специальный плагин системного сервиса Chronos: NoticeMailerPlugin, который и отправляет письмо.
MailService может работать в двух режимах Default и WithoutTransaction. Режим работы определяется при регистрации расширений использующих IMailService.
extensionContainer.RegisterExtension<ICardStoreExtension, NotificationTaskExtension>
(x => x
.WithOrder(ExtensionStage.AfterPlatform)
.WithUnity(unityContainer.RegisterType<NotificationTaskExtension>(
new PerResolveLifetimeManager(),
new InjectionConstructor(
new ResolvedParameter<IMailService>(MailServiceNames.Default),
typeof(IDbScope),
typeof(ISession)))));
В режиме “WithoutTransaction” MailService вклинивается в уже существующую транзакцию и работает в её рамках. Это может быть удобно для простой отмены отправки писем. При откате основной транзакции откатятся и все письма, записанные в Outbox в ее рамках.
В режиме “Default” MailService создаёт свою собственную транзакцию. Этот режим позволяет работать независимо от всего остального.