/// <param name="currentMessage"> /// Last known <see cref="AppealMessage"/> /// with included <see cref="AppealMessage.Appeal"/>. /// </param> /// <param name="requester">Sender, respondent or admin (without roles checking).</param> /// /// <exception cref="Bad"> /// <see cref="Bad.UselessRequest"/> if <see cref="AppealMessage.Appeal"/> /// of <paramref name="currentMessage"/> is resolved or respondent changed. /// </exception> public async Task <AppealMessage[]> GetWithLongPollingAsync(AppealMessage currentMessage, AppUser requester) { if (currentMessage.Appeal.DateResolved != null) { throw Bad.UselessRequest; } var nextMessages = await Db.AppealMessages .Where(m => m.Id > currentMessage.Id && m.AppealId == currentMessage.AppealId) .ToArrayAsync(); if (nextMessages.Length == 0) { var lp = new ChatLongPolling(currentMessage.Appeal, requester); var result = await lp.WaitAsync(); if (result.NextMessage == null) { if (result.Bad != null) { throw result.Bad; } } else { nextMessages = new[] { result.NextMessage }; } } return(nextMessages); }
/// <exception cref="Bad"> /// <see cref="Bad.AccessError"/> if sender if not client/respondent/admin. /// </exception> /// <exception cref="Bad"> /// <see cref="Bad.UselessRequest"/> if appeal is resolved. /// </exception> /// <exception cref="Bad"> /// <see cref="Bad.UnknownError"/>. /// </exception> public async Task <AppealMessage> HandleAsync(CreateAppealMessageData data) { _data = data.Validate(); await _data.Sender.LoadRoleSetAsync(_userManager); CheckAccess(); CheckAppeal(); _data.EnsureNoErrors(); var newMessage = new AppealMessage { Appeal = _data.Appeal, Sender = _data.Sender, Content = _data.Content, }; try { await Db.AddAsync(newMessage); await Db.SaveChangesAsync(); } catch (Exception ex) { Logger.LogError(ex, "Cannot create new AppealMessage!"); throw Bad.UnknownError; } OnCreated?.Invoke(newMessage); return(newMessage); }
/// <exception cref="Bad"> /// <see cref="Bad.DataError"/>. /// </exception> /// <exception cref="Bad"> /// <see cref="Bad.UnknownError"/>. /// </exception> public async Task <Appeal> CreateAsync(CreateAppealData data) { _data = await data.ValidateAsync(Db); _data.EnsureNoErrors(); CheckTopic(); _data.EnsureNoErrors(); var newAppeal = new Appeal { TopicId = data.TopicId, Client = data.Client }; var firstMessageData = new CreateAppealMessageData { Content = data.FirstMessage, Appeal = newAppeal, Sender = newAppeal.Client }.Validate(); firstMessageData.EnsureNoErrors(); var firstMessage = new AppealMessage { Appeal = firstMessageData.Appeal, Sender = firstMessageData.Sender, Content = firstMessageData.Content, }; await Db.AddAsync(newAppeal); await Db.AddAsync(firstMessage); try { await Db.SaveChangesAsync(); } catch (Exception ex) { Logger.LogError(ex, "Can't create new Appeal with first AppealMessage!"); throw Bad.UnknownError; } return(newAppeal); }