/// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }