private string GetProfile(UserUpsertViewModel model)
        {
            if (model.IsAdministrator)
            {
                return(Enum.GetName(
                           typeof(Inspire.Models.GeoNetwork.User.Profile),
                           Inspire.Models.GeoNetwork.User.Profile.Administrator));
            }

            if (model.Profile.Id.Equals(
                    EnumHelper.GetProfileIdByProfile(Inspire.Models.GeoNetwork.User.Profile.UserAdmin)))
            {
                return(Enum.GetName(
                           typeof(Inspire.Models.GeoNetwork.User.Profile),
                           Inspire.Models.GeoNetwork.User.Profile.UserAdmin));
            }

            if (model.Profile.Id.Equals(
                    EnumHelper.GetProfileIdByProfile(Inspire.Models.GeoNetwork.User.Profile.Reviewer)))
            {
                return(Enum.GetName(
                           typeof(Inspire.Models.GeoNetwork.User.Profile),
                           Inspire.Models.GeoNetwork.User.Profile.Reviewer));
            }

            if (model.Profile.Id.Equals(
                    EnumHelper.GetProfileIdByProfile(Inspire.Models.GeoNetwork.User.Profile.Editor)))
            {
                return(Enum.GetName(
                           typeof(Inspire.Models.GeoNetwork.User.Profile),
                           Inspire.Models.GeoNetwork.User.Profile.Editor));
            }

            if (model.Profile.Id.Equals(
                    EnumHelper.GetProfileIdByProfile(Inspire.Models.GeoNetwork.User.Profile.RegisteredUser)))
            {
                return(Enum.GetName(
                           typeof(Inspire.Models.GeoNetwork.User.Profile),
                           Inspire.Models.GeoNetwork.User.Profile.RegisteredUser));
            }

            return(Enum.GetName(
                       typeof(Inspire.Models.GeoNetwork.User.Profile),
                       Inspire.Models.GeoNetwork.User.Profile.RegisteredUser));
        }
        public ActionResult Upsert(Guid?id)
        {
            var model = new UserUpsertViewModel();

            List <Nomenclature> profiles;

            using (ContextManager.NewConnection())
            {
                ViewBag.Roles = roleService.Search(new RoleQuery {
                    UserId = User.Id
                });
                profiles = nomenclatureService.Get("nrolegnw");

                if (id.HasValue)
                {
                    model       = Mapper.Map <UserUpsertViewModel>(userService.Get(id.Value));
                    model.Roles = roleService.GetUserRoles(id.Value);
                }
            }

            //// when register user there is no geonetwork account yet
            if (model.GeoNetworkId.HasValue)
            {
                using (var client = restApiService.GetClient())
                {
                    var geoNetworkUser = restApiService.GetRequest <UserDTO>(client, $"users/{model.GeoNetworkId}");

                    model.IsAdministrator = geoNetworkUser.Profile == Enum.GetName(
                        typeof(GeoNetWorkProfile),
                        GeoNetWorkProfile.Administrator);

                    model.GeoNetworkAddress = geoNetworkUser.Addresses?.FirstOrDefault();

                    if (!model.IsAdministrator)
                    {
                        var geoNetworkUserGroups = restApiService.GetRequest <List <UserGroup> >(
                            client,
                            $"users/{model.GeoNetworkId}/groups");
                        var firstGroupId = geoNetworkUserGroups.FirstOrDefault()?.Id;

                        model.Group = new GroupForUser
                        {
                            Id = firstGroupId?.GroupId
                        };

                        model.Profile = profiles?.Single(
                            item => item.Id.Equals(
                                EnumHelper.GetProfileIdByProfile(
                                    (GeoNetWorkProfile)Enum.Parse(
                                        typeof(GeoNetWorkProfile),
                                        firstGroupId?.Profile,
                                        true))));
                    }
                }
            }

            this.InitAdminBreadcrumb(
                Title,
                string.Format(
                    model.Id.HasValue
                        ? string.Format(Resource.Editing, model.UserName)
                        : string.Format(Resource.Creating, Resource.User.ToLower())),
                true);

            return(Request.IsAjaxRequest()
                ? PartialView(model) as ActionResult
                : View(model));
        }
        public ActionResult Upsert(UserUpsertViewModel model)
        {
            var isNewUser = !model.Id.HasValue;

            if (isNewUser)
            {
                User existingUser;
                using (ContextManager.NewConnection())
                {
                    existingUser = accountService.GetByUserName(model.UserName);
                }

                if (existingUser != null)
                {
                    ModelState.AddModelError("UserName", Resource.UserNameIsAlreadyTaken);
                }
            }

            if (ModelState.IsValid)
            {
                try
                {
                    using (var client = restApiService.GetClient())
                    {
                        var json = JsonConvert.SerializeObject(
                            Mapper.Map <UserDTO>(model),
                            Formatting.None,
                            new JsonSerializerSettings
                        {
                            ContractResolver = new CamelCaseContractResolver()
                        });

                        restApiService.PutRequest(
                            client,
                            isNewUser ? "users" : $"users/{model.GeoNetworkId}",
                            new StringContent(json, Encoding.UTF8, "application/json"));

                        if (isNewUser && !model.GeoNetworkId.HasValue)
                        {
                            var geonetWorkUsers = restApiService.GetRequest <List <UserDTO> >(client, "users");
                            model.GeoNetworkId = Convert.ToInt64(
                                geonetWorkUsers?.FirstOrDefault(x => x.Username.Equals(model.UserName))?.Id);

                            if (model.GeoNetworkId <= 0)
                            {
                                throw new UserException(Resource.UserNotFound);
                            }
                        }
                    }

                    var user = Mapper.Map <User>(model);
                    using (var transaction = ContextManager.NewTransaction())
                    {
                        // set group id from our db
                        var group = groupService.Search(new GroupQueryModel {
                            Name = model.Group?.Name
                        }).FirstOrDefault();
                        user.OrganizationId = group?.Id;

                        user.Id = userService.Upsert(user);

                        userService.SetUserRoles(
                            new SetRole
                        {
                            UserId = user.Id.Value,
                            Roles  = model.Roles
                        });

                        transaction.Commit();
                    }

                    if (isNewUser)
                    {
                        userMailService.SendCompleteRegistrationEmail(user);
                    }

                    this.ShowMessage(MessageType.Success, Resource.ChangesSuccessfullySaved);
                    return(RedirectToAction("Index", new { user.Id }));
                }
                catch (UserDbException e)
                {
                    Logger.Error(e);
                    ModelState.AddModelError(string.Empty, Resource.DbErrorMessage);
                }
                catch (UserException e)
                {
                    ModelState.AddModelError(string.Empty, e.Message);
                }
            }

            using (ContextManager.NewConnection())
            {
                ViewBag.Roles = roleService.Search(new RoleQuery {
                    UserId = User.Id
                });
            }

            InitBreadcrumb(
                string.Format(
                    model.Id.HasValue
                        ? string.Format(Resource.Editing, model.UserName)
                        : string.Format(Resource.Creating, Resource.User.ToLower())));
            return(View(model));
        }