Esempio n. 1
0
        public async Task <ActionResult> ChangeEmail(AdminChangeEmailModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View("ChangeEmailModal", model));
            }

            var result = await AdminUserWriter.ChangeEmail(User.Identity.GetUserId(), model);

            if (!ModelState.IsWriterResultValid(result))
            {
                return(View("ChangeEmailModal", model));
            }

            return(CloseModalSuccess(result.Message));
        }
        public async Task <IWriterResult> ChangeEmail(string userId, AdminChangeEmailModel model)
        {
            using (var context = DataContextFactory.CreateContext())
            {
                var user = await context.Users.FirstOrDefaultNoLockAsync(x => x.UserName == model.UserName);

                if (user == null)
                {
                    return(new WriterResult(false, $"User '{model.UserName}' not found"));
                }

                var existing = await context.Users.FirstOrDefaultNoLockAsync(x => x.Email == model.NewEmailAddress);

                if (existing != null)
                {
                    return(new WriterResult(false, $"Email '{model.NewEmailAddress}' is already in use."));
                }

                var approval = await context.ApprovalQueue.FirstOrDefaultNoLockAsync(x => x.DataUserId == user.Id && x.Type == Enums.ApprovalQueueType.ChangeEmail && x.Status == Enums.ApprovalQueueStatus.Pending);

                if (approval != null)
                {
                    return(new WriterResult(false, "There is already an awaiting approval request for this user."));
                }

                approval = new Entity.ApprovalQueue
                {
                    DataUserId    = user.Id,
                    RequestUserId = userId,
                    Type          = Enums.ApprovalQueueType.ChangeEmail,
                    Status        = Enums.ApprovalQueueStatus.Pending,
                    Created       = DateTime.UtcNow,
                    Data          = JsonConvert.SerializeObject(model)
                };
                context.ApprovalQueue.Add(approval);
                await context.SaveChangesAsync();

                return(new WriterResult(true, "Email change request added to admin approval queue."));
            }
        }