Exemple #1
0
        //public override Task<List<AdoProject>> GetList()
        //{
        //    //return _repository.GetListFilter(a => a.IsDeleted != true);
        //    return _context.AdoProjects.Where(a => a.IsDeleted != true).OrderByDescending(a => a.CreatedAt).ToListAsync();
        //}

        public async Task <AdoProject> CreateAdoProject(AdoProject entity)
        {
            try
            {
                Add(entity, _userId);
                entity.Status = Status.Submitted;
                if (!await SaveChangesAsync())
                {
                    return(null);
                }
                await _adoProjectHistoryRepository.Create(entity.Id, IAdoProjectHistoryRepository.Operation_Request_Created, _userId);

                return(entity);
            }
            catch
            {
                throw;
            }
        }
        public async Task <List <AdoProject> > Handle(CreateApprovedAdoProjectIdsCommand request, CancellationToken cancellationToken)
        {
            try
            {
                _adoProjectRepository.DatabaseContext.ChangeTracker.Clear();
                _adoProjectHistoryRepository.DatabaseContext.ChangeTracker.Clear();

                List <AdoProject> created  = new();
                StringBuilder     warnings = new();
                if (request.Approved.IsNullOrEmptyCollection())
                {
                    return(null);
                }
                AdoProject origEntity = null;
                foreach (var id in request.Approved)
                {
                    try
                    {
                        origEntity = null;
                        origEntity = await _adoProjectRepository.GetId(id);

                        //1. create Proj
                        var mapped       = _mapper.Map <AdoModels.ProjectAdo>(origEntity);
                        var createdModel = await _projectAdoServices.CreateProject(mapped);

                        //2. Update Db
                        var createdEntity = _mapper.Map <AdoProject>(createdModel);
                        createdEntity.Status = origEntity.Status;

                        if (createdModel.State == Microsoft.TeamFoundation.Core.WebApi.ProjectState.New ||
                            createdModel.State == Microsoft.TeamFoundation.Core.WebApi.ProjectState.WellFormed)
                        {
                            createdEntity.Status = Status.Completed;
                            created.Add(createdEntity);
                        }

                        _adoProjectRepository.Update(createdEntity, request.UserId);
                        if (await _adoProjectRepository.SaveChangesAsync() && createdEntity.Status == Status.Completed)
                        {
                            //3. create record in history DB
                            await _adoProjectHistoryRepository.Create(origEntity.Id, IAdoProjectHistoryRepository.Operation_Request_Completed, request.UserId);
                        }
                    }
                    catch (Exception ex)
                    {
                        warnings.Append($"Error approving Id: {origEntity?.Id}, {nameof(origEntity.Name)}: {origEntity?.Name}, {ex.Message}");
                    }
                }
                if (warnings.Length > 0)
                {
                    _logger.LogWarning($"{nameof(CreateApprovedAdoProjectIdsCommandHandler)} warnings to report: {warnings}");
                }

                return(created);
            }
            catch (Exception ex)
            {
                //this shouldn't stop the API from doing else so this can be logged
                _logger.LogError($"{nameof(CreateApprovedAdoProjectIdsCommandHandler)} failed due to: {ex.Message}");
            }
            return(null);
        }
        public async Task ApproveAdoProjects()
        {
            try
            {
                var allApprovers = await _adoProjectApproverService.GetAdoProjectApprovers();

                //if (allApprovers?.Any() == false)
                if (allApprovers.IsNullOrEmptyCollection())
                {
                    return;
                }

                var toApprove = await _adoProjectHistoryRepository.GetPendingProjectsApproval();

                if (toApprove.IsNullOrEmptyCollection())
                {
                    _logger.LogDebug("No new project and email must be sent for approval");
                    return;
                }

                string text      = $"There are {toApprove.Count} projects waiting for your approval.";
                long   totalSent = 0;
                Parallel.ForEach <AdoProjectApprover, long>(
                    allApprovers,                      // source collection
                    () => 0,                           // method to initialize the local variable
                    (approver, loopState, subtotal) => // method invoked by the loopState on each iteration
                {
                    if (string.IsNullOrWhiteSpace(approver.Email))
                    {
                        return(subtotal);
                    }

                    try
                    {
                        //_emailService.SendEmail(_sender, approver.Email, $"test subject service at {DateTime.Now}", $"tested at {DateTime.Now}", false).Wait();
                        Task.Delay(5 * 1000).Wait();     //simulate sent email
                        subtotal++;
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(nameof(ApproveAdoProjects), ex);
                    }
                    return(subtotal);
                },
                    // Method to be executed when each partition has completed.
                    // finalResult is the final value of subtotal for a particular partition.
                    (finalResult) => Interlocked.Add(ref totalSent, finalResult));

                //at least one email sent
                if (totalSent > 0)
                {
                    Parallel.ForEach(toApprove, async(project) =>
                    {
                        try
                        {
                            await _adoProjectHistoryRepository.Create(project.Id, IAdoProjectHistoryRepository.Operation_SentEmailForApproval, nameof(GenerateEmailForApprovalService));
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError(nameof(ApproveAdoProjects), ex);
                        }
                    });
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(nameof(ApproveAdoProjects), ex);
            }
        }