diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java index b1062c4dd..226f3b6ff 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java @@ -190,7 +190,7 @@ public class DmpServiceImpl implements DmpService { this.patchAndSaveTemplates(data.getId(), model.getDescriptionTemplates()); - if (!isUpdate || userScope.isSet()) { + if (!isUpdate && userScope.isSet()) { this.addOwner(data); if (model.getUsers() == null) model.setUsers(new ArrayList<>()); if (model.getUsers().stream().noneMatch(x-> x.getUser() != null && x.getUser().equals(this.userScope.getUserIdSafe()) && DmpUserRole.Owner.equals(x.getRole()))) model.getUsers().add(this.createOwnerPersist()); @@ -203,10 +203,7 @@ public class DmpServiceImpl implements DmpService { this.annotationEntityTouchedIntegrationEventHandler.handle(AnnotationEntityTouchedIntegrationEventHandler.buildEventFromPersistModel(model)); this.sendNotification(data); - - if (!this.conventionService.isListNullOrEmpty(model.getUsers())){ - this.inviteUserOrAssignUsers(data.getId(), model.getUsers()); - } + this.assignUsers(data.getId(), this.inviteUserOrAssignUsers(data.getId(), model.getUsers(), false), null, false); this.elasticService.persistDmp(data); @@ -566,6 +563,8 @@ public class DmpServiceImpl implements DmpService { public List assignUsers(UUID dmpId, List model, FieldSet fieldSet, boolean disableDelete) throws InvalidApplicationException, IOException { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation(dmpId)), Permission.AssignDmpUsers); + if (model == null || model.stream().noneMatch(x-> x.getUser() != null && DmpUserRole.Owner.equals(x.getRole()))) throw new MyApplicationException("At least one owner required"); + DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, dmpId); if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -576,7 +575,7 @@ public class DmpServiceImpl implements DmpService { List updatedCreatedIds = new ArrayList<>(); for (DmpUserPersist dmpUser : model) { - DmpUserEntity dmpUserEntity = existingUsers.stream().filter(x-> x.getDmpId().equals(dmpId) && x.getUserId().equals(dmpUser.getUser()) && x.getRole().equals(dmpUser.getRole())).findFirst().orElse(null); + DmpUserEntity dmpUserEntity = existingUsers.stream().filter(x-> x.getDmpId().equals(dmpId) && x.getUserId().equals(dmpUser.getUser()) && x.getRole().equals(dmpUser.getRole()) && Objects.equals(dmpUser.getSectionId(), x.getSectionId())).findFirst().orElse(null); if (dmpUserEntity == null){ dmpUserEntity = new DmpUserEntity(); dmpUserEntity.setId(UUID.randomUUID()); @@ -589,10 +588,10 @@ public class DmpServiceImpl implements DmpService { dmpUserEntity.setIsActive(IsActive.Active); this.entityManager.persist(dmpUserEntity); } - updatedCreatedIds.add(dmpUserEntity.getUserId()); + updatedCreatedIds.add(dmpUserEntity.getId()); } - List toDelete = existingUsers.stream().filter(x-> updatedCreatedIds.stream().noneMatch(y-> y.equals(x.getUserId()))).collect(Collectors.toList()); + List toDelete = existingUsers.stream().filter(x-> updatedCreatedIds.stream().noneMatch(y-> y.equals(x.getId()))).collect(Collectors.toList()); if (!toDelete.isEmpty() && !disableDelete) this.deleterFactory.deleter(DmpUserDeleter.class).delete(toDelete); this.entityManager.flush(); @@ -957,6 +956,12 @@ public class DmpServiceImpl implements DmpService { // invites public void inviteUserOrAssignUsers(UUID id, List users) throws InvalidApplicationException, JAXBException, IOException { + this.inviteUserOrAssignUsers(id, users, true); + } + + + + private List inviteUserOrAssignUsers(UUID id, List users, boolean persistUsers) throws InvalidApplicationException, JAXBException, IOException { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation(id)), Permission.InviteDmpUsers); DmpEntity dmp = this.queryFactory.query(DmpQuery.class).ids(id).first(); @@ -986,7 +991,8 @@ public class DmpServiceImpl implements DmpService { } } - if(!usersToAssign.isEmpty()) this.assignUsers(id, usersToAssign, null, true); + if(!usersToAssign.isEmpty() && persistUsers) this.assignUsers(id, usersToAssign, null, true); + return usersToAssign; } private void sendDmpInvitationExistingUser(UUID userId, DmpEntity dmp, DmpUserRole role) throws InvalidApplicationException { diff --git a/dmp-frontend/src/app/core/common/enum/dmp-version-status.ts b/dmp-frontend/src/app/core/common/enum/dmp-version-status.ts index e03a98579..df9a4dd5d 100644 --- a/dmp-frontend/src/app/core/common/enum/dmp-version-status.ts +++ b/dmp-frontend/src/app/core/common/enum/dmp-version-status.ts @@ -1,4 +1,5 @@ export enum DmpVersionStatus { Current = 0, - Previous = 1 -} \ No newline at end of file + Previous = 1, + NotFinalized = 2 +} diff --git a/dmp-frontend/src/app/core/services/description-template/description-template.service.ts b/dmp-frontend/src/app/core/services/description-template/description-template.service.ts index 33afc9b03..9b88870a5 100644 --- a/dmp-frontend/src/app/core/services/description-template/description-template.service.ts +++ b/dmp-frontend/src/app/core/services/description-template/description-template.service.ts @@ -178,7 +178,7 @@ export class DescriptionTemplateService { if (excludedGroupIds && excludedGroupIds.length > 0) { lookup.excludedGroupIds = excludedGroupIds; } lookup.isActive = [IsActive.Active]; - lookup.versionStatuses = [DescriptionTemplateVersionStatus.Current]; + lookup.versionStatuses = [DescriptionTemplateVersionStatus.Current, DescriptionTemplateVersionStatus.NotFinalized]; lookup.statuses = [DescriptionTemplateStatus.Finalized]; lookup.project = { fields: [ diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts index 54d886dfc..e22e02a69 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts @@ -179,7 +179,7 @@ export class DmpEditorComponent extends BaseEditor implemen this.selectedBlueprint = data?.blueprint; this.isDeleted = data ? data.isActive === IsActive.Inactive : false; - if (data) { + if (data && data.id) { const descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = { dmpId: data.id, sectionIds: data?.blueprint?.definition?.sections?.map(x => x.id), diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index d625b4566..fe506000d 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -103,7 +103,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit { //IBr this.lookup.groupIds = [Guid.parse(this.groupId)]; this.lookup.versionStatuses = null; } else { - this.lookup.versionStatuses = [DmpVersionStatus.Current]; + this.lookup.versionStatuses = [DmpVersionStatus.Current, DmpVersionStatus.NotFinalized]; } this.refresh(this.lookup);