public async Task SendGroupMessages() { var validParentDescriptors = _customParametersProvider.GetParameters().descriptors.validParentDescriptors; var validEmailTypeDescriptors = _customParametersProvider.GetParameters().descriptors.validEmailTypeDescriptors; var queues = await _communicationsRepository.GetGroupMessagesQueuesQueued(); foreach (var queue in queues) { var staffInfo = await _staffRepository.GetStaffIdentityByUniqueId(queue.StaffUniqueId); //Verify if the queue is retry again if (queue.SentStatus == GroupMessagesStatusEnum.Error.Value) { queue.RetryCount = queue.RetryCount + 1; } //This call to database is to broken the previews scheme in entity framework, //In case of a news petitions to the enpoint this validate the actual status of the queue. var queueVerification = await _communicationsRepository.GetGroupMessagesQueue(queue.Id); if (queueVerification.SentStatus == GroupMessagesStatusEnum.Processing.Value) { continue; } // We mark the queue item so that we dont process many at the same time. queue.SentStatus = GroupMessagesStatusEnum.Processing.Value; await _communicationsRepository.UpdateGroupMessagesQueue(queue); var parents = await GetParentsStudentsByQueueParams(validParentDescriptors, validEmailTypeDescriptors, queue.StaffUniqueId, queue.Type, queue.FilterParams); try { //We send the message for all the parents await SendMessagesToParents(parents, queue.Subject, queue.BodyMessage, $"{staffInfo.FirstName} {staffInfo.LastSurname}", queue.StaffUniqueId, queue.Id); } catch (Exception ex) { queue.SentStatus = GroupMessagesStatusEnum.Error.Value; await _communicationsRepository.UpdateGroupMessagesQueue(queue); throw ex; } //We assign the sent status to the queue when finish queue.SentStatus = GroupMessagesStatusEnum.Sent.Value; queue.DateSent = DateTime.Now; await _communicationsRepository.UpdateGroupMessagesQueue(queue); } }