예제 #1
0
        public async Task <IActionResult> EditUserProfile(EditProfileModel model, IFormCollection form, CancellationToken cancellationToken)
        {
            if (!await _authorizationService.CanUserEditProfileAsync(UserId, DepartmentId, model.UserId))
            {
                Unauthorized();
            }

            model.User = _usersService.GetUserById(model.UserId);
            //model.PushUris = await _pushUriService.GetPushUrisByUserId(model.UserId);
            model.Department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId);

            model.CanEnableVoice = await _limitsService.CanDepartmentUseVoiceAsync(DepartmentId);

            var groups       = new List <DepartmentGroup>();
            var defaultGroup = new DepartmentGroup();

            defaultGroup.Name = "No Group";
            groups.Add(defaultGroup);
            groups.AddRange(await _departmentGroupsService.GetAllGroupsForDepartmentAsync(model.Department.DepartmentId));
            model.Groups = new SelectList(groups, "DepartmentGroupId", "Name");

            ViewBag.Carriers  = model.Carrier.ToSelectList();
            ViewBag.Countries = new SelectList(Countries.CountryNames);
            ViewBag.TimeZones = new SelectList(TimeZones.Zones, "Key", "Value");

            if (!String.IsNullOrEmpty(model.Profile.MobileNumber))
            {
                if (model.Carrier == MobileCarriers.None)
                {
                    ModelState.AddModelError("Carrier", "If you entered a mobile phone, you need to select your mobile carrier. If you carrier is not listed select one and contact us to have your carrier added.");
                }
                else
                {
                    if (model.Carrier == MobileCarriers.VirginMobileUk && !model.Profile.MobileNumber.StartsWith("0"))
                    {
                        ModelState.AddModelError("Profile.MobileNumber", "Virgin Mobile Uk requires your phone number to start with 0.");
                    }

                    if (model.Carrier == MobileCarriers.O2 && !model.Profile.MobileNumber.StartsWith("44"))
                    {
                        ModelState.AddModelError("Profile.MobileNumber", "O2 requires your phone number to start with 44.");
                    }

                    if (model.Carrier == MobileCarriers.Orange && !model.Profile.MobileNumber.StartsWith("0"))
                    {
                        ModelState.AddModelError("Profile.MobileNumber", "Orange requires your phone number to start with 0.");
                    }

                    if (model.Carrier == MobileCarriers.TMobileUk && !model.Profile.MobileNumber.StartsWith("0"))
                    {
                        ModelState.AddModelError("Profile.MobileNumber", "T-Mobile Uk requires your phone number to start with 0.");
                    }

                    if (model.Carrier == MobileCarriers.Vodafone && !model.Profile.MobileNumber.StartsWith("0"))
                    {
                        ModelState.AddModelError("Profile.MobileNumber", "Vodafone requires your phone number to start with 0.");
                    }
                }
            }

            if ((model.Profile.SendSms || model.Profile.SendMessageSms || model.Profile.SendMessageSms) && String.IsNullOrEmpty(model.Profile.MobileNumber))
            {
                ModelState.AddModelError("Profile.MobileNumber", "You have selected you want SMS/Text notifications but have not supplied a mobile number.");
            }

            // They specified a street address for physical
            if (!String.IsNullOrWhiteSpace(model.PhysicalAddress1))
            {
                if (String.IsNullOrEmpty(model.PhysicalCity))
                {
                    ModelState.AddModelError("City", string.Format("The Physical City field is required"));
                }

                if (String.IsNullOrEmpty(model.PhysicalCountry))
                {
                    ModelState.AddModelError("Country", string.Format("The Physical Country field is required"));
                }

                if (String.IsNullOrEmpty(model.PhysicalPostalCode))
                {
                    ModelState.AddModelError("PostalCode", string.Format("The Physical Postal Code field is required"));
                }

                if (String.IsNullOrEmpty(model.PhysicalState))
                {
                    ModelState.AddModelError("State", string.Format("The Physical State/Provence field is required"));
                }
            }

            if (!String.IsNullOrWhiteSpace(model.MailingAddress1) && !model.MailingAddressSameAsPhysical)
            {
                if (String.IsNullOrEmpty(model.MailingCity))
                {
                    ModelState.AddModelError("City", string.Format("The Mailing City field is required"));
                }

                if (String.IsNullOrEmpty(model.MailingCountry))
                {
                    ModelState.AddModelError("Country", string.Format("The Mailing Country field is required"));
                }

                if (String.IsNullOrEmpty(model.MailingPostalCode))
                {
                    ModelState.AddModelError("PostalCode", string.Format("The Mailing Postal Code field is required"));
                }

                if (String.IsNullOrEmpty(model.MailingState))
                {
                    ModelState.AddModelError("State", string.Format("The Mailing State/Provence field is required"));
                }
            }

            if (model.User.Email != model.Email)
            {
                var currentEmail = _usersService.GetUserByEmail(model.Email);

                if (currentEmail != null && currentEmail.Id != model.User.UserId.ToString())
                {
                    ModelState.AddModelError("Email", "Email Address Already in Use. Please use another one.");
                }
            }

            if (model.Profile.VoiceForCall)
            {
                if (model.Profile.VoiceCallHome && String.IsNullOrWhiteSpace(model.Profile.HomeNumber))
                {
                    ModelState.AddModelError("VoiceForCall", "You selected to Enable Telephone alerting for your home phone number but have not supplied a home phone number. Please supply one.");
                }

                if (model.Profile.VoiceCallMobile && String.IsNullOrWhiteSpace(model.Profile.MobileNumber))
                {
                    ModelState.AddModelError("VoiceForCall", "You selected to Enable Telephone alerting for your mobile phone number but have not supplied a mobile phone number. Please supply one.");
                }

                if (!model.Profile.VoiceCallHome && !model.Profile.VoiceCallMobile)
                {
                    ModelState.AddModelError("VoiceForCall", "You selected to Enable Telephone alerting, but you didn't select a number to call you at. Please select either/both home phone or mobile phone.");
                }
            }

            if (model.IsOwnProfile)
            {
                bool checkPasswordSuccess = false;
                if (string.IsNullOrEmpty(model.OldPassword) == false && string.IsNullOrEmpty(model.NewPassword) == false)
                {
                    try
                    {
                        checkPasswordSuccess = await _userManager.CheckPasswordAsync(model.User, model.OldPassword);
                    }
                    catch (Exception)
                    {
                        checkPasswordSuccess = false;
                    }

                    if (!checkPasswordSuccess)
                    {
                        ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
                    }
                }

                if (!String.IsNullOrWhiteSpace(model.NewUsername))
                {
                    var newUser = await _userManager.FindByNameAsync(model.NewUsername);

                    if (newUser != null)
                    {
                        ModelState.AddModelError("", "The NEW username you have supplied is already in use, please try another one. If you didn't mean to update your username please leave that field blank.");
                    }
                }
            }

            if (ModelState.IsValid)
            {
                Address homeAddress    = null;
                Address mailingAddress = null;

                var auditEvent = new AuditEvent();
                auditEvent.DepartmentId = DepartmentId;
                auditEvent.UserId       = UserId;
                auditEvent.Type         = AuditLogTypes.ProfileUpdated;

                var savedProfile = await _userProfileService.GetProfileByUserIdAsync(model.UserId);

                if (savedProfile == null)
                {
                    savedProfile = new UserProfile();
                }

                auditEvent.Before = savedProfile.CloneJson();

                savedProfile.UserId                  = model.UserId;
                savedProfile.MobileCarrier           = (int)model.Carrier;
                savedProfile.FirstName               = model.FirstName;
                savedProfile.LastName                = model.LastName;
                savedProfile.MobileNumber            = model.Profile.MobileNumber;
                savedProfile.SendEmail               = model.Profile.SendEmail;
                savedProfile.SendPush                = model.Profile.SendPush;
                savedProfile.SendSms                 = model.Profile.SendSms;
                savedProfile.SendMessageEmail        = model.Profile.SendMessageEmail;
                savedProfile.SendMessagePush         = model.Profile.SendMessagePush;
                savedProfile.SendMessageSms          = model.Profile.SendMessageSms;
                savedProfile.SendNotificationEmail   = model.Profile.SendNotificationEmail;
                savedProfile.SendNotificationPush    = model.Profile.SendNotificationPush;
                savedProfile.SendNotificationSms     = model.Profile.SendNotificationSms;
                savedProfile.DoNotRecieveNewsletters = model.Profile.DoNotRecieveNewsletters;
                savedProfile.HomeNumber              = model.Profile.HomeNumber;
                savedProfile.IdentificationNumber    = model.Profile.IdentificationNumber;
                savedProfile.TimeZone                = model.Profile.TimeZone;

                if (model.CanEnableVoice)
                {
                    savedProfile.VoiceForCall = model.Profile.VoiceForCall;

                    if (savedProfile.VoiceForCall)
                    {
                        savedProfile.VoiceCallHome   = model.Profile.VoiceCallHome;
                        savedProfile.VoiceCallMobile = model.Profile.VoiceCallMobile;
                    }
                    else
                    {
                        savedProfile.VoiceCallHome   = false;
                        savedProfile.VoiceCallMobile = false;
                    }
                }
                else
                {
                    savedProfile.VoiceForCall    = false;
                    savedProfile.VoiceCallHome   = false;
                    savedProfile.VoiceCallMobile = false;
                }

                if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin())
                {
                    var currentGroup = await _departmentGroupsService.GetGroupForUserAsync(model.UserId, DepartmentId);

                    if (model.UserGroup != 0 && (currentGroup == null || currentGroup.DepartmentGroupId != model.UserGroup))
                    {
                        await _departmentGroupsService.MoveUserIntoGroupAsync(model.UserId, model.UserGroup, model.IsUserGroupAdmin, DepartmentId, cancellationToken);
                    }
                    else if (currentGroup != null && currentGroup.DepartmentGroupId == model.UserGroup)
                    {
                        var member = await _departmentGroupsService.GetGroupMemberForUserAsync(model.UserId, DepartmentId);

                        if (member != null)
                        {
                            member.IsAdmin = model.IsUserGroupAdmin;
                            _departmentGroupsService.SaveGroupMember(member);
                        }
                    }
                    else if (model.UserGroup <= 0)
                    {
                        await _departmentGroupsService.DeleteUserFromGroupsAsync(model.UserId, DepartmentId, cancellationToken);
                    }
                }

                if (form.ContainsKey("roles"))
                {
                    var roles = form["roles"].ToString().Split(char.Parse(","));

                    if (roles.Any())
                    {
                        await _personnelRolesService.SetRolesForUserAsync(DepartmentId, model.UserId, roles, cancellationToken);
                    }
                }

                if (savedProfile.HomeAddressId.HasValue)
                {
                    homeAddress = await _addressService.GetAddressByIdAsync(savedProfile.HomeAddressId.Value);
                }

                if (savedProfile.MailingAddressId.HasValue)
                {
                    mailingAddress = await _addressService.GetAddressByIdAsync(savedProfile.MailingAddressId.Value);
                }

                if (!model.MailingAddressSameAsPhysical && homeAddress != null && mailingAddress != null &&
                    (homeAddress.AddressId == mailingAddress.AddressId))
                {
                    mailingAddress = new Address();
                }

                if (!String.IsNullOrWhiteSpace(model.PhysicalAddress1))
                {
                    if (homeAddress == null)
                    {
                        homeAddress = new Address();
                    }

                    homeAddress.Address1   = model.PhysicalAddress1;
                    homeAddress.City       = model.PhysicalCity;
                    homeAddress.Country    = model.PhysicalCountry;
                    homeAddress.PostalCode = model.PhysicalPostalCode;
                    homeAddress.State      = model.PhysicalState;

                    homeAddress = await _addressService.SaveAddressAsync(homeAddress, cancellationToken);

                    savedProfile.HomeAddressId = homeAddress.AddressId;

                    if (model.MailingAddressSameAsPhysical)
                    {
                        savedProfile.MailingAddressId = homeAddress.AddressId;
                    }
                }

                if (!String.IsNullOrWhiteSpace(model.MailingAddress1) && !model.MailingAddressSameAsPhysical)
                {
                    if (mailingAddress == null)
                    {
                        mailingAddress = new Address();
                    }

                    mailingAddress.Address1   = model.MailingAddress1;
                    mailingAddress.City       = model.MailingCity;
                    mailingAddress.Country    = model.MailingCountry;
                    mailingAddress.PostalCode = model.MailingPostalCode;
                    mailingAddress.State      = model.MailingState;

                    mailingAddress = await _addressService.SaveAddressAsync(mailingAddress, cancellationToken);

                    savedProfile.MailingAddressId = mailingAddress.AddressId;
                }

                savedProfile.LastUpdated = DateTime.UtcNow;
                await _userProfileService.SaveProfileAsync(DepartmentId, savedProfile, cancellationToken);

                auditEvent.After = savedProfile.CloneJson();
                _eventAggregator.SendMessage <AuditEvent>(auditEvent);

                var depMember = await _departmentsService.GetDepartmentMemberAsync(model.UserId, DepartmentId);

                if (depMember != null)
                {
                    // Users Department Admin status changes, invalid the department object in cache.
                    if (model.IsDepartmentAdmin != depMember.IsAdmin)
                    {
                        _departmentsService.InvalidateDepartmentInCache(depMember.DepartmentId);
                    }

                    depMember.IsAdmin    = model.IsDepartmentAdmin;
                    depMember.IsDisabled = model.IsDisabled;
                    depMember.IsHidden   = model.IsHidden;

                    await _departmentsService.SaveDepartmentMemberAsync(depMember, cancellationToken);
                }

                if (!model.Profile.DoNotRecieveNewsletters)
                {
                    Unsubscribe(model.Email);
                }

                //var membershipUser = Membership.GetUser(model.UserId);
                //membershipUser.Email = model.Email;
                //Membership.UpdateUser(membershipUser);

                _usersService.UpdateEmail(model.User.Id, model.Email);

                if (model.IsOwnProfile)
                {
                    // Change Password
                    if (!string.IsNullOrEmpty(model.OldPassword) && !string.IsNullOrEmpty(model.NewPassword))
                    {
                        var identityUser = await _userManager.FindByIdAsync(model.User.Id);

                        var result = await _userManager.ChangePasswordAsync(identityUser, model.OldPassword, model.NewPassword);
                    }

                    if (!string.IsNullOrWhiteSpace(model.NewUsername))
                    {
                        _usersService.UpdateUsername(model.User.UserName, model.NewUsername);
                    }
                }

                _userProfileService.ClearUserProfileFromCache(model.UserId);
                _userProfileService.ClearAllUserProfilesFromCache(model.Department.DepartmentId);
                _departmentsService.InvalidateDepartmentUsersInCache(model.Department.DepartmentId);
                _departmentsService.InvalidatePersonnelNamesInCache(DepartmentId);
                _departmentsService.InvalidateDepartmentMembers();
                _usersService.ClearCacheForDepartment(DepartmentId);

                return(RedirectToAction("Index", "Personnel", new { area = "User" }));
            }

            // If we got this far, something failed, redisplay form
            return(View(model));
        }