diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/EditProjectMembersBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/EditProjectMembersBean.java new file mode 100644 index 0000000000000000000000000000000000000000..eea618bccfa31647c518bde4fb4d8b57810cd64c --- /dev/null +++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/EditProjectMembersBean.java @@ -0,0 +1,123 @@ +/******************************************************************************* + * Copyright (c) 2014 Michael Simon. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Haykuhi Musheghyan - initial + ******************************************************************************/ +package edu.kit.scc.webreg.bean.admin.project; + +import static edu.kit.scc.webreg.dao.ops.RqlExpressions.equal; +import static edu.kit.scc.webreg.entity.UserEntity_.userStatus; +import static edu.kit.scc.webreg.entity.UserStatus.ACTIVE; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.primefaces.model.LazyDataModel; + +import edu.kit.scc.webreg.entity.UserEntity; +import edu.kit.scc.webreg.entity.project.ExternalOidcProjectEntity; +import edu.kit.scc.webreg.entity.project.LocalProjectEntity; +import edu.kit.scc.webreg.entity.project.ProjectEntity; +import edu.kit.scc.webreg.entity.project.ProjectMembershipEntity; +import edu.kit.scc.webreg.entity.project.ProjectMembershipType; +import edu.kit.scc.webreg.model.GenericLazyDataModelImpl; +import edu.kit.scc.webreg.service.UserService; +import edu.kit.scc.webreg.service.project.ProjectService; +import edu.kit.scc.webreg.session.SessionManager; +import edu.kit.scc.webreg.util.LoadFromAppConfig; +import jakarta.faces.event.ComponentSystemEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import lombok.Getter; +import lombok.Setter; + +@Named +@ViewScoped +public class EditProjectMembersBean implements Serializable { + + private static final long serialVersionUID = 1L; + + @Inject + private SessionManager session; + + @Inject + private ProjectService projectService; + + @Inject + private UserService userService; + + @Inject + private LoadFromAppConfig config; + + @Getter + @Setter + private ProjectEntity entity; + + private List<ProjectMembershipEntity> membersList; + + private LazyDataModel<UserEntity> allUserList; + + @Getter + @Setter + private Long projectId; + + public void preRenderView(ComponentSystemEvent ev) { + if (entity == null) { + entity = projectService.fetch(projectId); + } + } + + public void addMember(UserEntity user) { + + ProjectMembershipEntity isMember = projectService.findByIdentityAndProject(user.getIdentity(), getEntity()); + + if (isMember == null) { + + ProjectMembershipEntity pme = new ProjectMembershipEntity(); + pme.setMembershipType(ProjectMembershipType.MEMBER); + + config.getMemberShipValdity().ifPresent(validity -> pme + .setMembershipValidity(new Date(System.currentTimeMillis() + validity))); + + projectService.addProjectMember(getEntity(), user.getIdentity(), pme, "idty-" + user.getIdentity().getId()); + + } + + membersList = null; + } + + public String cancel() { + if (entity instanceof ExternalOidcProjectEntity) + return "show-external-oidc-project.xhtml?faces-redirect=true&id=" + entity.getId(); + else if (entity instanceof LocalProjectEntity) + return "show-local-project.xhtml?faces-redirect=true&id=" + entity.getId(); + else + return ""; + } + + public List<ProjectMembershipEntity> getMembersList() { + if (membersList == null) { + membersList = projectService.findMembersForProject(getEntity()); + } + return membersList; + } + + public LazyDataModel<UserEntity> getAllUserList() { + if (allUserList == null) { + allUserList = new GenericLazyDataModelImpl<UserEntity, UserService>(userService, equal(userStatus, ACTIVE)); + } + return allUserList; + } + + public void deleteProjectMembership(ProjectMembershipEntity pme) { + projectService.removeProjectMember(pme, "idty-" + pme.getIdentity().getId()); + } + +} diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/ShowLocalProjectBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/ShowLocalProjectBean.java index 0119dbfca29e2419747abad51a089a312639ffe2..c0dc95c7d3179c7ea404bc67682050cde9681634 100644 --- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/ShowLocalProjectBean.java +++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/ShowLocalProjectBean.java @@ -24,6 +24,8 @@ import jakarta.faces.event.ComponentSystemEvent; import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; +import lombok.Getter; +import lombok.Setter; @Named("admin.showLocalProjectBean") @ViewScoped @@ -40,23 +42,20 @@ public class ShowLocalProjectBean implements Serializable { @Inject private SessionManager session; + @Setter private LocalProjectEntity entity; + private List<ProjectMembershipEntity> memberList; + private List<ProjectIdentityAdminEntity> adminList; + @Getter + @Setter private Long id; public void preRenderView(ComponentSystemEvent ev) { } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - public void syncAllMembersToGroup() { projectService.syncAllMembersToGroup(getEntity(), "idty-" + session.getIdentityId()); } @@ -73,10 +72,6 @@ public class ShowLocalProjectBean implements Serializable { return entity; } - public void setEntity(LocalProjectEntity entity) { - this.entity = entity; - } - public List<ProjectMembershipEntity> getMemberList() { if (memberList == null) { memberList = projectService.findMembersForProject(getEntity()); diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserProjectCreateNewBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserProjectCreateNewBean.java index b7db8a5b05d9ee20299e93215de00b14fd46a430..ff8ad89520715283e4ceb968461f6f29d416b419 100644 --- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserProjectCreateNewBean.java +++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserProjectCreateNewBean.java @@ -107,10 +107,8 @@ public class UserProjectCreateNewBean implements Serializable { } - if (config.getProjectValdity() != 0L) - entity.setProjectValidity(new Date(System.currentTimeMillis() + config.getProjectValdity())); - else - entity.setProjectValidity(null); + config.getProjectValdity() + .ifPresent(validity -> entity.setProjectValidity(new Date(System.currentTimeMillis() + validity))); entity = localProjectService.save(entity, getIdentity().getId()); @@ -124,10 +122,8 @@ public class UserProjectCreateNewBean implements Serializable { ProjectMembershipEntity pme = new ProjectMembershipEntity(); pme.setMembershipType(ProjectMembershipType.MEMBER); - if (config.getMemberShipValdity() != 0L) - pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity())); - else - pme.setMembershipValidity(null); + config.getMemberShipValdity() + .ifPresent(validity -> pme.setMembershipValidity(new Date(System.currentTimeMillis() + validity))); projectService.addProjectMember(entity, getIdentity(), pme, "idty-" + getIdentity().getId()); messageGenerator.addResolvedInfoMessage("success", "project.local_project.create_edit_name_add_member", diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowLocalProjectBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowLocalProjectBean.java index 080b6b1b3cfd9d46a0ac426a886694c131a34c7a..fea6084f4de1a001b3ebebb5983fe20d3ab2ecdc 100644 --- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowLocalProjectBean.java +++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowLocalProjectBean.java @@ -119,10 +119,8 @@ public class UserShowLocalProjectBean implements Serializable { pme.setReasonToApproveDenyMembership(getApplyReason()); pme.setMembershipType(ProjectMembershipType.MEMBER); - if (config.getMemberShipValdity() != 0L) - pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity())); - else - pme.setMembershipValidity(null); + config.getMemberShipValdity().ifPresent(validity -> pme + .setMembershipValidity(new Date(System.currentTimeMillis() + validity))); projectService.updateProjectMemberStatus(pme, "idty-" + session.getIdentityId()); } @@ -147,10 +145,8 @@ public class UserShowLocalProjectBean implements Serializable { pme.setReasonToApproveDenyMembership(declineReason); pme.setMembershipType(ProjectMembershipType.NOTMEMBER); - if (config.getMemberShipValdity() != 0L) - pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity())); - else - pme.setMembershipValidity(null); + config.getMemberShipValdity().ifPresent(validity -> pme + .setMembershipValidity(new Date(System.currentTimeMillis() + validity))); projectService.updateProjectMemberStatus(pme, "idty-" + session.getIdentityId()); } diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowPublicProjectBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowPublicProjectBean.java index 1010927f0fc21bce2fc07a2ad187ae30158061cb..57b3d02c2584a235d929364054d74c063f260de1 100644 --- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowPublicProjectBean.java +++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowPublicProjectBean.java @@ -114,10 +114,8 @@ public class UserShowPublicProjectBean implements Serializable { pme.setReasonToApplyForMembership(reason); pme.setMembershipType(ProjectMembershipType.APPLICANT); - if (config.getMemberShipValdity() != 0L) - pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity())); - else - pme.setMembershipValidity(null); + config.getMemberShipValdity().ifPresent(validity -> pme + .setMembershipValidity(new Date(System.currentTimeMillis() + validity))); projectService.addProjectMember(entity, identity, pme, "idty-" + session.getIdentityId()); messageGenerator.addResolvedInfoMessage("project.public_project.apply", @@ -129,10 +127,8 @@ public class UserShowPublicProjectBean implements Serializable { isMember.setReasonToApplyForMembership(reason); isMember.setMembershipType(ProjectMembershipType.APPLICANT); - if (config.getMemberShipValdity() != 0L) - isMember.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity())); - else - isMember.setMembershipValidity(null); + config.getMemberShipValdity().ifPresent(validity -> isMember + .setMembershipValidity(new Date(System.currentTimeMillis() + validity))); projectService.updateProjectMemberStatus(isMember, "idty-" + session.getIdentityId()); messageGenerator.addResolvedInfoMessage("project.public_project.apply", diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserSubprojectCreateNewBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserSubprojectCreateNewBean.java index f6e77afc463c658b5ec031943f380003f36b8357..15bc1c38f0b42b9ad778b3e5ed176c4fc67de75f 100644 --- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserSubprojectCreateNewBean.java +++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserSubprojectCreateNewBean.java @@ -39,8 +39,8 @@ import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.persistence.Column; -import edu.kit.scc.webreg.util.LoadFromAppConfig; - +import lombok.Getter; +import lombok.Setter; @Named @ViewScoped @@ -56,13 +56,13 @@ public class UserSubprojectCreateNewBean implements Serializable { @Inject private ProjectService projectService; - + @Inject private IdentityService identityService; - + @Inject private LoadFromAppConfig config; - + @Inject private FacesMessageGenerator messageGenerator; @@ -70,17 +70,20 @@ public class UserSubprojectCreateNewBean implements Serializable { private LocalProjectEntity entity; private Boolean selfMember; + + @Getter + @Setter private Long parentId; private LocalProjectEntity parentProject; - + private ProjectIdentityAdminEntity adminIdentity; private List<ProjectIdentityAdminEntity> adminList; - + public void preRenderView(ComponentSystemEvent ev) { - if (! getParentProject().getSubProjectsAllowed()) { + if (!getParentProject().getSubProjectsAllowed()) { throw new NotAuthorizedException("Subpropjects are not allowed for this project"); } - + for (ProjectIdentityAdminEntity a : getAdminList()) { if (a.getIdentity().getId().equals(session.getIdentityId())) { adminIdentity = a; @@ -91,7 +94,7 @@ public class UserSubprojectCreateNewBean implements Serializable { if (adminIdentity == null) { throw new NotAuthorizedException("Not authorized"); } else { - if (! adminIdentity.getType().equals(ProjectAdminType.OWNER)) { + if (!adminIdentity.getType().equals(ProjectAdminType.OWNER)) { throw new NotAuthorizedException("Not authorized. You need Owner rights on the parent project."); } } @@ -116,16 +119,19 @@ public class UserSubprojectCreateNewBean implements Serializable { messageGenerator.addErrorMessage("Ein Fehler ist aufgetreten", e.toString()); return; } - + if (entity.getName().length() > projectEntityDbColumnAnnotation.length()) { - messageGenerator.addResolvedErrorMessage("failure", "project.local_project.create_edit_name_length_details", true); + messageGenerator.addResolvedErrorMessage("failure", "project.local_project.create_edit_name_length_details", + true); return; } - - Number existingProjectShortNames = localProjectService.countAll(equal(LocalProjectEntity_.shortName, entity.getShortName())); - Number existingProjectGroupNames = localProjectService.countAll(equal(LocalProjectEntity_.groupName, entity.getGroupName())); - - if (existingProjectShortNames.intValue() > 0 || existingProjectGroupNames.intValue() > 0 ) { + + Number existingProjectShortNames = localProjectService + .countAll(equal(LocalProjectEntity_.shortName, entity.getShortName())); + Number existingProjectGroupNames = localProjectService + .countAll(equal(LocalProjectEntity_.groupName, entity.getGroupName())); + + if (existingProjectShortNames.intValue() > 0 || existingProjectGroupNames.intValue() > 0) { messageGenerator.addResolvedErrorMessage("failure", "project.local_project.create_edit_name_unique_details", true); return; @@ -133,12 +139,10 @@ public class UserSubprojectCreateNewBean implements Serializable { } entity.setParentProject(getParentProject()); - - if (config.getProjectValdity() != 0L) - entity.setProjectValidity(new Date(System.currentTimeMillis() + config.getProjectValdity())); - else - entity.setProjectValidity(null); - + + config.getProjectValdity() + .ifPresent(validity -> entity.setProjectValidity(new Date(System.currentTimeMillis() + validity))); + entity = localProjectService.save(entity, getIdentity().getId()); if (entity != null) { @@ -147,28 +151,26 @@ public class UserSubprojectCreateNewBean implements Serializable { } if (getSelfMember()) { - + ProjectMembershipEntity pme = new ProjectMembershipEntity(); pme.setMembershipType(ProjectMembershipType.MEMBER); - - if (config.getMemberShipValdity() != 0L) - pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity())); - else - pme.setMembershipValidity(null); - + + config.getMemberShipValdity() + .ifPresent(validity -> pme.setMembershipValidity(new Date(System.currentTimeMillis() + validity))); + projectService.addProjectMember(entity, getIdentity(), pme, "idty-" + getIdentity().getId()); messageGenerator.addResolvedInfoMessage("success", "project.local_project.create_edit_name_add_member", true); } try { - FacesContext.getCurrentInstance().getExternalContext().redirect(ViewIds.PROJECT_LOCAL_SHOW + "?id=" + entity.getId()); + FacesContext.getCurrentInstance().getExternalContext() + .redirect(ViewIds.PROJECT_LOCAL_SHOW + "?id=" + entity.getId()); } catch (IOException e) { messageGenerator.addErrorMessage("Ein Fehler ist aufgetreten", e.toString()); } } - public void cancel() { try { FacesContext.getCurrentInstance().getExternalContext().redirect(ViewIds.PROJECT_LOCAL_INDEX); @@ -200,21 +202,13 @@ public class UserSubprojectCreateNewBean implements Serializable { this.selfMember = selfMember; } - public Long getParentId() { - return parentId; - } - - public void setParentId(Long parentId) { - this.parentId = parentId; - } - public LocalProjectEntity getParentProject() { if (parentProject == null) { parentProject = localProjectService.fetch(getParentId()); } return parentProject; } - + public List<ProjectIdentityAdminEntity> getAdminList() { if (adminList == null) { adminList = projectService.findAdminsForProject(getParentProject()); diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/util/LoadFromAppConfig.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/util/LoadFromAppConfig.java index 116539e6f3765ea0470102c44fd604426c0c38ba..9f06595616235522080cfe37af37633736406e3e 100644 --- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/util/LoadFromAppConfig.java +++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/util/LoadFromAppConfig.java @@ -1,6 +1,7 @@ package edu.kit.scc.webreg.util; import java.io.Serializable; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -19,9 +20,13 @@ public class LoadFromAppConfig implements Serializable { @Inject private ApplicationConfig appConfig; - public long getMemberShipValdity() { + public Optional<Long> getMemberShipValdity() { String membershipValidityFromAppConfig = appConfig.getConfigValue("membership_validity"); + + if (membershipValidityFromAppConfig == null) + return Optional.empty(); + String regex = "^\\d{11}$"; Pattern pattern = Pattern.compile(regex); @@ -31,20 +36,24 @@ public class LoadFromAppConfig implements Serializable { long membershipValidityMs; try { membershipValidityMs = Long.parseLong(membershipValidityFromAppConfig); - return membershipValidityMs; + return Optional.of(membershipValidityMs); } catch (NumberFormatException e) { throw new IllegalArgumentException( "Invalid format for membership_validity in config: " + membershipValidityFromAppConfig, e); } - } else - return 0L; - + } + + return Optional.empty(); } - public long getProjectValdity() { + public Optional<Long> getProjectValdity() { String projectValidityFromAppConfig = appConfig.getConfigValue("project_validity"); + + if (projectValidityFromAppConfig == null) + return Optional.empty(); + String regex = "^\\d{11}$"; Pattern pattern = Pattern.compile(regex); @@ -54,14 +63,14 @@ public class LoadFromAppConfig implements Serializable { long projectValidityMs; try { projectValidityMs = Long.parseLong(projectValidityFromAppConfig); - return projectValidityMs; + return Optional.of(projectValidityMs); } catch (NumberFormatException e) { throw new IllegalArgumentException( "Invalid format for project_validity in config: " + projectValidityFromAppConfig, e); } } else - return 0L; + return Optional.empty(); } diff --git a/bwreg-webapp/src/main/webapp/admin/project/edit-project-members.xhtml b/bwreg-webapp/src/main/webapp/admin/project/edit-project-members.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..4ba1157575ce5d0c82adc1c2c5002f262d81fee2 --- /dev/null +++ b/bwreg-webapp/src/main/webapp/admin/project/edit-project-members.xhtml @@ -0,0 +1,161 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="jakarta.faces.core" + xmlns:h="jakarta.faces.html" xmlns:ui="jakarta.faces.facelets" + xmlns:bw="http://www.scc.kit.edu/bwfacelets" + xmlns:p="http://primefaces.org/ui" + xmlns:of="http://omnifaces.org/functions"> +<head> +<title></title> +</head> +<body> + <f:view> + <f:metadata> + <f:viewParam name="projectId" + value="#{editProjectMembersBean.projectId}" /> + <f:event type="jakarta.faces.event.PreRenderViewEvent" + listener="#{editProjectMembersBean.preRenderView}" /> + </f:metadata> + + <ui:composition template="/template/default-admin.xhtml"> + <ui:param name="title" value="#{messages.title}" /> + + <ui:define name="content"> + <h:form id="form" styleClass="form full fancy"> + + <h2> + <h:outputText + value="#{messages.edit_admins}: #{editProjectMembersBean.entity.name}" /> + </h2> + + <p:panelGrid id="baseData" columns="2" layout="flex" + columnClasses="col-12 md:col-3 xl:col-3, col-12 md:col-9 xl:col-9"> + + <h:outputText value="#{messages.id}:" /> + <h:outputText value="#{editProjectMembersBean.entity.id}" /> + + <h:outputText value="#{messages.name}:" /> + <h:outputText value="#{editProjectMembersBean.entity.name}" /> + + </p:panelGrid> + + <p:outputPanel id="btnPanel"> + <p:commandButton id="cancel" + action="#{editProjectMembersBean.cancel}" + value="#{messages.back}" immediate="true" icon="ui-icon-close" /> + </p:outputPanel> + + + <p:dataTable id="allUsers" var="user" + value="#{projectAdminEditProjectMembersBean.allUserList}" + paginator="true" lazy="true" rows="15"> + <p:column sortBy="#{user.id}" style="width:128px;"> + <f:facet name="header"> + <h:outputText value="#{messages.id}" /> + </f:facet> + <h:outputText value="#{user.id}" /> + </p:column> + <p:column sortBy="#{user.surName}" filterBy="#{user.surName}" + filterMatchMode="contains"> + <f:facet name="header"> + <h:outputText value="#{messages.sur_name}" /> + </f:facet> + <h:outputText value="#{user.surName}" /> + </p:column> + <p:column sortBy="#{user.givenName}" filterBy="#{user.givenName}" + filterMatchMode="contains"> + <f:facet name="header"> + <h:outputText value="#{messages.given_name}" /> + </f:facet> + <h:outputText value="#{user.givenName}" /> + </p:column> + <p:column sortBy="#{user.eppn}" filterBy="#{user.eppn}" + filterMatchMode="contains"> + <f:facet name="header"> + <h:outputText value="#{messages.eppn}" /> + </f:facet> + <h:outputText + value="#{user.eppn != null ? user.eppn : 'nicht gesetzt'}" /> + </p:column> + <p:column sortBy="#{user.userStatus}" style="width:96px;"> + <f:facet name="header"> + <h:outputText value="#{messages.status}" /> + </f:facet> + <h:outputText value="#{user.userStatus}" /> + </p:column> + <p:column> + <p:commandLink action="#{editProjectMembersBean.addMember(user)}" + value="#{messages.add}" + oncomplete="setTimeout(function(){window.location.reload();}, 200);" /> + </p:column> + </p:dataTable> + + <p:dataTable id="membersId" var="a" + value="#{editProjectMembersBean.membersList}" paginator="true" + rows="15"> + <p:column> + <f:facet name="header"> + <h:outputText value="#{messages.id}" /> + </f:facet> + <h:outputText value="#{a.identity.id}" /> + </p:column> + + <p:column sortBy="#{a.identity.generatedLocalUsername}" + filterBy="#{a.identity.generatedLocalUsername}" + filterMatchMode="contains"> + <f:facet name="header"> + <h:outputText value="#{messages.local_username}" /> + </f:facet> + <h:outputText value="#{a.identity.generatedLocalUsername}" /> + </p:column> + + <p:column sortBy="#{a.identity.prefUser.email}" + filterBy="#{a.identity.prefUser.email}" + filterMatchMode="contains"> + <f:facet name="header"> + <h:outputText value="#{messages.email_address}" /> + </f:facet> + <h:outputText value="#{a.identity.prefUser.email}" /> + </p:column> + + <p:column sortBy="#{a.identity.prefUser.eppn}" + filterBy="#{a.identity.prefUser.eppn}" filterMatchMode="contains"> + <f:facet name="header"> + <h:outputText value="#{messages.eppn}" /> + </f:facet> + <h:outputText value="#{a.identity.prefUser.eppn}" /> + </p:column> + + + <p:column sortBy="#{a.membershipType}" + filterBy="#{a.membershipType}" filterMatchMode="contains"> + <f:facet name="header"> + <h:outputText value="#{messages.type}" /> + </f:facet> + <h:outputText value="#{a.membershipType}" /> + </p:column> + + + <p:column sortBy="#{a.membershipValidity}" + filterBy="#{a.membershipValidity}" filterMatchMode="contains"> + <f:facet name="header"> + <h:outputText value="#{messages.membership_validity}" /> + </f:facet> + <h:outputText value="#{a.membershipValidity}" /> + </p:column> + + <p:column> + <p:commandLink + action="#{editProjectMembersBean.deleteProjectMembership(a)}" + value="#{messages.remove}" + oncomplete="setTimeout(function(){window.location.reload();}, 200);" /> + </p:column> + </p:dataTable> + + </h:form> + + </ui:define> + </ui:composition> + </f:view> +</body> +</html> diff --git a/bwreg-webapp/src/main/webapp/admin/project/show-local-project.xhtml b/bwreg-webapp/src/main/webapp/admin/project/show-local-project.xhtml index 71e65dc1725ae6d34e66876439b37510edd22d3e..fa721fed9dc7c689242452e70220b0c070d5fda2 100644 --- a/bwreg-webapp/src/main/webapp/admin/project/show-local-project.xhtml +++ b/bwreg-webapp/src/main/webapp/admin/project/show-local-project.xhtml @@ -147,6 +147,11 @@ <h:outputText value="#{m.identity.prefUser.eppn}" /> </p:column> </p:dataTable> + + <h:link outcome="edit-project-members.xhtml" value="#{messages.edit_members}"> + <f:param name="projectId" value="#{admin.showLocalProjectBean.entity.id}"/> + </h:link> + </p:panel> <p:panel header="#{messages.tools}"> diff --git a/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/ExternalOidcProjectUpdater.java b/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/ExternalOidcProjectUpdater.java index ddedb6e228f58a162d83059d1ef99cd7f8bac5a2..31bc001845bd0b3a226da066542a3899a7e52b81 100644 --- a/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/ExternalOidcProjectUpdater.java +++ b/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/ExternalOidcProjectUpdater.java @@ -1,6 +1,7 @@ package edu.kit.scc.webreg.service.project; import java.util.Date; +import java.util.Optional; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -61,8 +62,9 @@ public class ExternalOidcProjectUpdater extends AbstractProjectUpdater<ExternalO ProjectMembershipEntity pme = new ProjectMembershipEntity(); pme.setMembershipType(ProjectMembershipType.MEMBER); - pme.setMembershipValidity(getMemberShipValdity()); + getMemberShipValdity().ifPresent(validity -> pme.setMembershipValidity(validity)); + dao.addMemberToProject(project, user.getIdentity(), pme); } @@ -71,9 +73,13 @@ public class ExternalOidcProjectUpdater extends AbstractProjectUpdater<ExternalO } - public Date getMemberShipValdity() { + public Optional<Date> getMemberShipValdity() { String membershipValidityFromAppConfig = appConfig.getConfigValue("membership_validity"); + + if (membershipValidityFromAppConfig == null) + return Optional.empty(); + String regex = "^\\d{11}$"; Pattern pattern = Pattern.compile(regex); @@ -83,14 +89,14 @@ public class ExternalOidcProjectUpdater extends AbstractProjectUpdater<ExternalO long membershipValidityMs; try { membershipValidityMs = Long.parseLong(membershipValidityFromAppConfig); - return (new Date(System.currentTimeMillis() + membershipValidityMs)); + return Optional.of(new Date(System.currentTimeMillis() + membershipValidityMs)); } catch (NumberFormatException e) { throw new IllegalArgumentException( "Invalid format for membership_validity in config: " + membershipValidityFromAppConfig, e); } } else - return null; + return Optional.empty(); }