diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java index d5fb2a705..7a367f70f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java @@ -7,8 +7,10 @@ import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.utilities.helpers.StreamDistinctBy; import eu.eudat.models.data.invitation.Invitation; +import eu.eudat.models.data.invitation.Properties; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.userinfo.UserInfoInvitationModel; +import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -76,29 +78,45 @@ public class InvitationsManager { if (invitation == null) throw new UnauthorisedException("There is no Data Management Plan assigned to this Link"); if (invitation.getAcceptedInvitation()) throw new UnauthorisedException("This Url Has Expired"); - UserInfo invitedUser = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); - UserDMP userDMP = new UserDMP(); - userDMP.setUser(invitedUser); - userDMP.setDmp(invitation.getDmp()); - JAXBContext context = JAXBContext.newInstance(HashMap.class); + JAXBContext context = JAXBContext.newInstance(Properties.class); Unmarshaller unmarshaller = context.createUnmarshaller(); - Map properties = (Map) unmarshaller.unmarshal(new StringReader(invitation.getProperties())); - if (properties.get("role") != null) { - userDMP.setRole((Integer) properties.get("role")); + Properties properties = (Properties) unmarshaller.unmarshal(new StringReader(invitation.getProperties())); + UserInfo invitedUser = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + QueryableList userDMPQueryableList = apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where(((builder, root) -> builder.and(builder.equal(root.get("dmp").get("id"), invitation.getDmp().getId()), builder.equal(root.get("user").get("id"), invitation.getUser().getId())))); + UserDMP existingUserDMP = userDMPQueryableList.getSingleOrDefault(); + if (existingUserDMP != null) { + if (properties.getRole() != null && existingUserDMP.getRole() > properties.getRole()) { + existingUserDMP.setRole(properties.getRole()); + DMP datamanagementPlan = invitation.getDmp(); + apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(existingUserDMP); + apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), existingUserDMP, datamanagementPlan); + invitation.setAcceptedInvitation(true); + apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().createOrUpdate(invitation); + return datamanagementPlan.getId(); + } } else { - userDMP.setRole(UserDMP.UserDMPRoles.USER.getValue()); - } + UserDMP userDMP = new UserDMP(); + userDMP.setUser(invitedUser); + userDMP.setDmp(invitation.getDmp()); + + if (properties.getRole() != null) { + userDMP.setRole(properties.getRole()); + } else { + userDMP.setRole(UserDMP.UserDMPRoles.USER.getValue()); + } /*if (!apiContext.getOperationsContext().getDatabaseRepository().getUserAssociationDao().areAssociated(invitedUser, invitation.getUser())) { UserAssociation userAssociation = new UserAssociation(); userAssociation.setFirstUser(invitedUser); userAssociation.setSecondUser(invitation.getUser()); apiContext.getOperationsContext().getDatabaseRepository().getUserAssociationDao().createOrUpdate(userAssociation); }*/ - DMP datamanagementPlan = invitation.getDmp(); - apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); - apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), userDMP, datamanagementPlan); - invitation.setAcceptedInvitation(true); - apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().createOrUpdate(invitation); - return datamanagementPlan.getId(); + DMP datamanagementPlan = invitation.getDmp(); + apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); + apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), userDMP, datamanagementPlan); + invitation.setAcceptedInvitation(true); + apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().createOrUpdate(invitation); + return datamanagementPlan.getId(); + } + return invitation.getDmp().getId(); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java index 52192a829..d2d893470 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.entities.InvitationDao; import eu.eudat.data.entities.DMP; import eu.eudat.data.entities.Invitation; import eu.eudat.data.entities.UserDMP; +import eu.eudat.models.data.invitation.Properties; import eu.eudat.models.data.mail.SimpleMail; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,6 +15,9 @@ import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import javax.mail.MessagingException; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Marshaller; +import java.io.StringWriter; import java.util.List; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -55,8 +59,17 @@ public class InvitationServiceImpl implements InvitationService { invitation.setUser(creator); invitation.setToken(UUID.randomUUID()); invitation.setAcceptedInvitation(false); - invitation.setProperties(""); - invitation.setProperties(invitation.getProperties() + "\n" +"" + role + ""); + Properties properties = new Properties(); + properties.setRole(role); + try { + JAXBContext context = JAXBContext.newInstance(Properties.class); + Marshaller marshaller = context.createMarshaller(); + StringWriter propertyWriter = new StringWriter(); + marshaller.marshal(properties, propertyWriter); + invitation.setProperties(propertyWriter.toString()); + }catch (Exception e) { + logger.error(e.getMessage(), e); + } invitationDao.createOrUpdate(invitation); sendInvitationAsync(dmp, invitation, userInfo.getName(), mailService, role); } @@ -66,8 +79,8 @@ public class InvitationServiceImpl implements InvitationService { public CompletableFuture sendInvitationAsync(DMP dmp, Invitation invitation, String recipient, MailService mailService, Integer role) { return CompletableFuture.runAsync(() -> { SimpleMail mail = new SimpleMail(); - mail.setSubject(createSubject(dmp, mailService.getMailTemplateSubject(), role)); - mail.setContent(createContent(invitation.getId(), dmp, recipient, mailService.getMailTemplateContent("classpath:templates/email/email.html"))); + mail.setSubject(createSubject(dmp, mailService.getMailTemplateSubject())); + mail.setContent(createContent(invitation.getId(), dmp, recipient, mailService.getMailTemplateContent("classpath:templates/email/email.html"), role)); mail.setTo(invitation.getInvitationEmail()); try { mailService.sendSimpleMail(mail); @@ -77,17 +90,17 @@ public class InvitationServiceImpl implements InvitationService { }); } - private String createSubject(DMP dmp, String templateSubject, Integer role) { + private String createSubject(DMP dmp, String templateSubject) { String subject = templateSubject.replace("{dmpname}", dmp.getLabel()); - subject = subject.replace("{dmprole}", UserDMP.UserDMPRoles.fromInteger(role).name()); return subject; } - private String createContent(UUID invitationID, DMP dmp, String recipient, String templateContent) { + private String createContent(UUID invitationID, DMP dmp, String recipient, String templateContent, Integer role) { String content = templateContent.replace("{dmpname}", dmp.getLabel()); content = content.replace("{invitationID}", invitationID.toString()); content = content.replace("{recipient}", recipient); content = content.replace("{host}", this.environment.getProperty("dmp.domain")); + content = content.replace("{dmprole}", UserDMP.UserDMPRoles.fromInteger(role).name()); return content; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/invitation/Properties.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/invitation/Properties.java new file mode 100644 index 000000000..f01def7f9 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/invitation/Properties.java @@ -0,0 +1,18 @@ +package eu.eudat.models.data.invitation; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class Properties { + + private Integer role; + + @XmlElement(name = "role") + public Integer getRole() { + return role; + } + public void setRole(Integer role) { + this.role = role; + } +}