Пример #1
0
        public async Task <IActionResult> AddPracticeOrder([FromForm] AddPracticeOrderInput request)
        {
            var currentUser = await _currentUserProvider.GetCurrentUser();

            if (currentUser is null)
            {
                return(Json(ActionOutput.Error("Пользователь не найден")));
            }
            request.UserId = currentUser.Id;
            return(await _dispatcher.DispatchAsync(request));
        }
        protected override ICollection <ApplicationUser> GetOnlyResponsableUsers(WorkEvent workEvent,
                                                                                 ICollection <ApplicationUser> users)
        {
            var currentUser      = _currentUserProvider.GetCurrentUser();
            var responsibleUsers = users.Where(x => x.Id != currentUser.Id);

            if (_previousEvents.Count == 5)
            {
                _previousEvents.Clear();
            }
            if (IsSpecialEvent(workEvent))
            {
                _previousEvents.Add(workEvent);
            }
            if (workEvent.Type == EventType.WorkItemChanged)
            {
                var events = _previousEvents.Where(IsSpecialEvent).ToArray();
                if (events.Any())
                {
                    responsibleUsers = responsibleUsers.Where(x => events.All(ev => ev.Data != x.Id));
                    _previousEvents.Clear();
                }
            }
            return(responsibleUsers.ToArray());
        }
        public ConfiguredFeaturesCollection GetFeatureFlags()
        {
            var features = _innerFeatureFlagProvider.GetFeatureFlags();

            var currentUser = _currentUserProvider.GetCurrentUser();

            // All admins get VenuesDataManagement
            if (currentUser.IsAdmin)
            {
                features = features.With(FeatureFlags.VenuesDataManagement);
            }

            // If the user is bound to a provider on the beta testers list, they get VenuesDataManagement
            if (currentUser.CurrentProviderUkprn.HasValue &&
                _betaTestingProviderUkprns.Contains(currentUser.CurrentProviderUkprn.Value))
            {
                features = features.With(FeatureFlags.VenuesDataManagement);
            }

            // If any of '{Courses|Venues}DataManagement' features are defined
            // then also define the root 'DataManagement' feature
            if (features.HaveFeature(FeatureFlags.CoursesDataManagement) ||
                features.HaveFeature(FeatureFlags.VenuesDataManagement))
            {
                features = features.With(FeatureFlags.DataManagement);
            }

            return(features);
        }
Пример #4
0
        public async Task <IActionResult> Index(EditApprenticeshipViewModel model)
        {
            if (model.ApprenticeshipId.HasValue)
            {
                var result = await _sqlQueryDispatcher.ExecuteQuery(new GetApprenticeship { ApprenticeshipId = model.ApprenticeshipId.Value });

                await _sqlQueryDispatcher.ExecuteQuery(new UpdateApprenticeship()
                {
                    ApprenticeshipId        = result.ApprenticeshipId,
                    ApprenticeshipLocations = result.ApprenticeshipLocations.Select(CreateApprenticeshipLocation.FromModel),
                    ApprenticeshipWebsite   = model.ContactUsURL,
                    ContactEmail            = model.Email,
                    ContactTelephone        = model.Telephone,
                    ContactWebsite          = model.WebSite,
                    MarketingInformation    = model.Information,
                    Standard  = result.Standard,
                    UpdatedBy = _currentUserProvider.GetCurrentUser(),
                    UpdatedOn = _clock.UtcNow
                });

                return(RedirectToAction("Index", "PublishApprenticeships"));
            }

            return(View("Error", new ErrorViewModel {
                RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier
            }));
        }
Пример #5
0
        public async Task <IOutput> Handle(ChangeRoleInput request, CancellationToken cancellationToken)
        {
            var currentUesrId = (await _currentUserProvider.GetCurrentUser()).Id;
            var user          = await _userManager.FindByIdAsync(request.UserId.ToString());

            if (user is null)
            {
                return(ActionOutput.Error("Пользователя не существует."));
            }

            if (user.Id == currentUesrId)
            {
                return(ActionOutput.Error("Нельзя менять себе роль"));
            }

            var newRole = request.NewRole;

            var userRoles = await _userManager.GetRolesAsync(user);

            var addResult = await _userManager.AddToRoleAsync(user, Enum.GetName(newRole));

            var removeResult = await _userManager.RemoveFromRolesAsync(user, userRoles);

            return(ActionOutput.Success);
        }
Пример #6
0
        public async Task <IOutput> Handle(AddCommentInput request, CancellationToken cancellationToken)
        {
            var currentUser = await _currentUserProvider.GetCurrentUser();

            if (currentUser is null)
            {
                return(ActionOutput.Error("Пользователь не найден"));
            }

            var lesson = await _context.Lessons.FirstOrDefaultAsync(
                x => x.Id == request.LessonId,
                cancellationToken : cancellationToken);

            if (lesson is null)
            {
                return(ActionOutput.Error("Урок не найден"));
            }

            var comment = new Entity.Comment(request.Text, currentUser, lesson);

            await _context.Comments.AddAsync(comment, cancellationToken);

            await _context.SaveChangesAsync(cancellationToken);

            return(ActionOutput.SuccessData(comment.Id));
        }
        public async Task <Success> Handle(Command request, CancellationToken cancellationToken)
        {
            ThrowIfFlowStateNotValid();

            var journeyInstance = _journeyInstanceProvider.GetInstance <AddVenueJourneyModel>();

            var venueId       = Guid.NewGuid();
            var providerUkprn = _providerContextProvider.GetProviderContext().ProviderInfo.Ukprn;

            await _cosmosDbQueryDispatcher.ExecuteQuery(new CreateVenue()
            {
                VenueId       = venueId,
                ProviderUkprn = providerUkprn,
                Name          = journeyInstance.State.Name,
                Email         = journeyInstance.State.Email,
                Telephone     = journeyInstance.State.Telephone,
                Website       = journeyInstance.State.Website,
                AddressLine1  = journeyInstance.State.AddressLine1,
                AddressLine2  = journeyInstance.State.AddressLine2,
                Town          = journeyInstance.State.Town,
                County        = journeyInstance.State.County,
                Postcode      = journeyInstance.State.Postcode,
                Latitude      = journeyInstance.State.Latitude,
                Longitude     = journeyInstance.State.Longitude,
                CreatedBy     = _currentUserProvider.GetCurrentUser(),
                CreatedDate   = _clock.UtcNow
            });

            journeyInstance.UpdateState(state => state.VenueId = venueId);

            // Complete JourneyInstance so state can no longer be changed
            journeyInstance.Complete();

            return(new Success());
        }
Пример #8
0
        public async Task <Success> Handle(Command request, CancellationToken cancellationToken)
        {
            var result = await _cosmosDbQueryDispatcher.ExecuteQuery(new UpdateVenue()
            {
                VenueId      = request.VenueId,
                Name         = _journeyInstance.State.Name,
                Email        = _journeyInstance.State.Email,
                PhoneNumber  = _journeyInstance.State.PhoneNumber,
                Website      = _journeyInstance.State.Website,
                AddressLine1 = _journeyInstance.State.AddressLine1,
                AddressLine2 = _journeyInstance.State.AddressLine2,
                Town         = _journeyInstance.State.Town,
                County       = _journeyInstance.State.County,
                Postcode     = _journeyInstance.State.Postcode,
                Latitude     = _journeyInstance.State.Latitude,
                Longitude    = _journeyInstance.State.Longitude,
                UpdatedDate  = _clock.UtcNow,
                UpdatedBy    = _currentUserProvider.GetCurrentUser()
            });

            var venue = (Venue)result.Value;

            await _sqlDataSync.SyncVenue(venue);

            return(new Success());
        }
Пример #9
0
        private void CheckUserPermissions()
        {
            var currentUser = _currentUserProvider.GetCurrentUser();

            if (currentUser.Role == RoleNames.ProviderUser)
            {
                throw new NotAuthorizedException();
            }
        }
        public async Task <OneOf <ModelWithErrors <ViewModel>, Success> > Handle(
            Command request,
            CancellationToken cancellationToken)
        {
            ThrowIfFlowStateNotValid();

            var tLevelId    = Guid.NewGuid();
            var currentUser = _currentUserProvider.GetCurrentUser();
            var now         = _clock.UtcNow;

            var result = await _sqlQueryDispatcher.ExecuteQuery(
                new CreateTLevel()
            {
                CreatedBy          = currentUser,
                CreatedOn          = now,
                EntryRequirements  = _journeyInstance.State.EntryRequirements,
                HowYoullBeAssessed = _journeyInstance.State.HowYoullBeAssessed,
                HowYoullLearn      = _journeyInstance.State.HowYoullLearn,
                LocationVenueIds   = _journeyInstance.State.LocationVenueIds,
                ProviderId         = request.ProviderId,
                StartDate          = _journeyInstance.State.StartDate.Value,
                TLevelDefinitionId = _journeyInstance.State.TLevelDefinitionId.Value,
                TLevelId           = tLevelId,
                Website            = _journeyInstance.State.Website,
                WhatYouCanDoNext   = _journeyInstance.State.WhatYouCanDoNext,
                WhatYoullLearn     = _journeyInstance.State.WhatYoullLearn,
                WhoFor             = _journeyInstance.State.WhoFor,
                YourReference      = _journeyInstance.State.YourReference
            });

            if (result.Value is CreateTLevelFailedReason reason)
            {
                if (reason == CreateTLevelFailedReason.TLevelAlreadyExistsForDate)
                {
                    var vm = await CreateViewModel();

                    var validationResult = new ValidationResult(new[]
                    {
                        new ValidationFailure(
                            nameof(ViewModel.StartDate),
                            "T Level already exists, enter a new start date")
                    });

                    return(new ModelWithErrors <ViewModel>(vm, validationResult));
                }

                throw new NotImplementedException(
                          $"Unknown {nameof(CreateTLevelFailedReason)}: '{reason}'.");
            }

            _journeyInstance.UpdateState(state => state.SetCreatedTLevel(tLevelId));

            // Complete JourneyInstance so state can no longer be changed
            _journeyInstance.Complete();

            return(new Success());
        }
Пример #11
0
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var currentUser = _currentUserProvider.GetCurrentUser();

            if (!AuthorizationRules.CanUpdateProviderType(currentUser))
            {
                throw new NotAuthorizedException();
            }
        }
Пример #12
0
        public Task <TResponse> Handle(
            TRequest request,
            CancellationToken cancellationToken,
            RequestHandlerDelegate <TResponse> next)
        {
            var currentUser = _currentUserProvider.GetCurrentUser();

            if (currentUser != null && (currentUser.IsDeveloper || currentUser.IsHelpdesk))
            {
                return(next());
            }

            throw new NotAuthorizedException();
        }
Пример #13
0
        public async Task <OneOf <NotFound, Success> > Handle(OnboardProviderCommand request, CancellationToken cancellationToken)
        {
            var result = await _cosmosDbQueryDispatcher.ExecuteQuery(new UpdateProviderOnboarded
            {
                ProviderId      = request.ProviderId,
                UpdatedBy       = _currentUserProvider.GetCurrentUser(),
                UpdatedDateTime = _clock.UtcNow.ToLocalTime()
            });

            return(result.Match <OneOf <NotFound, Success> >(
                       notFound => notFound,
                       _ => new Success(),
                       success => success));
        }
        public async Task <ViewModel> Handle(Query request, CancellationToken cancellationToken)
        {
            var cosmosProvider = await _cosmosDbQueryDispatcher.ExecuteQuery(new CosmosQueries.GetProviderById()
            {
                ProviderId = request.ProviderId
            });

            var sqlProvider = await _sqlQueryDispatcher.ExecuteQuery(new SqlQueries.GetProviderById()
            {
                ProviderId = request.ProviderId
            });

            if (cosmosProvider == null)
            {
                throw new ResourceDoesNotExistException(ResourceType.Provider, request.ProviderId);
            }

            var currentUser = _currentUserProvider.GetCurrentUser();

            var providerTLevelDefinitions = cosmosProvider.ProviderType.HasFlag(ProviderType.TLevels)
                ? await _sqlQueryDispatcher.ExecuteQuery(new SqlQueries.GetTLevelDefinitionsForProvider {
                ProviderId = request.ProviderId
            })
                : Enumerable.Empty <SqlModels.TLevelDefinition>();

            return(new ViewModel()
            {
                ProviderId = request.ProviderId,
                ProviderName = cosmosProvider.ProviderName,
                CourseDirectoryStatus = cosmosProvider.ProviderStatus,
                Ukprn = cosmosProvider.Ukprn,
                TradingName = cosmosProvider.Alias,
                DisplayName = sqlProvider.DisplayName,
                CanChangeDisplayName = sqlProvider.HaveAlias && AuthorizationRules.CanUpdateProviderDisplayName(currentUser),
                ProviderType = cosmosProvider.ProviderType,
                CanChangeProviderType = AuthorizationRules.CanUpdateProviderType(currentUser),
                MarketingInformation = cosmosProvider.MarketingInformation != null?
                                       Html.SanitizeHtml(cosmosProvider.MarketingInformation) :
                                           null,
                                           ShowMarketingInformation = cosmosProvider.ProviderType.HasFlag(ProviderType.Apprenticeships),
                                           CanUpdateMarketingInformation = AuthorizationRules.CanUpdateProviderMarketingInformation(currentUser),
                                           ProviderTLevelDefinitions = providerTLevelDefinitions.Select(d => new TLevelDefinitionViewModel
                {
                    TLevelDefinitionId = d.TLevelDefinitionId,
                    Name = d.Name
                })
            });
        }
        public async Task <CommandResponse> Handle(
            Command request,
            CancellationToken cancellationToken)
        {
            var currentUser = _currentUserProvider.GetCurrentUser();

            if (currentUser.IsHelpdesk)
            {
                throw new NotAuthorizedException();
            }

            var maybeSubmission = await _sqlQueryDispatcher.ExecuteQuery(
                new GetLatestApprenticeshipQASubmissionForProvider()
            {
                ProviderId = request.ProviderId
            });

            var submission = maybeSubmission.Match(
                notfound => throw new InvalidStateException(InvalidStateReason.InvalidApprenticeshipQASubmission),
                found => found);

            // Cannot hide passed notification if qa status is not passed
            if (submission.Passed != true)
            {
                throw new InvalidStateException(InvalidStateReason.InvalidApprenticeshipQAStatus);
            }

            // Cannot hide notification if it has already been hidden
            if (submission.HidePassedNotification)
            {
                throw new InvalidStateException();
            }

            // Hide notification
            var hideDialog = await _sqlQueryDispatcher.ExecuteQuery(
                new UpdateHidePassedNotification()
            {
                ApprenticeshipQASubmissionId = submission.ApprenticeshipQASubmissionId,
                HidePassedNotification       = true
            });

            return(hideDialog.Match(
                       notfound => throw new InvalidStateException(InvalidStateReason.InvalidApprenticeshipQASubmission),
                       success => success));
        }
        public IActionResult Index([FromServices] ICurrentUserProvider currentUserProvider)
        {
            if (!User.Identity.IsAuthenticated)
            {
                return(View("Start"));
            }

            var currentUser = currentUserProvider.GetCurrentUser();

            if (currentUser.IsAdmin)
            {
                return(RedirectToAction("Dashboard", "HelpdeskDashboard"));
            }
            else  // Provider user
            {
                return(RedirectToAction("Index", "ProviderDashboard"));
            }
        }
Пример #17
0
        public async Task <CommandResponse> Handle(
            Command request,
            CancellationToken cancellationToken)
        {
            var currentUser = _currentUserProvider.GetCurrentUser();

            if (currentUser.IsHelpdesk)
            {
                throw new NotAuthorizedException();
            }

            var latestSubmission = await _sqlQueryDispatcher.ExecuteQuery(
                new GetLatestApprenticeshipQASubmissionForProvider()
            {
                ProviderId = _providerContextProvider.GetProviderId()
            });

            if (latestSubmission == null)
            {
                throw new InvalidStateException(InvalidStateReason.InvalidApprenticeshipQASubmission);
            }

            // Cannot hide passed notification if qa status is not passed
            if (latestSubmission.Passed != true)
            {
                throw new InvalidStateException(InvalidStateReason.InvalidApprenticeshipQAStatus);
            }

            // Cannot hide notification if it has already been hidden
            if (latestSubmission.HidePassedNotification)
            {
                throw new InvalidStateException();
            }

            // Hide notification
            await _sqlQueryDispatcher.ExecuteQuery(
                new UpdateHidePassedNotification()
            {
                ApprenticeshipQASubmissionId = latestSubmission.ApprenticeshipQASubmissionId,
                HidePassedNotification       = true
            });

            return(new Success());
        }
        public async Task <OneOf <ModelWithErrors <ViewModel>, SuccessViewModel> > Handle(Command request, CancellationToken cancellationToken)
        {
            var ukprn = await GetUkprnForCourse(request.CourseId);

            var(course, courseRun) = await GetCourseAndCourseRun(request.CourseId, request.CourseRunId, ukprn);

            if (!request.Confirm)
            {
                var vm = await CreateViewModel(course, courseRun);

                var validationResult = new ValidationResult(new[]
                {
                    new ValidationFailure(nameof(request.Confirm), "Confirm you want to delete the course")
                });
                return(new ModelWithErrors <ViewModel>(vm, validationResult));
            }

            await _cosmosDbQueryDispatcher.ExecuteQuery(new DeleteCourseRunQuery()
            {
                CourseId      = request.CourseId,
                CourseRunId   = request.CourseRunId,
                ProviderUkprn = ukprn,
                UpdatedBy     = _currentUserProvider.GetCurrentUser().UserId,
                UpdatedDate   = _clock.UtcNow,
            });

            // The next page needs this info - stash it in the JourneyModel
            // since it will no longer able to query for it.
            _journeyInstance.UpdateState(new JourneyModel()
            {
                CourseName    = courseRun.CourseName,
                ProviderId    = (await _providerInfoCache.GetProviderIdForUkprn(ukprn)).Value,
                ProviderUkprn = ukprn
            });

            _journeyInstance.Complete();

            return(new SuccessViewModel()
            {
                CourseId = request.CourseId,
                CourseRunId = request.CourseRunId,
                CourseName = courseRun.CourseName
            });
        }
Пример #19
0
        public async Task <TResponse> Handle(
            TRequest request,
            CancellationToken cancellationToken,
            RequestHandlerDelegate <TResponse> next)
        {
            var providerId  = _descriptor.GetProviderId(request);
            var currentUser = _currentUserProvider.GetCurrentUser();

            if (!AuthorizationRules.CanSubmitQASubmission(currentUser, providerId))
            {
                throw new NotAuthorizedException();
            }

            var qaStatus = await _sqlQueryDispatcher.ExecuteQuery(
                new GetProviderApprenticeshipQAStatus()
            {
                ProviderId = providerId
            });

            var effectiveQaStatus = qaStatus.ValueOrDefault();

            // Ignore UnableToComplete here
            var qaStatusIsValid = (effectiveQaStatus & ~ApprenticeshipQAStatus.UnableToComplete) switch
            {
                ApprenticeshipQAStatus.NotStarted => true,
                ApprenticeshipQAStatus.Failed => true,
                _ => false
            };

            var providerInfo = await _providerInfoCache.GetProviderInfo(providerId);

            var providerTypeIsValid = providerInfo.ProviderType.HasFlag(ProviderType.Apprenticeships);

            if (!qaStatusIsValid || !providerTypeIsValid)
            {
                throw new InvalidStateException(InvalidStateReason.InvalidApprenticeshipQAStatus);
            }

            return(await next());
        }
    }
Пример #20
0
        private bool IsAuthorized(Guid?providerId)
        {
            var currentUser = _currentUserProvider.GetCurrentUser();

            if (currentUser == null)
            {
                return(false);
            }

            if (currentUser.Role == RoleNames.Developer || currentUser.Role == RoleNames.Helpdesk)
            {
                return(true);
            }

            if ((currentUser.Role == RoleNames.ProviderUser || currentUser.Role == RoleNames.ProviderSuperUser) &&
                currentUser.CurrentProviderId == providerId)
            {
                return(true);
            }

            return(false);
        }
Пример #21
0
        public async Task <OneOf <ModelWithErrors <ViewModel>, Success> > Handle(Command request, CancellationToken cancellationToken)
        {
            _journeyInstance.ThrowIfCompleted();

            var apprenticeship = await GetApprenticeship(request.ApprenticeshipId);

            if (!request.Confirm)
            {
                var vm = CreateViewModel(apprenticeship);
                var validationResult = new ValidationResult(new[]
                {
                    new ValidationFailure(nameof(request.Confirm), "Confirm you want to delete the Apprenticeship")
                });
                return(new ModelWithErrors <ViewModel>(vm, validationResult));
            }

            await _sqlQueryDispatcher.ExecuteQuery(new DeleteApprenticeshipQuery()
            {
                ApprenticeshipId = request.ApprenticeshipId,
                DeletedBy        = _currentUserProvider.GetCurrentUser(),
                DeletedOn        = _clock.UtcNow
            });

            _providerOwnershipCache.OnApprenticeshipDeleted(request.ApprenticeshipId);

            // The next page needs this info - stash it in the JourneyModel
            // since it will no longer able to query for it.
            _journeyInstance.UpdateState(new JourneyModel()
            {
                ApprenticeshipId    = apprenticeship.ApprenticeshipId,
                ProviderId          = apprenticeship.ProviderId,
                ApprenticeshipTitle = apprenticeship.Standard.StandardName,
                NotionalNVQLevelv2  = apprenticeship.Standard.NotionalNVQLevelv2
            });

            _journeyInstance.Complete();

            return(new Success());
        }
Пример #22
0
        public async Task <OneOf <ModelWithErrors <ViewModel>, Success> > Handle(Command request, CancellationToken cancellationToken)
        {
            _journeyInstance.ThrowIfCompleted();

            var tLevel = await GetTLevel(request.TLevelId);

            if (!request.Confirm)
            {
                var vm = CreateViewModel(tLevel);
                var validationResult = new ValidationResult(new[]
                {
                    new ValidationFailure(nameof(request.Confirm), "Confirm you want to delete the T Level")
                });
                return(new ModelWithErrors <ViewModel>(vm, validationResult));
            }

            await _sqlQueryDispatcher.ExecuteQuery(new DeleteTLevelQuery()
            {
                TLevelId  = request.TLevelId,
                DeletedBy = _currentUserProvider.GetCurrentUser(),
                DeletedOn = _clock.UtcNow
            });

            _providerOwnershipCache.OnTLevelDeleted(request.TLevelId);

            // The next page needs this info - stash it in the JourneyModel
            // since it will no longer able to query for it.
            _journeyInstance.UpdateState(new JourneyModel()
            {
                TLevelName    = tLevel.TLevelDefinition.Name,
                ProviderId    = tLevel.ProviderId,
                YourReference = tLevel.YourReference
            });

            _journeyInstance.Complete();

            return(new Success());
        }
Пример #23
0
        public async Task <Success> Handle(Command request, CancellationToken cancellationToken)
        {
            await _sqlQueryDispatcher.ExecuteQuery(new UpdateVenue()
            {
                VenueId          = request.VenueId,
                ProviderVenueRef = _journeyInstance.State.ProviderVenueRef,
                Name             = _journeyInstance.State.Name,
                Email            = _journeyInstance.State.Email,
                Telephone        = _journeyInstance.State.PhoneNumber,
                Website          = _journeyInstance.State.Website,
                AddressLine1     = _journeyInstance.State.AddressLine1,
                AddressLine2     = _journeyInstance.State.AddressLine2,
                Town             = _journeyInstance.State.Town,
                County           = _journeyInstance.State.County,
                Postcode         = _journeyInstance.State.Postcode,
                Latitude         = _journeyInstance.State.Latitude,
                Longitude        = _journeyInstance.State.Longitude,
                UpdatedOn        = _clock.UtcNow,
                UpdatedBy        = _currentUserProvider.GetCurrentUser()
            });

            return(new Success());
        }
Пример #24
0
        public async Task <IOutput> Handle(CheckInput request, CancellationToken cancellationToken)
        {
            var user = await _currentUserProvider.GetCurrentUser();

            if (user is null)
            {
                return(ActionOutput.Error("Вы не авторизованы"));
            }

            if (user.IsBanned == true)
            {
                _logger.LogInformation("User {name} tried to enter with ban", user.Mail);
                return(ActionOutput.Error("Пользователь забанен."));
            }

            var identity = _dataProvider.GetIdentity(user.Mail);

            if (identity is null)
            {
                return(ActionOutput.Error("Пользователь не найден"));
            }

            return(ActionOutput.SuccessData(new { token = _dataProvider.GetJwtByIdentity(identity) }));
        }
        public async Task <OneOf <UploadFailedResult, UploadSucceededResult> > Handle(
            Command request,
            CancellationToken cancellationToken)
        {
            var validator = new CommandValidator();
            var result    = await validator.ValidateAsync(request);

            if (!result.IsValid)
            {
                return(new UploadFailedResult(await CreateViewModel(), result));
            }

            var providerId = _providerContextProvider.GetProviderId();

            using var stream = request.File.OpenReadStream();

            var saveFileResult = await _fileUploadProcessor.SaveVenueFile(
                providerId,
                stream,
                _currentUserProvider.GetCurrentUser());

            if (saveFileResult.Status == SaveVenueFileResultStatus.InvalidFile)
            {
                return(new UploadFailedResult(
                           await CreateViewModel(),
                           "The selected file must be a CSV"));
            }
            else if (saveFileResult.Status == SaveVenueFileResultStatus.InvalidRows)
            {
                return(new UploadFailedResult(
                           await CreateViewModel(),
                           "The selected file must use the template"));
            }
            else if (saveFileResult.Status == SaveVenueFileResultStatus.InvalidHeader)
            {
                return(new UploadFailedResult(
                           await CreateViewModel(),
                           "Enter headings in the correct format",
                           saveFileResult.MissingHeaders));
            }
            else if (saveFileResult.Status == SaveVenueFileResultStatus.EmptyFile)
            {
                return(new UploadFailedResult(
                           await CreateViewModel(),
                           "The selected file is empty"));
            }
            else if (saveFileResult.Status == SaveVenueFileResultStatus.ExistingFileInFlight)
            {
                // UI Should stop us getting here so a generic error is sufficient
                throw new InvalidStateException();
            }

            Debug.Assert(saveFileResult.Status == SaveVenueFileResultStatus.Success);

            // Wait for a little bit to see if the file gets processed quickly
            // (so we can skip the In Progress UI)

            try
            {
                using var cts = new CancellationTokenSource(_optionsAccessor.Value.ProcessedImmediatelyThreshold);
                var uploadStatus = await _fileUploadProcessor.WaitForVenueProcessingToCompleteForProvider(providerId, cts.Token);

                return(uploadStatus == UploadStatus.ProcessedWithErrors ?
                       UploadSucceededResult.ProcessingCompletedWithErrors :
                       UploadSucceededResult.ProcessingCompletedSuccessfully);
            }
            catch (OperationCanceledException)
            {
                return(UploadSucceededResult.ProcessingInProgress);
            }
        }
Пример #26
0
        public async Task <IActionResult> Upload(IFormFile bulkUploadFile)
        {
            var sw = Stopwatch.StartNew();

            try
            {
                var UKPRN = HttpContext.Session.GetInt32("UKPRN");
                if (UKPRN == null)
                {
                    return(RedirectToAction("Index", "Home", new { errmsg = "Please select a Provider." }));
                }
                if (!Validate.ValidateFile(bulkUploadFile, out var errorMessage))
                {
                    return(View(new BulkUploadViewModel {
                        errors = new[] { errorMessage }
                    }));
                }

                await using var ms = new MemoryStream();
                bulkUploadFile.CopyTo(ms);

                ms.Position = 0;
                if (Validate.IsBinaryStream(ms))
                {
                    return(View(new BulkUploadViewModel {
                        errors = new[] { "Invalid file content." }
                    }));
                }

                ApprenticeshipBulkUploadResult result = default;
                try
                {
                    ms.Position = 0;

                    result = await _apprenticeshipBulkUploadService.ValidateAndUploadCSV(
                        bulkUploadFile.FileName,
                        ms,
                        _currentUserProvider.GetCurrentUser(),
                        UKPRN.Value);
                }
                catch (HeaderValidationException he)
                {
                    var errors = new[] { ApprenticeshipBulkUploadService.FirstSentence(he) };
                    return(View(new BulkUploadViewModel {
                        errors = errors
                    }));
                }
                catch (BadDataException be)
                {
                    var errors = be.Message.Split(';');
                    return(View(new BulkUploadViewModel {
                        errors = errors
                    }));
                }
                catch (Exception e)
                {
                    var errors = new[] { e.Message };
                    return(View(new BulkUploadViewModel {
                        errors = errors
                    }));
                }

                if (result.Errors.Count != 0)
                {
                    var errors = result.Errors;
                    return(RedirectToAction("WhatDoYouWantToDoNext", "BulkUploadApprenticeships", new
                    {
                        message = $"Your file contained {errors.Count} error{(errors.Count > 1 ? "s" : "")}. You must resolve all errors before your apprenticeship training information can be published.",
                        errorCount = errors.Count
                    }
                                            ));
                }

                if (result.ProcessedSynchronously)
                {
                    // All good => redirect to BulkCourses action
                    return(RedirectToAction("PublishYourFile", "BulkUploadApprenticeships"));
                }
                else
                {
                    return(RedirectToAction("Pending"));
                }
            }
            finally
            {
                sw.Stop();
            }
        }
Пример #27
0
        public async Task <OneOf <ModelWithErrors <ViewModel>, Success> > Handle(
            CompleteCommand request,
            CancellationToken cancellationToken)
        {
            ValidateFlowState();

            var providerId = request.ProviderId;
            var provider   = await _providerInfoCache.GetProviderInfo(providerId);

            var validator        = new CompleteValidator();
            var validationResult = await validator.ValidateAsync(_flow.State);

            if (!validationResult.IsValid)
            {
                var vm = await CreateViewModel(provider);

                return(new ModelWithErrors <ViewModel>(vm, validationResult));
            }

            var currentUser = _currentUserProvider.GetCurrentUser();
            var now         = _clock.UtcNow;

            var apprenticeshipId = _flow.State.ApprenticeshipId.GetValueOrDefault(Guid.NewGuid());
            var providerUkprn    = provider.Ukprn;

            var providerVenues = await _cosmosDbQueryDispatcher.ExecuteQuery(
                new GetVenuesByProvider()
            {
                ProviderUkprn = providerUkprn
            });

            var locations = CreateLocations(providerVenues, providerUkprn);

            if (_flow.State.ApprenticeshipId.HasValue)
            {
                // Update existing apprenticeship
                await _cosmosDbQueryDispatcher.ExecuteQuery(
                    new UpdateApprenticeship()
                {
                    ApprenticeshipLocations = locations,
                    ApprenticeshipTitle     = _flow.State.ApprenticeshipStandardOrFramework.StandardOrFrameworkTitle,
                    ApprenticeshipType      = _flow.State.ApprenticeshipStandardOrFramework.IsStandard ?
                                              ApprenticeshipType.StandardCode :
                                              ApprenticeshipType.FrameworkCode,
                    ContactEmail     = _flow.State.ApprenticeshipContactEmail,
                    ContactTelephone = _flow.State.ApprenticeshipContactTelephone,
                    ContactWebsite   = _flow.State.ApprenticeshipContactWebsite,
                    UpdatedBy        = currentUser,
                    UpdatedDate      = now,
                    Id = _flow.State.ApprenticeshipId.Value,
                    MarketingInformation = _flow.State.ApprenticeshipMarketingInformation,
                    ProviderUkprn        = providerUkprn,
                    StandardOrFramework  = _flow.State.ApprenticeshipStandardOrFramework,
                    Url = _flow.State.ApprenticeshipWebsite
                });
            }
            else
            {
                // Create apprenticeship
                await _cosmosDbQueryDispatcher.ExecuteQuery(
                    new CreateApprenticeship()
                {
                    ApprenticeshipLocations = locations,
                    ApprenticeshipTitle     = _flow.State.ApprenticeshipStandardOrFramework.StandardOrFrameworkTitle,
                    ApprenticeshipType      = _flow.State.ApprenticeshipStandardOrFramework.IsStandard ?
                                              ApprenticeshipType.StandardCode :
                                              ApprenticeshipType.FrameworkCode,
                    ContactEmail     = _flow.State.ApprenticeshipContactEmail,
                    ContactTelephone = _flow.State.ApprenticeshipContactTelephone,
                    ContactWebsite   = _flow.State.ApprenticeshipContactWebsite,
                    CreatedByUser    = currentUser,
                    CreatedDate      = now,
                    Id = apprenticeshipId,
                    MarketingInformation = _flow.State.ApprenticeshipMarketingInformation,
                    ProviderId           = request.ProviderId,
                    ProviderUkprn        = providerUkprn,
                    StandardOrFramework  = _flow.State.ApprenticeshipStandardOrFramework,
                    Url    = _flow.State.ApprenticeshipWebsite,
                    Status = 2      // Pending
                });
            }

            // Create QA submission
            await _sqlQueryDispatcher.ExecuteQuery(
                new CreateApprenticeshipQASubmission()
            {
                ProviderId      = request.ProviderId,
                Apprenticeships = new List <CreateApprenticeshipQASubmissionApprenticeship>()
                {
                    new CreateApprenticeshipQASubmissionApprenticeship()
                    {
                        ApprenticeshipId = apprenticeshipId,
                        ApprenticeshipMarketingInformation = _flow.State.ApprenticeshipMarketingInformation,
                        ApprenticeshipTitle = _flow.State.ApprenticeshipStandardOrFramework.StandardOrFrameworkTitle,
                        Locations           = locations.Select(l => l.ApprenticeshipLocationType switch
                        {
                            ApprenticeshipLocationType.ClassroomBased => new CreateApprenticeshipQASubmissionApprenticeshipLocation(
                                new CreateApprenticeshipQASubmissionApprenticeshipClassroomLocation()
                            {
                                DeliveryModes = l.DeliveryModes,
                                Radius        = l.Radius.Value,
                                VenueName     = providerVenues.Single(v => v.Id == l.VenueId).VenueName
                            }),
                            ApprenticeshipLocationType.EmployerBased => new CreateApprenticeshipQASubmissionApprenticeshipLocation(
                                l.National == true ?
                                new CreateApprenticeshipQASubmissionApprenticeshipEmployerLocation(new National()) :
                                new CreateApprenticeshipQASubmissionApprenticeshipEmployerLocation(
                                    new CreateApprenticeshipQASubmissionApprenticeshipEmployerLocationRegions()
                            {
                                SubRegionIds = l.Regions.ToList()
                            })),
                            _ => throw new NotSupportedException()
                        }).ToList()
        public async Task <OneOf <ModelWithErrors <ViewModel>, PublishResult> > Handle(Command request, CancellationToken cancellationToken)
        {
            var providerId = _providerContextProvider.GetProviderId();

            if (!request.Confirm)
            {
                var(uploadRows, uploadStatus) = await _fileUploadProcessor.GetCourseUploadRowsForProvider(providerId);

                var vm = await CreateViewModel(uploadRows);

                var validationResult = new ValidationResult(new[]
                {
                    new ValidationFailure(nameof(request.Confirm), "Confirm you want to publish these courses")
                });
                return(new ModelWithErrors <ViewModel>(vm, validationResult));
            }

            var publishResult = await _fileUploadProcessor.PublishCourseUploadForProvider(providerId, _currentUserProvider.GetCurrentUser());

            if (publishResult.Status == PublishResultStatus.Success)
            {
                var journeyInstance = _journeyInstanceProvider.GetOrCreateInstance(() => new PublishJourneyModel());
                journeyInstance.UpdateState(state => state.CoursesPublished = publishResult.PublishedCount);
            }

            return(publishResult);
        }
Пример #29
0
 public async Task <IActionResult> CreateSubjectSertificate([FromBody] AddCertificateInput request)
 {
     request.UserId = (await _currentUserProvider.GetCurrentUser()).Id;
     return(await _dispatcher.DispatchAsync(request));
 }
Пример #30
0
        public async Task RegisterNew(AuditedEntity entity)
        {
            var user = await currentUserProvider.GetCurrentUser();

            entity.MarkAsNew(user);
        }