From c97a0ebe33978514ddf8b2b8c3dc8826e8b17ea6 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Thu, 15 Oct 2020 19:58:11 +0200 Subject: [PATCH] Additional forms and controller methods for groups Former-commit-id: 2ba4536968329e5727aa312c65daaa35dd401464 --- .../usersgroupsroles/GroupDetailsModel.java | 59 ++++++- .../usersgroupsroles/GroupFormController.java | 149 ++++++++++++++++++ .../usersgroupsroles/GroupUserFormEntry.java | 70 ++++++++ .../usersgroupsroles/GroupsController.java | 118 +++++++++++++- ...ormEntry.java => PartyRolesFormEntry.java} | 2 +- .../usersgroupsroles/UserDetailsModel.java | 6 +- .../usersgroupsroles/UsersController.java | 4 +- .../users-groups-roles/group-details.xhtml | 108 +++++++++++++ .../users-groups-roles/group-not-found.xhtml | 40 +++++ .../ui/admin/users-groups-roles/groups.xhtml | 2 +- .../users-groups-roles/user-details.xhtml | 2 +- .../org/libreccm/ui/AdminBundle.properties | 9 ++ .../org/libreccm/ui/AdminBundle_de.properties | 9 ++ 13 files changed, 565 insertions(+), 13 deletions(-) create mode 100644 ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupFormController.java create mode 100644 ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserFormEntry.java rename ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/{UserRolesFormEntry.java => PartyRolesFormEntry.java} (98%) create mode 100644 ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-not-found.xhtml diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java index 03d60a62a..b2831bb87 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java @@ -20,7 +20,11 @@ package org.libreccm.ui.admin.usersgroupsroles; import org.libreccm.security.Group; import org.libreccm.security.GroupMembership; +import org.libreccm.security.Role; import org.libreccm.security.RoleMembership; +import org.libreccm.security.RoleRepository; +import org.libreccm.security.User; +import org.libreccm.security.UserRepository; import org.libreccm.ui.Message; import java.util.ArrayList; @@ -30,6 +34,7 @@ import java.util.Objects; import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; import javax.inject.Named; import javax.transaction.Transactional; @@ -41,6 +46,12 @@ import javax.transaction.Transactional; @RequestScoped @Named("GroupDetailsModel") public class GroupDetailsModel { + + @Inject + private RoleRepository roleRepository; + + @Inject + private UserRepository userRepository; private long groupId; @@ -85,7 +96,23 @@ public class GroupDetailsModel { public List getRoles() { return Collections.unmodifiableList(roles); } - + + public List getGroupMemberFormEntries() { + return userRepository + .findAll() + .stream() + .map(this::buildGroupUserFormEntry) + .collect(Collectors.toList()); + } + + public List getGroupRolesFormEntries() { + return roleRepository + .findAll() + .stream() + .map(this::buildGroupRolesFormEntry) + .collect(Collectors.toList()); + } + @Transactional(Transactional.TxType.REQUIRED) protected void setGroup(final Group group) { Objects.requireNonNull(group); @@ -112,5 +139,35 @@ public class GroupDetailsModel { public boolean isNewGroup() { return groupId == 0; } + + private GroupUserFormEntry buildGroupUserFormEntry(final User user) { + final GroupUserFormEntry entry = new GroupUserFormEntry(); + entry.setUserId(user.getPartyId()); + entry.setUserName(user.getName()); + entry.setUserUuid(user.getUuid()); + entry.setMember( + members + .stream() + .anyMatch( + membership -> membership.getUserUuid().equals(user.getUuid()) + ) + ); + return entry; + } + + private PartyRolesFormEntry buildGroupRolesFormEntry(final Role role) { + final PartyRolesFormEntry entry = new PartyRolesFormEntry(); + entry.setRoleId(role.getRoleId()); + entry.setRoleName(role.getName()); + entry.setRoleUuid(role.getUuid()); + entry.setMember( + roles + .stream() + .anyMatch( + membership -> membership.getRoleUuid().equals(role.getUuid()) + ) + ); + return entry; + } } diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupFormController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupFormController.java new file mode 100644 index 000000000..5318a5c85 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupFormController.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2020 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.ui.admin.usersgroupsroles; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.core.CoreConstants; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.Group; +import org.libreccm.security.GroupManager; +import org.libreccm.security.GroupRepository; +import org.libreccm.security.RequiresPrivilege; +import org.libreccm.ui.admin.AdminMessages; + +import java.util.Arrays; +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.mvc.MvcContext; +import javax.mvc.binding.BindingResult; +import javax.mvc.binding.MvcBinding; +import javax.transaction.Transactional; +import javax.validation.constraints.NotBlank; +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@Controller +@Path("/users-groups-roles/groups/") +@RequestScoped +public class GroupFormController { + + @Inject + private AdminMessages adminMessages; + + @Inject + private BindingResult bindingResult; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Inject + private MvcContext mvc; + + @Inject + private GroupManager groupManager; + + @Inject + private GroupRepository groupRepository; + + @MvcBinding + @FormParam("groupName") + @NotBlank + private String groupName; + + @POST + @Path("/new") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String createGroup() { + if (bindingResult.isFailed()) { + models.put("errors", bindingResult.getAllMessages()); + return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; + } + + final Group group = new Group(); + group.setName(groupName); + groupRepository.save(group); + + return "redirect:users-groups-roles/groups"; + } + + @POST + @Path("{groupIdentifier}/edit") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String updateUser( + @PathParam("groupIdentifier") final String groupIdentifierParam + ) { + if (bindingResult.isFailed()) { + models.put("errors", bindingResult.getAllMessages()); + return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; + } + + final Identifier identifier = identifierParser.parseIdentifier( + groupIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = groupRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = groupRepository.findByUuid(identifier.getIdentifier()); + break; + default: + result = groupRepository.findByName(identifier.getIdentifier()); + break; + } + + if (result.isPresent()) { + final Group group = result.get(); + group.setName(groupName); + + groupRepository.save(group); + return "redirect:users-groups-roles/groups"; + } else { + models.put("errors", Arrays.asList( + adminMessages.getMessage( + "usersgroupsroles.groups.not_found.message", + Arrays.asList(groupIdentifierParam) + ) + )); + return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; + } + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserFormEntry.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserFormEntry.java new file mode 100644 index 000000000..022dad62d --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserFormEntry.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.ui.admin.usersgroupsroles; + +/** + * + * @author Jens Pelzetter + */ +public class GroupUserFormEntry { + + private long userId; + + private String userUuid; + + private String userName; + + private boolean member; + + public long getUserId() { + return userId; + } + + public void setUserId(final long userId) { + this.userId = userId; + } + + public String getUserUuid() { + return userUuid; + } + + public void setUserUuid(final String userUuid) { + this.userUuid = userUuid; + } + + public String getUserName() { + return userName; + } + + public void setUserName(final String userName) { + this.userName = userName; + } + + public boolean isMember() { + return member; + } + + public void setMember(final boolean member) { + this.member = member; + } + + + + +} diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupsController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupsController.java index 9c98bf7e1..060853ca4 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupsController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupsController.java @@ -18,20 +18,29 @@ */ package org.libreccm.ui.admin.usersgroupsroles; +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; import org.libreccm.core.CoreConstants; import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.Group; import org.libreccm.security.GroupRepository; import org.libreccm.security.RequiresPrivilege; +import org.libreccm.ui.Message; +import org.libreccm.ui.MessageType; +import org.libreccm.ui.admin.AdminMessages; +import java.util.Arrays; import java.util.List; +import java.util.Optional; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.mvc.Controller; import javax.mvc.Models; +import javax.transaction.Transactional; import javax.ws.rs.GET; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; /** * @@ -41,10 +50,19 @@ import javax.ws.rs.Path; @Controller @Path("/users-groups-roles/groups") public class GroupsController { - + + @Inject + private AdminMessages adminMessages; + + @Inject + private GroupDetailsModel groupDetailsModel; + @Inject private GroupRepository groupRepository; - + + @Inject + private IdentifierParser identifierParser; + @Inject private Models models; @@ -55,8 +73,102 @@ public class GroupsController { public String getGroups() { final List groups = groupRepository.findAll(); models.put("groups", groups); - + return "org/libreccm/ui/admin/users-groups-roles/groups.xhtml"; } + @GET + @Path("/{groupIdentifier}/details") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String getGroupDetails( + @PathParam("groupIdentifier") final String groupIdentifierParam + ) { + final Identifier identifier = identifierParser.parseIdentifier( + groupIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = groupRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = groupRepository.findByUuid(identifier.getIdentifier()); + break; + default: + result = groupRepository.findByName(identifier.getIdentifier()); + break; + } + + if (result.isPresent()) { + groupDetailsModel.setGroup(result.get()); + return "org/libreccm/ui/admin/users-groups-roles/group-details.xhtml"; + } else { + groupDetailsModel.addMessage( + new Message( + adminMessages.getMessage( + "usersgroupsroles.groups.not_found.message", + Arrays.asList(groupIdentifierParam) + ), + MessageType.WARNING + ) + ); + return "org/libreccm/ui/admin/users-groups-roles/group-not-found.xhtml"; + } + } + + @GET + @Path("/new") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + public String newGroup() { + return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; + } + + @GET + @Path("/{groupIdentifier}/edit") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String editGroup( + @PathParam("groupIdentifier") final String groupIdentifierParam + ) { + final Identifier identifier = identifierParser.parseIdentifier( + groupIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = groupRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = groupRepository.findByUuid(identifier.getIdentifier()); + break; + default: + result = groupRepository.findByName(identifier.getIdentifier()); + break; + } + + if (result.isPresent()) { + groupDetailsModel.setGroup(result.get()); + return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; + } else { + groupDetailsModel.addMessage( + new Message( + adminMessages.getMessage( + "usersgroupsroles.groups.not_found.message", + Arrays.asList(groupIdentifierParam) + ), + MessageType.WARNING + ) + ); + return "org/libreccm/ui/admin/users-groups-roles/group-not-found.xhtml"; + } + } + } diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserRolesFormEntry.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/PartyRolesFormEntry.java similarity index 98% rename from ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserRolesFormEntry.java rename to ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/PartyRolesFormEntry.java index 24a623aa3..82b658ef1 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserRolesFormEntry.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/PartyRolesFormEntry.java @@ -23,7 +23,7 @@ package org.libreccm.ui.admin.usersgroupsroles; * * @author Jens Pelzetter */ -public class UserRolesFormEntry { +public class PartyRolesFormEntry { private long roleId; diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java index a3a3f2c5c..78d052288 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java @@ -175,7 +175,7 @@ public class UserDetailsModel { return Collections.unmodifiableList(roles); } - public List getUserRolesFormEntries() { + public List getUserRolesFormEntries() { return roleRepository .findAll() .stream() @@ -202,8 +202,8 @@ public class UserDetailsModel { return entry; } - private UserRolesFormEntry buildUserRolesFormEntry(final Role role) { - final UserRolesFormEntry entry = new UserRolesFormEntry(); + private PartyRolesFormEntry buildUserRolesFormEntry(final Role role) { + final PartyRolesFormEntry entry = new PartyRolesFormEntry(); entry.setRoleId(role.getRoleId()); entry.setRoleName(role.getName()); entry.setRoleUuid(role.getUuid()); diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersController.java index 8ff095e33..923db04e4 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersController.java @@ -142,9 +142,7 @@ public class UsersController { @Path("/new") @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) - public String newUser( - @PathParam("userIdentifier") final String userIdentifier - ) { + public String newUser() { return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; } diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-details.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-details.xhtml index b9e9605f7..64026c3b0 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-details.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-details.xhtml @@ -121,7 +121,115 @@ + + + + + + + + + + +
+

+ #{AdminMessages['usersgroupsroles.groups.groups_details.roles.heading']} +

+ + +
+ + + + + + + + + + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-not-found.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-not-found.xhtml new file mode 100644 index 000000000..89a5ed0cc --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-not-found.xhtml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/groups.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/groups.xhtml index 7e73a4427..ba4fccce4 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/groups.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/groups.xhtml @@ -28,7 +28,7 @@ diff --git a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties index 01f32ea41..92ae688b6 100644 --- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties +++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties @@ -157,3 +157,12 @@ usersgroupsroles.groups.group_details.members.edit=Add/remove members usersgroupsroles.groups.group_details.members.dialog.title=Add/remove members usersgroupsroles.groups.group_details.members.dialog.close=Cancel usersgroupsroles.groups.group_details.members.dialog.save=Apply +usersgroupsroles.groups.group_details.members.none=This group has no members +usersgroupsroles.groups.groups_details.roles.heading=Roles +usersgroupsroles.groups.group_details.roles.edit=Edit +usersgroupsroles.groups.group_details.roles.dialog.title=Edit role memberships +usersgroupsroles.groups.group_details.roles.dialog.close=Cancel +usersgroupsroles.users.user_details.roles.dialog.save=Apply +usersgroupsroles.groups.group_details.roles.dialog.save=Apply +usersgroupsroles.groups.group_details.roles.none=No roles assigned to this group +usersgroupsroles.groups.not_found.title=Group not found diff --git a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties index f424bf9a3..457ea7df3 100644 --- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties +++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties @@ -157,3 +157,12 @@ usersgroupsroles.groups.group_details.members.edit=Mitglieder hinzuf\u00fcgen/en usersgroupsroles.groups.group_details.members.dialog.title=Mitglieder hinzuf\u00fcgen/entfernen usersgroupsroles.groups.group_details.members.dialog.close=Abbrechen usersgroupsroles.groups.group_details.members.dialog.save=Anwenden +usersgroupsroles.groups.group_details.members.none=Diese Gruppe hat keine Mitglieder +usersgroupsroles.groups.groups_details.roles.heading=Rollen +usersgroupsroles.groups.group_details.roles.edit=Bearbeiten +usersgroupsroles.groups.group_details.roles.dialog.title=Rollenmitgliedschaften bearbeiten +usersgroupsroles.groups.group_details.roles.dialog.close=Abbrechen +usersgroupsroles.users.user_details.roles.dialog.save=Anwenden +usersgroupsroles.groups.group_details.roles.dialog.save=Anwenden +usersgroupsroles.groups.group_details.roles.none=Dieser Gruppe sind keine Rollen zugeordnet +usersgroupsroles.groups.not_found.title=Gruppe nicht gefunden