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)); }
public ActionResult Upsert(GroupUpsertModel model) { if (ModelState.IsValid) { try { using (var client = restApiService.GetClient()) { // read all cagegories from api to map selected ones. The api needs all properties, not only ids!!! var all = restApiService.GetRequest <List <Category> >(client, "tags"); var groupDto = Mapper.Map <GroupDTO>(model); groupDto.DefaultCategory = model.DefaultCategory != null ? all.Single(item => item.Id.Equals(model.DefaultCategory.Id)) : null; groupDto.AllowedCategories = all.Where( item => model.SelectedAllowedCategories.IsNotNullOrEmpty() && model.SelectedAllowedCategories.Contains(item.Id.Value)); var json = SerializeGroupDTOToJson(groupDto); restApiService.PutRequest( client, model.GeoNetworkId.HasValue ? $"groups/{model.GeoNetworkId}" : "groups", new StringContent(json, Encoding.UTF8, "application/json")); var geoNetworkGroup = restApiService.GetRequest <List <GroupDTO> >(client, "groups") ?.Single( item => item.Name == model.Names.GetValueForCurrentCulture()); model.GeoNetworkId = Convert.ToInt64(geoNetworkGroup.Id); InitLabels(geoNetworkGroup, model); json = SerializeGroupDTOToJson(geoNetworkGroup); restApiService.PutRequest( client, $"groups/{model.GeoNetworkId}", new StringContent(json, Encoding.UTF8, "application/json")); } var group = Mapper.Map <Group>(model); using (var transaction = ContextManager.NewTransaction()) { groupService.Upsert(group); transaction.Commit(); } this.ShowMessage(MessageType.Success, Resource.ChangesSuccessfullySaved); return(RedirectToAction("Index", new { group.Id })); } catch (Exception e) { Logger.Error(e); ModelState.AddModelError(string.Empty, e is UserException userException ? userException.Message : Resource.InternalServerError); } } this.InitAdminBreadcrumb( Title, string.Format( model.Id.HasValue ? string.Format(Resource.Editing, model.Names.GetValueForCurrentCulture()) : string.Format(Resource.Creating, Resource.Organization.ToLower())), true); return(Request.IsAjaxRequest() ? PartialView(model) as ActionResult : View(model)); }