public IActionResult ActionAccessRequest(int accessRequestId)
        {
            // Include instructs EF to also retrieve data that's connected with a foreign key
            // With ThenInclude you can also retrieve relations of relations
            var request = _context.AccessRequests
                          .Include(accessRequest => accessRequest.Requester)
                          .ThenInclude(requester => requester.OrganisationUsers)
                          .ThenInclude(x => x.Organisation)
                          .SingleOrDefault(x => x.Id == accessRequestId);

            if (request == null)
            {
                return(NotFound());
            }

            var requestedEmail = request.EmailAddress.ToLower();

            // if a user gets recreated, this breaks the FK relation to mcUser, so we try to
            // recover by finding the new user by email
            var requesterUser = request.Requester ?? _context.Users.Include(x => x.OrganisationUsers).ThenInclude(x => x.Organisation).SingleOrDefault(x => x.Email == request.RequesterEmail);

            if (requesterUser == null)
            {
                return(NotFound());
            }

            UpdateAccessRights(requestedEmail, request.FirstName, request.LastName, requesterUser);

            request.Status = RequestStatus.Completed;

            _context.Save();
            return(Ok());
        }
Ejemplo n.º 2
0
        public void LogAccessRequest(AccessRequest request, string requesterEmail)
        {
            _context.RunInRetryableTransaction(() =>
            {
                var requester = _context
                                .GetUsers(requesterEmail)
                                .Include(x => x.OrganisationUsers)
                                .ThenInclude(x => x.Organisation)
                                .Single();

                var requestedIfExists = _context
                                        .GetUsers(request.EmailAddress)
                                        .Include(x => x.OrganisationUsers)
                                        .ThenInclude(x => x.Organisation)
                                        .SingleOrDefault();

                var entity = _context.AccessRequests.Add(new Domain.Models.AccessRequest()
                {
                    RequestDateUtc = DateTime.UtcNow,
                    Requester      = requester,
                    RequesterEmail = requester.Email,
                    FirstName      = request.FirstName,
                    LastName       = request.LastName,
                    EmailAddress   = request.EmailAddress,
                    Organisation   = request.Organisation,
                    Reason         = request.Reason,
                    Status         = Domain.Models.AccessRequest.RequestStatus.Requested
                });
                _context.Save();

                _emailService.SendAccessRequestEmailToSupport(entity.Entity, requester, requestedIfExists);
            });
        }
Ejemplo n.º 3
0
        /// <inheritdoc />
        public async Task <User> GetAndUpdateUserAsync(JsonUserDetails userDetails)
        {
            var mcUser = await _context.Users.SingleOrDefaultAsync(u => u.SignInUserId == userDetails.Subject);

            if (mcUser == null)
            {
                // fall back to email address for users where we don't yet know their sign-in id
                mcUser = await _context.GetUsers(userDetails.Email).SingleOrDefaultAsync();

                if (mcUser != null)
                {
                    // record the sign-in id and use that in future
                    mcUser.SignInUserId = userDetails.Subject;
                }
            }
            if (mcUser == null)
            {
                throw new McUserNotFoundException();
            }
            UpdateMcUserFromSignIn(mcUser, userDetails);

            _context.Save();
            return(mcUser);
        }
        public void Invite(string email)
        {
            var mcUser = _context.GetUsers(email).SingleOrDefault();

            if (mcUser == null)
            {
                throw new McUserNotFoundException();
            }
            var inviteEmailModel = new InviteEmailModel(mcUser);

            _inviteEmailService.Send(inviteEmailModel);
            if (mcUser.InviteDateUtc == null)
            {
                mcUser.InviteDateUtc = _clock.UtcNow;
                _context.Save();
            }
        }
        public void UpdateNewCourse(string providerCode, string courseCode, string email)
        {
            var optedInNewCourse = _context.GetCourse(providerCode, courseCode, email)
                                   .FirstOrDefault(c =>
                                                   c.Provider.OptedIn &&
                                                   c.CourseSites != null &&
                                                   c.CourseSites.Any(OnlyNewOrRunningAndUnpublished));

            if (optedInNewCourse != null)
            {
                foreach (var cs in optedInNewCourse.CourseSites.Where(OnlyNewOrRunningAndUnpublished))
                {
                    cs.Publish = "Y";
                    cs.Status  = "R";
                }

                _context.Save();
            }
        }
        public IActionResult Index()
        {
            var email = this.HttpContext.User.Identity.Name;

            if (string.IsNullOrWhiteSpace(email))
            {
                throw new InvalidOperationException($"Accept terms attempted on unauthorised user");
            }

            var user = context.GetUsers(email).SingleOrDefault();

            if (user == null)
            {
                return(NotFound());
            }

            user.AcceptTermsDateUtc = DateTime.UtcNow;

            context.Save();

            return(Ok());
        }
Ejemplo n.º 7
0
        /// <summary>
        /// This is an upsert.
        /// If a draft record exists then update it.
        /// If a draft record does not exist then add a new one.
        /// If a new draft record is created then:
        ///check for the existence of a previous published record and get the last pulished date
        /// </summary>
        /// <param name="model">holds the enriched data</param>
        /// <param name="providerCode">the provider code for the enrichment data</param>
        /// <param name="email">the email of the user</param>
        public void SaveProviderEnrichment(UcasProviderEnrichmentPostModel model, string providerCode, string email)
        {
            var userProvider = ValidateUserOrg(email, providerCode);

            providerCode = providerCode.ToUpperInvariant();
            var provider = _context.Providers
                           .Include(p => p.ProviderEnrichments)
                           .SingleOrDefault(p => p.ProviderCode == providerCode &&
                                            p.RecruitmentCycle.Year == RecruitmentCycle.CurrentYear);

            if (provider == null)
            {
                throw new Exception($"Provider {RecruitmentCycle.CurrentYear}/{providerCode} not found");
            }

            var enrichmentDraftRecord = provider.ProviderEnrichments
                                        .Where(ie => ie.Status == EnumStatus.Draft)
                                        .OrderByDescending(x => x.Id)
                                        .FirstOrDefault();

            // when saving enforce the region code is being saved.
            if (!model.EnrichmentModel.RegionCode.HasValue)
            {
                model.EnrichmentModel.RegionCode = provider.RegionCode;
            }

            string content = _converter.ConvertToJson(model);

            if (enrichmentDraftRecord != null)
            {
                //update
                enrichmentDraftRecord.UpdatedAt     = DateTime.UtcNow;
                enrichmentDraftRecord.UpdatedByUser = userProvider.User;
                enrichmentDraftRecord.JsonData      = content;
            }
            else
            {
                //insert
                var enrichmentPublishRecord = provider.ProviderEnrichments
                                              .Where(ie => ie.Status == EnumStatus.Published)
                                              .OrderByDescending(x => x.Id)
                                              .FirstOrDefault();

                DateTime?lastPublishedDate = null;
                if (enrichmentPublishRecord != null)
                {
                    lastPublishedDate = enrichmentPublishRecord.LastPublishedAt;
                }
                var enrichment = new ProviderEnrichment
                {
                    ProviderCode    = userProvider.UcasProviderCode,
                    CreatedAt       = DateTime.UtcNow,
                    UpdatedAt       = DateTime.UtcNow,
                    LastPublishedAt = lastPublishedDate,
                    CreatedByUser   = userProvider.User,
                    UpdatedByUser   = userProvider.User,
                    Status          = EnumStatus.Draft,
                    JsonData        = content,
                };
                provider.ProviderEnrichments.Add(enrichment);
            }
            _context.Save();
        }