From 1ea49b690402884c27cf692786f68c1153dae5b0 Mon Sep 17 00:00:00 2001 From: palajsamuel Date: Mon, 3 Nov 2025 12:39:20 +0100 Subject: [PATCH 1/2] [NAE-2221] NOL: DTO refactor - refactor of controller request and response objects to use dtos instead of domain classes - moved commonly used request and response objects to nae-object-library - work in progress --- .../service/UserResourceHelperService.java | 17 +- .../IUserResourceHelperService.java | 6 +- .../engine/auth/web/PublicUserController.java | 33 ++- .../engine/auth/web/UserController.java | 58 ++-- .../ProcessRoleFactoryImpl.java | 12 +- .../auth/web/responsebodies/UserResource.java | 5 +- .../ElasticsearchConfiguration.java | 14 +- .../elastic/service/ElasticCaseService.java | 6 +- .../service/ElasticPetriNetService.java | 10 +- .../elastic/service/ElasticTaskService.java | 7 +- .../interfaces/IElasticPetriNetService.java | 4 +- .../ImpersonationAuthorizationService.java | 2 +- .../orgstructure/web/GroupController.java | 253 ++++++++++++++++-- .../web/responsebodies/Group.java | 15 -- .../web/responsebodies/GroupsResource.java | 50 +++- .../petrinet/service/PetriNetService.java | 54 ++-- .../service/interfaces/IPetriNetService.java | 85 +++--- .../petrinet/web/PetriNetController.java | 21 +- .../web/PublicPetriNetController.java | 8 +- .../responsebodies/ArcImportReference.java | 46 ---- .../responsebodies/DataFieldReference.java | 27 -- .../DataFieldReferencesResource.java | 5 +- .../PetriNetImportReference.java | 28 -- .../web/responsebodies/PetriNetReference.java | 56 ---- .../PetriNetReferenceResource.java | 16 +- .../PetriNetReferenceResourceAssembler.java | 5 +- .../PetriNetReferenceResources.java | 5 +- .../PetriNetReferenceWithMessage.java | 9 +- .../responsebodies/PlaceImportReference.java | 22 -- .../web/responsebodies/ProcessRole.java | 22 -- .../ProcessRolesAndPermissions.java | 5 +- .../responsebodies/ProcessRolesResource.java | 5 +- .../web/responsebodies/Reference.java | 18 -- .../web/responsebodies/Transaction.java | 21 -- .../responsebodies/TransactionResource.java | 8 +- .../TransitionImportReference.java | 16 -- .../responsebodies/TransitionReference.java | 29 -- .../TransitionReferencesResource.java | 42 ++- .../repositories/CaseRepositoryImpl.java | 9 +- .../workflow/service/CaseSearchService.java | 14 +- .../service/ConfigurableMenuService.java | 12 +- .../workflow/service/TaskSearchService.java | 8 +- .../workflow/web/AbstractTaskController.java | 19 +- .../workflow/web/PublicTaskController.java | 2 - .../workflow/web/WorkflowController.java | 115 ++++---- .../web/responsebodies/CaseResource.java | 17 +- .../responsebodies/CaseResourceAssembler.java | 6 +- .../responsebodies/DataFieldReference.java | 26 -- .../ElasticTaskResourceAssembler.java | 12 - .../responsebodies/LocalisedTaskResource.java | 37 +-- .../responsebodies/ResourceLinkAssembler.java | 6 +- .../workflow/web/responsebodies/Task.java | 122 --------- .../responsebodies/TaskResourceAssembler.java | 3 +- .../base/LocalisedCaseEventOutcome.java | 23 +- .../base/LocalisedPetriNetEventOutcome.java | 20 +- .../base/LocalisedTaskEventOutcome.java | 16 +- .../petrinet/domain/PetriNetTest.groovy | 6 +- .../objects/auth/dto/AuthoritySearchDto.java | 8 - .../objects/auth/dto/GroupSearchDto.java | 9 - .../engine/objects/dto/PreferencesDto.java | 22 ++ .../authority/AuthoritySearchRequestDto.java | 9 + .../request/group/CreateGroupRequestDto.java | 6 + .../request/group/GroupSearchRequestDto.java | 10 + .../ImpersonationSearchRequestDto.java | 6 + .../dto/request/realm/RealmSearchDto.java | 15 ++ .../dto/request/user/UserCreateRequest.java | 6 + .../request/user/UserSearchRequestBody.java | 18 ++ .../dto/response/authority/AuthorityDto.java | 17 ++ .../objects/dto/response/group/GroupDto.java | 21 ++ .../ImpersonationNotAvailableResponseDto.java | 6 + .../petrinet/ArcImportReferenceDto.java | 32 +++ .../petrinet/DataFieldReferenceDto.java | 22 ++ .../petrinet/PetriNetImportReferenceDto.java | 11 + .../petrinet/PetriNetReferenceDto.java | 23 ++ .../petrinet/PlaceImportReferenceDto.java | 15 ++ .../dto/response/petrinet/PositionDto.java | 12 + .../dto/response/petrinet/ProcessRoleDto.java | 28 ++ .../dto/response/petrinet/TransactionDto.java | 8 + .../TransitionImportReferenceDto.java | 14 + .../petrinet/TransitionReferenceDto.java | 17 ++ .../objects/dto/response}/realm/RealmDto.java | 6 +- .../objects/dto/response/task/TaskDto.java | 62 +++++ .../objects/dto/response/user/UserDto.java | 68 +++++ .../dto/response/workflow/CaseDto.java | 40 +++ .../web/requestbodies/SearchRequest.java | 18 -- .../ImpersonationNotAvailableResponse.java | 15 -- .../web/responsebodies/ProcessRole.java | 39 --- .../spring/preferences/Preferences.java | 13 + .../auth/service/AuthorityServiceImpl.java | 8 +- .../engine/auth/service/GroupServiceImpl.java | 16 +- .../engine/auth/service/RealmServiceImpl.java | 4 +- .../engine/auth/service/UserFactoryImpl.java | 32 ++- .../engine/auth/service/UserServiceImpl.java | 7 +- .../auth/realm/request/RealmSearch.java | 13 - .../realm/response/RealmSearchResponse.java | 12 - .../auth/repository/RealmRepository.java | 4 +- .../engine/auth/service/AuthorityService.java | 6 +- .../engine/auth/service/GroupService.java | 6 +- .../auth/service/ProcessRoleFactory.java | 4 +- .../engine/auth/service/RealmService.java | 5 +- .../engine/auth/service/UserFactory.java | 12 +- .../engine/auth/service/UserService.java | 2 +- .../web/requestbodies/PreferencesRequest.java | 34 --- .../web/requestbodies/UserCreateRequest.java | 13 - .../requestbodies/UserSearchRequestBody.java | 36 --- .../responsebodies/PreferencesResource.java | 10 +- .../engine/auth/web/responsebodies/User.java | 82 ------ 107 files changed, 1244 insertions(+), 1176 deletions(-) delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/responsebodies/Group.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ArcImportReference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/DataFieldReference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetImportReference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PlaceImportReference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRole.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/Reference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/Transaction.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionImportReference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionReference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/DataFieldReference.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/ElasticTaskResourceAssembler.java delete mode 100644 application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java delete mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/dto/AuthoritySearchDto.java delete mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/dto/GroupSearchDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/PreferencesDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/authority/AuthoritySearchRequestDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/group/CreateGroupRequestDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/group/GroupSearchRequestDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/impersonation/ImpersonationSearchRequestDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/realm/RealmSearchDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequest.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserSearchRequestBody.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/authority/AuthorityDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/group/GroupDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/impersonation/ImpersonationNotAvailableResponseDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/ArcImportReferenceDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/DataFieldReferenceDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PetriNetImportReferenceDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PetriNetReferenceDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PlaceImportReferenceDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PositionDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/ProcessRoleDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransactionDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransitionImportReferenceDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransitionReferenceDto.java rename {nae-user-common/src/main/java/com/netgrif/application/engine/auth => nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response}/realm/RealmDto.java (68%) create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/task/TaskDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/user/UserDto.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/workflow/CaseDto.java delete mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/impersonation/web/requestbodies/SearchRequest.java delete mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/impersonation/web/responsebodies/ImpersonationNotAvailableResponse.java delete mode 100644 nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/petrinet/web/responsebodies/ProcessRole.java delete mode 100644 nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/request/RealmSearch.java delete mode 100644 nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/response/RealmSearchResponse.java delete mode 100644 nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/PreferencesRequest.java delete mode 100644 nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UserCreateRequest.java delete mode 100644 nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UserSearchRequestBody.java delete mode 100644 nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/service/UserResourceHelperService.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/service/UserResourceHelperService.java index de08201760a..cac6f0f9c46 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/service/UserResourceHelperService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/service/UserResourceHelperService.java @@ -1,11 +1,11 @@ package com.netgrif.application.engine.auth.service; -import com.netgrif.application.engine.objects.auth.domain.AbstractUser; -import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.interfaces.IUserResourceHelperService; -import com.netgrif.application.engine.auth.web.responsebodies.User; import com.netgrif.application.engine.auth.web.responsebodies.UserResource; import com.netgrif.application.engine.impersonation.service.interfaces.IImpersonationService; +import com.netgrif.application.engine.objects.auth.domain.AbstractUser; +import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.user.UserDto; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -32,20 +32,17 @@ public UserResource getResource(LoggedUser loggedUser, Locale locale, boolean sm // User result = loggedUser.isImpersonating() ? // getLocalisedUser(user, getImpersonated(loggedUser, small), locale) : // getLocalisedUser(user, locale); - User result = getLocalisedUser(user, locale); + UserDto result = getLocalisedUser(user, locale); return new UserResource(result, "profile"); } @Override - public User getLocalisedUser(AbstractUser user, AbstractUser impersonated, Locale locale) { - User localisedUser = getLocalisedUser(user, locale); - User impersonatedUser = userFactory.getUser(impersonated, locale); - localisedUser.setImpersonated(impersonatedUser); - return localisedUser; + public UserDto getLocalisedUser(AbstractUser user, AbstractUser impersonated, Locale locale) { + return userFactory.getUserWithImpersonation(user, impersonated, locale); } @Override - public User getLocalisedUser(AbstractUser user, Locale locale) { + public UserDto getLocalisedUser(AbstractUser user, Locale locale) { return userFactory.getUser(user, locale); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/service/interfaces/IUserResourceHelperService.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/service/interfaces/IUserResourceHelperService.java index f82c5efe437..822eed28c3d 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/service/interfaces/IUserResourceHelperService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/service/interfaces/IUserResourceHelperService.java @@ -1,6 +1,6 @@ package com.netgrif.application.engine.auth.service.interfaces; -import com.netgrif.application.engine.auth.web.responsebodies.User; +import com.netgrif.application.engine.objects.dto.response.user.UserDto; import com.netgrif.application.engine.auth.web.responsebodies.UserResource; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; @@ -10,7 +10,7 @@ public interface IUserResourceHelperService { UserResource getResource(LoggedUser loggedUser, Locale locale, boolean small); - User getLocalisedUser(AbstractUser user, AbstractUser impersonated, Locale locale); + UserDto getLocalisedUser(AbstractUser user, AbstractUser impersonated, Locale locale); - User getLocalisedUser(AbstractUser user, Locale locale); + UserDto getLocalisedUser(AbstractUser user, Locale locale); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/PublicUserController.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/PublicUserController.java index 6d472275a12..d6e3aab323e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/PublicUserController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/PublicUserController.java @@ -2,12 +2,12 @@ import com.netgrif.application.engine.auth.service.PreferencesService; import com.netgrif.application.engine.auth.service.UserService; -import com.netgrif.application.engine.auth.web.requestbodies.PreferencesRequest; -import com.netgrif.application.engine.auth.web.requestbodies.UserSearchRequestBody; import com.netgrif.application.engine.auth.web.responsebodies.PreferencesResource; -import com.netgrif.application.engine.auth.web.responsebodies.User; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.PreferencesDto; +import com.netgrif.application.engine.objects.dto.request.user.UserSearchRequestBody; +import com.netgrif.application.engine.objects.dto.response.user.UserDto; import com.netgrif.application.engine.objects.preferences.Preferences; import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; import io.swagger.v3.oas.annotations.Operation; @@ -28,6 +28,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Locale; @Slf4j @RestController @@ -53,7 +54,7 @@ public class PublicUserController { @ApiResponse(responseCode = "500", description = "Internal server error") }) @GetMapping(value = "/me", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getLoggedUser(Authentication auth) { + public ResponseEntity getLoggedUser(Authentication auth) { LoggedUser loggedUser = (LoggedUser) auth.getPrincipal(); AbstractUser user; try { @@ -67,7 +68,7 @@ public ResponseEntity getLoggedUser(Authentication auth) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } - return ResponseEntity.ok(User.createUser(user)); + return ResponseEntity.ok(UserDto.fromAbstractUser(user)); } @ApiResponses(value = { @@ -77,12 +78,10 @@ public ResponseEntity getLoggedUser(Authentication auth) { }) @Operation(summary = "Generic user search", security = {@SecurityRequirement(name = "X-Auth-Token")}) @PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity> search(@RequestBody UserSearchRequestBody query, Pageable pageable, Authentication auth) { - List roles = query.getRoles() == null ? null : query.getRoles().stream().map(ProcessResourceId::new).toList(); - List negativeRoles = query.getNegativeRoles() == null ? null : query.getNegativeRoles().stream().map(ProcessResourceId::new).toList(); - Page users = userService.searchAllCoMembers(query.getFulltext(), + public ResponseEntity> search(@RequestBody UserSearchRequestBody query, Pageable pageable, Authentication auth, Locale locale) { + List roles = query.roles() == null ? null : query.roles().stream().map(ProcessResourceId::new).toList(); + Page users = userService.searchAllCoMembers(query.fulltext(), roles, - negativeRoles, (LoggedUser) auth.getPrincipal(), pageable); return ResponseEntity.ok(changeToResponse(users, pageable)); } @@ -101,7 +100,7 @@ public ResponseEntity preferences(Authentication auth) { if (preferences == null) { preferences = new com.netgrif.application.engine.adapter.spring.preferences.Preferences(userId); } - PreferencesResource preferencesResource = PreferencesResource.withPreferences(preferences); + PreferencesResource preferencesResource = PreferencesResource.withPreferences(PreferencesDto.fromPreferences(preferences)); return ResponseEntity.ok(preferencesResource); } @@ -115,11 +114,11 @@ public ResponseEntity preferences(Authentication auth) { @ApiResponse(responseCode = "500", description = "Internal server error") }) @PostMapping(value = "/preferences", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity savePreferences(@RequestBody PreferencesRequest preferences, Authentication auth) { + public ResponseEntity savePreferences(@RequestBody PreferencesDto preferences, Authentication auth) { try { String userId = ((LoggedUser) auth.getPrincipal()).getStringId(); - preferences.setUserId(userId); - preferencesService.save(preferences.toPreferences()); + Preferences domainPreferences = com.netgrif.application.engine.adapter.spring.preferences.Preferences.fromDto(preferences, userId); + preferencesService.save(domainPreferences); return ResponseEntity.ok("User preferences saved"); } catch (Exception e) { log.error("Saving user preferences failed", e); @@ -127,12 +126,12 @@ public ResponseEntity savePreferences(@RequestBody PreferencesRequest pr } } - private Page changeToResponse(Page users, Pageable pageable) { + private Page changeToResponse(Page users, Pageable pageable) { return new PageImpl<>(changeType(users.getContent()), pageable, users.getTotalElements()); } - public List changeType(List users) { - return users.stream().map(User::createUser).toList(); + public List changeType(List users) { + return users.stream().map(UserDto::fromAbstractUser).toList(); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java index e03c3f168ef..3740110a228 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java @@ -3,15 +3,15 @@ import com.netgrif.application.engine.adapter.spring.common.web.responsebodies.ResponseMessage; import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; import com.netgrif.application.engine.auth.service.*; -import com.netgrif.application.engine.auth.web.requestbodies.PreferencesRequest; -import com.netgrif.application.engine.auth.web.requestbodies.UserCreateRequest; -import com.netgrif.application.engine.auth.web.requestbodies.UserSearchRequestBody; import com.netgrif.application.engine.auth.web.responsebodies.PreferencesResource; -import com.netgrif.application.engine.auth.web.responsebodies.User; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; -import com.netgrif.application.engine.objects.auth.domain.Authority; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.objects.auth.domain.Realm; +import com.netgrif.application.engine.objects.dto.PreferencesDto; +import com.netgrif.application.engine.objects.dto.request.user.UserCreateRequest; +import com.netgrif.application.engine.objects.dto.request.user.UserSearchRequestBody; +import com.netgrif.application.engine.objects.dto.response.authority.AuthorityDto; +import com.netgrif.application.engine.objects.dto.response.user.UserDto; import com.netgrif.application.engine.objects.preferences.Preferences; import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; import io.swagger.v3.oas.annotations.Operation; @@ -62,25 +62,25 @@ public class UserController { @ApiResponse(responseCode = "500", description = "Internal server error") }) @PostMapping("/{realmId}") - public ResponseEntity createUser(@PathVariable String realmId, @RequestBody UserCreateRequest request, Locale locale) { + public ResponseEntity createUser(@PathVariable String realmId, @RequestBody UserCreateRequest request, Locale locale) { try { if (!realmExists(realmId)) { log.error("Realm with id [{}] not found", realmId); return ResponseEntity.badRequest().build(); } - if (userService.findUserByUsername(request.getUsername(), realmId).isPresent()) { - log.error("User with username [{}] already exists in realm [{}]", request.getUsername(), realmId); + if (userService.findUserByUsername(request.username(), realmId).isPresent()) { + log.error("User with username [{}] already exists in realm [{}]", request.username(), realmId); return ResponseEntity.status(HttpStatus.CONFLICT).build(); } AbstractUser user = userService.createUser( - request.getUsername(), - request.getEmail(), - request.getFirstName(), - request.getLastName(), - request.getPassword(), + request.username(), + request.email(), + request.firstName(), + request.lastName(), + request.password(), realmId ); - log.info("New user with username [{}] has been created in realm [{}]", request.getUsername(), realmId); + log.info("New user with username [{}] has been created in realm [{}]", request.username(), realmId); return ResponseEntity.status(HttpStatus.CREATED).body(userFactory.getUser(user, locale)); } catch (Exception e) { log.error("Failed to create user", e); @@ -95,7 +95,7 @@ public ResponseEntity createUser(@PathVariable String realmId, @RequestBod @ApiResponse(responseCode = "500", description = "Internal server error") }) @GetMapping("/{realmId}/all") - public ResponseEntity> getAllUsers(@PathVariable String realmId, Pageable pageable, Locale locale) { + public ResponseEntity> getAllUsers(@PathVariable String realmId, Pageable pageable, Locale locale) { if (!realmExists(realmId)) { log.error("Realm with id [{}] not found", realmId); return ResponseEntity.badRequest().build(); @@ -111,7 +111,7 @@ public ResponseEntity> getAllUsers(@PathVariable String realmId, Page @ApiResponse(responseCode = "500", description = "Internal server error") }) @GetMapping(value = "/me", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getLoggedUser(Authentication auth, Locale locale) { + public ResponseEntity getLoggedUser(Authentication auth, Locale locale) { LoggedUser loggedUser = (LoggedUser) auth.getPrincipal(); AbstractUser user; try { @@ -135,12 +135,10 @@ public ResponseEntity getLoggedUser(Authentication auth, Locale locale) { }) @Operation(summary = "Generic user search", security = {@SecurityRequirement(name = "X-Auth-Token")}) @PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity> search(@RequestBody UserSearchRequestBody query, Pageable pageable, Authentication auth, Locale locale) { - List roles = query.getRoles() == null ? null : query.getRoles().stream().map(ProcessResourceId::new).toList(); - List negativeRoles = query.getNegativeRoles() == null ? null : query.getNegativeRoles().stream().map(ProcessResourceId::new).toList(); - Page users = userService.searchAllCoMembers(query.getFulltext(), + public ResponseEntity> search(@RequestBody UserSearchRequestBody query, Pageable pageable, Authentication auth, Locale locale) { + List roles = query.roles() == null ? null : query.roles().stream().map(ProcessResourceId::new).toList(); + Page users = userService.searchAllCoMembers(query.fulltext(), roles, - negativeRoles, (LoggedUser) auth.getPrincipal(), pageable); return ResponseEntity.ok(changeToResponse(users, pageable, locale)); } @@ -153,7 +151,7 @@ public ResponseEntity> search(@RequestBody UserSearchRequestBody quer @ApiResponse(responseCode = "500", description = "Internal server error") }) @GetMapping(value = "/{realmId}/{id}", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getUser(@PathVariable("realmId") String realmId, @PathVariable("id") String userId, Locale locale) { + public ResponseEntity getUser(@PathVariable("realmId") String realmId, @PathVariable("id") String userId, Locale locale) { LoggedUser actualUser = userService.getLoggedUserFromContext(); // TODO: impersonation // LoggedUser loggedUser = actualUser.getSelfOrImpersonated(); @@ -261,8 +259,8 @@ public ResponseEntity assignRolesToUser(@PathVariable("realmId" @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), @ApiResponse(responseCode = "500", description = "Internal server error") }) - public ResponseEntity> getAllAuthorities() { - return ResponseEntity.ok(authorityService.findAll(Pageable.unpaged()).stream().toList()); + public ResponseEntity> getAllAuthorities() { + return ResponseEntity.ok(authorityService.findAll(Pageable.unpaged()).stream().map(AuthorityDto::fromAuthority).toList()); } @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") @@ -300,7 +298,7 @@ public ResponseEntity preferences(Authentication auth) { if (preferences == null) { preferences = new com.netgrif.application.engine.adapter.spring.preferences.Preferences(userId); } - PreferencesResource preferencesResource = PreferencesResource.withPreferences(preferences); + PreferencesResource preferencesResource = PreferencesResource.withPreferences(PreferencesDto.fromPreferences(preferences)); return ResponseEntity.ok(preferencesResource); } @@ -313,11 +311,11 @@ public ResponseEntity preferences(Authentication auth) { @ApiResponse(responseCode = "500", description = "Internal server error") }) @PostMapping(value = "/preferences", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity savePreferences(@RequestBody PreferencesRequest preferences, Authentication auth) { + public ResponseEntity savePreferences(@RequestBody PreferencesDto preferences, Authentication auth) { try { String userId = ((LoggedUser) auth.getPrincipal()).getStringId(); - preferences.setUserId(userId); - preferencesService.save(preferences.toPreferences()); + Preferences domainPreferences = com.netgrif.application.engine.adapter.spring.preferences.Preferences.fromDto(preferences, userId); + preferencesService.save(domainPreferences); return ResponseEntity.ok(ResponseMessage.createSuccessMessage("User preferences saved")); } catch (Exception e) { log.error("Saving user preferences failed", e); @@ -325,11 +323,11 @@ public ResponseEntity savePreferences(@RequestBody PreferencesR } } - private Page changeToResponse(Page users, Pageable pageable, Locale locale) { + private Page changeToResponse(Page users, Pageable pageable, Locale locale) { return new PageImpl<>(changeType(users.getContent(), locale), pageable, users.getTotalElements()); } - public List changeType(List users, Locale locale) { + public List changeType(List users, Locale locale) { return users.stream().map(u -> userFactory.getUser(u, locale)).toList(); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/ProcessRoleFactoryImpl.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/ProcessRoleFactoryImpl.java index ff647c0d5fc..6bb1732c25e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/ProcessRoleFactoryImpl.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/ProcessRoleFactoryImpl.java @@ -1,7 +1,7 @@ package com.netgrif.application.engine.auth.web.responsebodies; -import com.netgrif.application.engine.adapter.spring.petrinet.web.responsebodies.ProcessRole; import com.netgrif.application.engine.auth.service.ProcessRoleFactory; +import com.netgrif.application.engine.objects.dto.response.petrinet.ProcessRoleDto; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import org.bson.types.ObjectId; @@ -17,19 +17,15 @@ public class ProcessRoleFactoryImpl implements ProcessRoleFactory { private IPetriNetService petriNetService; @Override - public ProcessRole getProcessRole(com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole role, Locale locale) { + public ProcessRoleDto getProcessRole(com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole role, Locale locale) { /*if (!role.getStringId().equals(userProcessRole.getRoleId())) { throw new IllegalArgumentException(String.format("ProcessRole StringId (%s) and UserProcessRole roleId (%s) must match!", role.getStringId(), userProcessRole.getRoleId())); }*/ if (!role.isGlobal()) { - ProcessRole result = new ProcessRole(role, locale); PetriNet net = petriNetService.get(new ObjectId(role.getProcessId())); - result.setNetStringId(net.getStringId()); - result.setNetImportId(net.getImportId()); - result.setNetVersion(net.getVersion().toString()); - return result; + return new ProcessRoleDto(role, locale, net.getImportId(), net.getVersion().toString(), net.getStringId()); } - return new ProcessRole(role, locale); + return new ProcessRoleDto(role, locale); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/UserResource.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/UserResource.java index da82aaab178..d097257c259 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/UserResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/UserResource.java @@ -1,13 +1,14 @@ package com.netgrif.application.engine.auth.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.user.UserDto; import org.springframework.hateoas.EntityModel; import java.util.ArrayList; -public class UserResource extends EntityModel { +public class UserResource extends EntityModel { - public UserResource(User content, String selfRel) { + public UserResource(UserDto content, String selfRel) { super(content, new ArrayList<>()); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java b/application-engine/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java index ee7480fd873..97c6c99ff2b 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java @@ -19,12 +19,14 @@ import java.util.List; @Configuration -@EnableElasticsearchRepositories(excludeFilters = { - @ComponentScan.Filter( - type = FilterType.REGEX, - pattern = "com\\.netgrif\\.application\\.engine\\.module\\..*" - ) -}) +@EnableElasticsearchRepositories( + basePackages = "com.netgrif.application.engine.elastic.domain", + excludeFilters = { + @ComponentScan.Filter( + type = FilterType.REGEX, + pattern = "com\\.netgrif\\.application\\.engine\\.module\\..*" + ) + }) public class ElasticsearchConfiguration extends org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration { private final DataConfigurationProperties.ElasticsearchProperties elasticsearchProperties; diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java index 07d69011897..81619cc6e9e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java @@ -8,6 +8,7 @@ import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; import com.netgrif.application.engine.configuration.properties.DataConfigurationProperties; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.elastic.domain.ElasticCase; import com.netgrif.application.engine.elastic.domain.ElasticCaseRepository; import com.netgrif.application.engine.elastic.domain.ElasticQueryConstants; @@ -18,7 +19,6 @@ import com.netgrif.application.engine.objects.event.events.workflow.IndexCaseEvent; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; import com.netgrif.application.engine.utils.FullPageRequest; import com.netgrif.application.engine.objects.workflow.domain.Case; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; @@ -504,13 +504,13 @@ protected boolean buildGroupQuery(CaseSearchRequest request, LoggedUser user, Lo PetriNetSearch processQuery = new PetriNetSearch(); processQuery.setGroup(request.group); - List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); + List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); if (groupProcesses.isEmpty()) { return true; } TermsQueryField stringIds = new TermsQueryField.Builder() - .value(groupProcesses.stream().map(PetriNetReference::getIdentifier).map(FieldValue::of).collect(Collectors.toList())) + .value(groupProcesses.stream().map(PetriNetReferenceDto::identifier).map(FieldValue::of).collect(Collectors.toList())) .build(); query.filter(QueryBuilders.terms(term -> term.field("processIdentifier").terms(stringIds))); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java index c64d947fe6a..da325e00b24 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java @@ -7,11 +7,11 @@ import com.netgrif.application.engine.elastic.service.executors.Executor; import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetService; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.elastic.domain.ElasticPetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; import com.netgrif.application.engine.utils.FullPageRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -107,7 +107,7 @@ public void remove(String id) { * @return Page - page of PetriNetReferences */ @Override - public Page search(PetriNetSearch requests, LoggedUser user, Pageable pageable, Locale locale, Boolean isIntersection) { + public Page search(PetriNetSearch requests, LoggedUser user, Pageable pageable, Locale locale, Boolean isIntersection) { if (requests == null) { throw new IllegalArgumentException("Request can not be null!"); } @@ -129,7 +129,7 @@ public Page search(PetriNetSearch requests, LoggedUser user, total = 0; } - return new PageImpl<>(netPage.stream().map(net -> new PetriNetReference(net, locale)).collect(Collectors.toList()), pageable, total); + return new PageImpl<>(netPage.stream().map(net -> PetriNetReferenceDto.fromPetriNet(net, locale)).collect(Collectors.toList()), pageable, total); } protected NativeQuery buildQuery(PetriNetSearch request, LoggedUser user, Pageable pageable, Locale locale, Boolean isIntersection) { @@ -191,12 +191,12 @@ protected boolean buildGroupQuery(PetriNetSearch request, LoggedUser user, Local PetriNetSearch processQuery = new PetriNetSearch(); processQuery.setGroup(request.getGroup()); - List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); + List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); if (groupProcesses.isEmpty()) return true; BoolQuery.Builder groupQuery = new BoolQuery.Builder(); - groupProcesses.stream().map(PetriNetReference::getIdentifier) + groupProcesses.stream().map(PetriNetReferenceDto::identifier) .map(netIdentifier -> termQuery("identifier", netIdentifier)) .forEach(termQuery -> groupQuery.should(termQuery._toQuery())); query.filter(groupQuery.build()._toQuery()); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticTaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticTaskService.java index 6d554236b6a..d198344662f 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticTaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticTaskService.java @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableList; import com.netgrif.application.engine.configuration.properties.DataConfigurationProperties; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.elastic.domain.ElasticJob; import com.netgrif.application.engine.elastic.domain.ElasticQueryConstants; import com.netgrif.application.engine.objects.elastic.domain.ElasticTask; @@ -14,12 +15,10 @@ import com.netgrif.application.engine.objects.event.events.task.IndexTaskEvent; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; import com.netgrif.application.engine.utils.FullPageRequest; import com.netgrif.application.engine.objects.workflow.domain.Task; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.web.requestbodies.TaskSearchRequest; -import com.netgrif.application.engine.workflow.web.requestbodies.taskSearch.PetriNet; import com.netgrif.application.engine.workflow.web.requestbodies.taskSearch.TaskSearchCaseRequest; import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole; import org.slf4j.Logger; @@ -451,12 +450,12 @@ public boolean buildGroupQuery(TaskSearchRequest request, LoggedUser user, Local PetriNetSearch processQuery = new PetriNetSearch(); processQuery.setGroup(request.group); - List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); + List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); if (groupProcesses.isEmpty()) { return true; } TermsQueryField stringIds = new TermsQueryField.Builder() - .value(groupProcesses.stream().map(PetriNetReference::getStringId).map(FieldValue::of).collect(Collectors.toList())) + .value(groupProcesses.stream().map(PetriNetReferenceDto::stringId).map(FieldValue::of).collect(Collectors.toList())) .build(); query.filter(QueryBuilders.terms(term -> term.field("processId").terms(stringIds))); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java index 00a250ad3b0..104ccba3196 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java @@ -1,9 +1,9 @@ package com.netgrif.application.engine.elastic.service.interfaces; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.elastic.domain.ElasticPetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.scheduling.annotation.Async; @@ -19,6 +19,6 @@ public interface IElasticPetriNetService { void remove(String id); - Page search(PetriNetSearch requests, LoggedUser user, Pageable pageable, Locale locale, Boolean isIntersection); + Page search(PetriNetSearch requests, LoggedUser user, Pageable pageable, Locale locale, Boolean isIntersection); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/impersonation/service/ImpersonationAuthorizationService.java b/application-engine/src/main/java/com/netgrif/application/engine/impersonation/service/ImpersonationAuthorizationService.java index 94b492f20b4..d75571f902c 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/impersonation/service/ImpersonationAuthorizationService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/impersonation/service/ImpersonationAuthorizationService.java @@ -55,7 +55,7 @@ public class ImpersonationAuthorizationService implements IImpersonationAuthoriz @Override public Page getConfiguredImpersonationUsers(String query, LoggedUser impersonator, Pageable pageable) { if (impersonator.isAdmin()) { - return userService.searchAllCoMembers(query, null, null, impersonator, pageable); + return userService.searchAllCoMembers(query, null, impersonator, pageable); } else { Page cases = searchConfigs(impersonator.getStringId(), pageable); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/GroupController.java b/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/GroupController.java index 5fca05b1095..71c591eae1f 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/GroupController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/GroupController.java @@ -1,26 +1,40 @@ package com.netgrif.application.engine.orgstructure.web; +import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; import com.netgrif.application.engine.auth.service.GroupService; -import com.netgrif.application.engine.orgstructure.web.responsebodies.Group; +import com.netgrif.application.engine.auth.service.RealmService; +import com.netgrif.application.engine.auth.service.UserService; +import com.netgrif.application.engine.objects.auth.domain.AbstractUser; +import com.netgrif.application.engine.objects.auth.domain.Group; +import com.netgrif.application.engine.objects.auth.domain.Realm; +import com.netgrif.application.engine.objects.dto.request.group.CreateGroupRequestDto; +import com.netgrif.application.engine.objects.dto.request.group.GroupSearchRequestDto; +import com.netgrif.application.engine.objects.dto.response.group.GroupDto; +import com.netgrif.application.engine.objects.dto.response.user.UserDto; +import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; import com.netgrif.application.engine.orgstructure.web.responsebodies.GroupsResource; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.MediaTypes; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; +@Slf4j @RestController @RequestMapping("/api/group") @ConditionalOnProperty( @@ -29,13 +43,13 @@ matchIfMissing = true ) @Tag(name = "Group") +@RequiredArgsConstructor public class GroupController { private final GroupService service; - - public GroupController(GroupService service) { - this.service = service; - } + private final UserService userService; + private final ProcessRoleService processRoleService; + private final RealmService realmService; @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") @Operation(summary = "Get all groups in the system", @@ -46,11 +60,220 @@ public GroupController(GroupService service) { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), }) - public GroupsResource getAllGroups() { + public GroupsResource getAllGroups(Locale locale) { List groups = service.findAll(Pageable.unpaged()).getContent(); - Set groupResponse = groups.stream() - .map(g -> new Group(g.getStringId(), g.getDisplayName())) + Set groupDtoResponse = groups.stream() + .map(g -> GroupDto.fromGroup(g, locale)) .collect(Collectors.toCollection(HashSet::new)); - return new GroupsResource(groupResponse); + return new GroupsResource(groupDtoResponse); + } + + + @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") + @Operation(summary = "Create new group", + description = "Caller must have the ADMIN role", + security = {@SecurityRequirement(name = "X-Auth-Token")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "New group created successfully"), + @ApiResponse(responseCode = "400", description = "Request data invalid"), + @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity createGroup(@RequestBody CreateGroupRequestDto request, Locale locale) { + if (!realmExists(request.realmId())) { + String message = "Cannot create group, realm with id [" + request.realmId() + "] does not exist"; + log.error(message); + return ResponseEntity.badRequest().build(); + } + try { + AbstractUser user = userService.findById(request.ownerId(), null); + return ResponseEntity.status(HttpStatus.CREATED).body(GroupDto.fromGroup(service.create(request.identifier(), request.displayName(), user), locale)); + } catch (IllegalArgumentException e) { + log.error("Failed to create new group", e); + return ResponseEntity.badRequest().build(); + } + } + + @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") + @Operation(summary = "Delete group defined by id", + description = "Caller must have the ADMIN role", + security = {@SecurityRequirement(name = "X-Auth-Token")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "New group created successfully"), + @ApiResponse(responseCode = "400", description = "Request data invalid"), + @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + @DeleteMapping("/{id}") + public ResponseEntity deleteGroup(@PathVariable("id") String groupId) { + try { + Group group = service.findById(groupId); + service.delete(group); + return ResponseEntity.ok("Group with id [" + groupId + "] deleted successfully"); + } catch (IllegalArgumentException e) { + String message = "Failed to delete group with id [" + groupId + "]"; + log.error(message, e); + return ResponseEntity.badRequest().body(message); + } + } + + @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") + @Operation(summary = "Get group by id", + description = "Caller must have the ADMIN role", + security = {@SecurityRequirement(name = "X-Auth-Token")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Group retrieved successfully"), + @ApiResponse(responseCode = "400", description = "Group with given id does not exist"), + @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + @GetMapping("/{id}") + public ResponseEntity getGroup(@PathVariable("id") String groupId, Locale locale) { + try { + Group group = service.findById(groupId); + return ResponseEntity.ok(GroupDto.fromGroup(group, locale)); + } catch (IllegalArgumentException e) { + log.error("Cannot get group with id [{}]", groupId, e); + return ResponseEntity.badRequest().build(); + } + } + + @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") + @Operation(summary = "Get paged of group members", + description = "Caller must have the ADMIN role", + security = {@SecurityRequirement(name = "X-Auth-Token")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Group members retrieved successfully"), + @ApiResponse(responseCode = "400", description = "Group with given id does not exist"), + @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + @GetMapping("/{id}/members") + public ResponseEntity> getMembersOfGroup(@PathVariable("id") String groupId, Pageable pageable) { + try { + Group group = service.findById(groupId); +// todo use UserFactory to get users with roles? + Page groupMembers = userService.findAllByIds(group.getMemberIds(), group.getRealmId(), pageable).map(UserDto::fromAbstractUser); + return ResponseEntity.ok(groupMembers); + } catch (IllegalArgumentException e) { + log.error("Cannot get members of group with id [{}]", groupId, e); + return ResponseEntity.badRequest().build(); + } + } + + @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") + @Operation(summary = "Add user to group", + description = "Caller must have the ADMIN role", + security = {@SecurityRequirement(name = "X-Auth-Token")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "User added to group successfully"), + @ApiResponse(responseCode = "400", description = "Group with given id does not exist"), + @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + @PutMapping("/{id}/members/{userId}") + public ResponseEntity addMemberToGroup(@PathVariable("id") String groupId, @PathVariable("userId") String userId) { + try { + Group group = service.findById(groupId); + AbstractUser user = userService.findById(userId, group.getRealmId()); + service.addUser(user, group); + return ResponseEntity.ok("Added user [" + userId + "] to group [" + groupId + "]"); + } catch (IllegalArgumentException e) { + String message = "Failed to add member [%s] to group [%s]".formatted(userId, groupId); + log.error(message, e); + return ResponseEntity.badRequest().body(message); + } + } + + @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") + @Operation(summary = "Remove user from group", + description = "Caller must have the ADMIN role", + security = {@SecurityRequirement(name = "X-Auth-Token")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "User removed from group successfully"), + @ApiResponse(responseCode = "400", description = "Group or user with given id does not exist"), + @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + @DeleteMapping("/{id}/members/{userId}") + public ResponseEntity removeMemberFromGroup(@PathVariable("id") String groupId, @PathVariable("userId") String userId) { + try { + Group group = service.findById(groupId); + AbstractUser user = userService.findById(userId, group.getRealmId()); + service.removeUser(user, group); + return ResponseEntity.ok("User [" + userId + "] removed from group [" + groupId + "]"); + } catch (IllegalArgumentException e) { + String message = "Failed to remove member [%s] from group [%s]".formatted(userId, groupId); + log.error(message, e); + return ResponseEntity.badRequest().body("Failed to remove member from group: " + e.getMessage()); + } + } + + @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") + @Operation(summary = "Assign roles to group", + description = "Caller must have the ADMIN role", + security = {@SecurityRequirement(name = "X-Auth-Token")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Selected roles assigned successfully"), + @ApiResponse(responseCode = "400", description = "Requested roles or group with defined id does not exist"), + @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + @PutMapping("/{id}/roles") + public ResponseEntity assignRolesToGroup(@PathVariable("id") String groupId, @RequestBody Set roleIds) { + try { + Group group = service.findById(groupId); + processRoleService.assignRolesToGroup(group, roleIds.stream().map(ProcessResourceId::new).collect(Collectors.toSet())); + log.info("Process roles {} assigned to group [{}]", roleIds, groupId); + return ResponseEntity.ok("Selected roles assigned to group " + groupId); + } catch (IllegalArgumentException e) { + String message = "Assigning roles to group [%s] has failed".formatted(groupId); + log.error(message, e); + return ResponseEntity.badRequest().body(message); + } + } + + @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") + @Operation(summary = "Assign authority to group", + description = "Caller must have the ADMIN role", + security = {@SecurityRequirement(name = "X-Auth-Token")}) + @PostMapping(value = "/{id}/authority", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Authority assigned to group successfully"), + @ApiResponse(responseCode = "400", description = "Group or authority with given id does not exist"), + @ApiResponse(responseCode = "403", description = "Caller doesn't fulfill the authorisation requirements"), + @ApiResponse(responseCode = "500", description = "Internal server error"), + }) + public ResponseEntity assignAuthorityToGroup(@PathVariable("id") String groupId, @RequestBody String authorityId) { + try { + service.assignAuthority(groupId, authorityId); + } catch (IllegalArgumentException e) { + String message = "Group with id [%s] or authority with id [%s] does not exist".formatted(groupId, authorityId); + log.error(message, e); + return ResponseEntity.badRequest().body(message); + } + return ResponseEntity.ok("Authority " + authorityId + " assigned to group " + groupId); + } + + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Groups retrieved successfully"), + @ApiResponse(responseCode = "400", description = "Invalid group data"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + @Operation(summary = "Generic group search", security = {@SecurityRequirement(name = "X-Auth-Token")}) + @PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> search(@RequestBody GroupSearchRequestDto query, Pageable pageable, Locale locale) { + List groups = service.search(query, pageable).getContent(); + return ResponseEntity.ok(transformPageContent(groups, pageable, locale)); + } + + private Page transformPageContent(List groups, Pageable pageable, Locale locale) { + return new PageImpl<>(groups.stream().map(group -> GroupDto.fromGroup(group, locale)).toList(), pageable, groups.size()); + } + + private boolean realmExists(String realmId) { + Optional realm = realmService.getRealmById(realmId); + return realm.isPresent(); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/responsebodies/Group.java b/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/responsebodies/Group.java deleted file mode 100644 index 2d47b50145c..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/responsebodies/Group.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.netgrif.application.engine.orgstructure.web.responsebodies; - -import lombok.Data; - -@Data -public class Group { - - private String id; - private String name; - - public Group(String id, String name) { - this.id = id; - this.name = name; - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/responsebodies/GroupsResource.java b/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/responsebodies/GroupsResource.java index a6039cd6bde..1b2e458da0c 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/responsebodies/GroupsResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/orgstructure/web/responsebodies/GroupsResource.java @@ -1,19 +1,61 @@ package com.netgrif.application.engine.orgstructure.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.authority.AuthorityDto; +import com.netgrif.application.engine.objects.dto.response.group.GroupDto; +import com.netgrif.application.engine.objects.dto.response.petrinet.ProcessRoleDto; import com.netgrif.application.engine.orgstructure.web.GroupController; import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.server.core.Relation; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; +import java.io.Serializable; +import java.util.Set; +import java.util.stream.StreamSupport; -public class GroupsResource extends CollectionModel { +public class GroupsResource extends CollectionModel { - public GroupsResource(Iterable content) { - super(content); + public GroupsResource(Iterable content) { + super(StreamSupport.stream(content.spliterator(), false).map(GroupReferenceWrapper::new).toList()); buildLinks(); } private void buildLinks() { add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(GroupController.class) - .getAllGroups()).withSelfRel()); + .getAllGroups(null)).withSelfRel()); } + + @Relation(collectionRelation = "groups", itemRelation = "group") + public static class GroupReferenceWrapper implements Serializable { + + private final GroupDto delegate; + + public GroupReferenceWrapper(GroupDto group) { + this.delegate = group; + } + + public String getId() { + return delegate.id(); + } + + public String getName() { + return delegate.displayName(); + } + + public String getIdentifier() { + return delegate.identifier(); + } + + public String getOwnerUsername() { + return delegate.ownerUsername(); + } + + public Set getProcessRoles() { + return delegate.processRoles(); + } + + public Set getAuthorities() { + return delegate.authoritySet(); + } + } + } \ No newline at end of file diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java index a4684616368..f717e8449c9 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java @@ -5,9 +5,8 @@ import com.netgrif.application.engine.objects.auth.domain.ActorTransformer; import com.netgrif.application.engine.configuration.properties.CacheConfigurationProperties; import com.netgrif.application.engine.files.minio.StorageConfigurationProperties; +import com.netgrif.application.engine.objects.dto.response.petrinet.*; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.petrinet.web.responsebodies.ArcImportReference; -import com.netgrif.application.engine.objects.auth.domain.Group; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.UserService; import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetMappingService; @@ -29,7 +28,6 @@ import com.netgrif.application.engine.objects.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.objects.petrinet.domain.version.Version; import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; -import com.netgrif.application.engine.petrinet.web.responsebodies.*; import com.netgrif.application.engine.objects.workflow.domain.Case; import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; import com.netgrif.application.engine.workflow.service.interfaces.IEventService; @@ -318,15 +316,13 @@ public List getExistingPetriNetIdentifiersFromIdentifiersList(List pn.getTransitions().add(new TransitionImportReference(value))); - useCase.getPetriNet().getPlaces().forEach((key, value) -> pn.getPlaces().add(new PlaceImportReference(value))); - useCase.getPetriNet().getArcs().forEach((key, arcs) -> { - arcs.forEach(arc -> pn.getArcs().add(new ArcImportReference(arc))); - }); - return pn; + PetriNet net = useCase.getPetriNet(); + List transitions = net.getTransitions().values().stream().map(TransitionImportReferenceDto::fromTransition).toList(); + List places = net.getPlaces().values().stream().map(PlaceImportReferenceDto::fromPlace).toList(); + List arcs = net.getArcs().values().stream().map(value -> value.stream().map(ArcImportReferenceDto::fromArc).collect(Collectors.toList())).flatMap(Collection::stream).toList(); + return new PetriNetImportReferenceDto(transitions, places, arcs, null, null); } @Override @@ -357,18 +353,18 @@ public FileSystemResource getFile(String netId, String title) { } @Override - public Page getReferences(LoggedUser user, Locale locale, Pageable pageable) { + public Page getReferences(LoggedUser user, Locale locale, Pageable pageable) { return getAll(pageable).map(net -> transformToReference(net, locale)); } @Override - public Page getReferencesByIdentifier(String identifier, LoggedUser user, Locale locale, Pageable pageable) { + public Page getReferencesByIdentifier(String identifier, LoggedUser user, Locale locale, Pageable pageable) { return getByIdentifier(identifier, pageable).map(net -> transformToReference(net, locale)); } @Override - public Page getReferencesByVersion(Version version, LoggedUser user, Locale locale, Pageable pageable) { - Page references; + public Page getReferencesByVersion(Version version, LoggedUser user, Locale locale, Pageable pageable) { + Page references; if (version == null) { GroupOperation groupByIdentifier = Aggregation.group("identifier").max("version").as("version"); Aggregation aggregation; @@ -385,7 +381,7 @@ public Page getReferencesByVersion(Version version, LoggedUse ); } List results = mongoTemplate.aggregate(aggregation, "petriNet", Document.class).getMappedResults(); - List referenceList = results.stream() + List referenceList = results.stream() .map(doc -> { Document versionDoc = doc.get("version", Document.class); Version refVersion = new Version(versionDoc.getLong("major"), versionDoc.getLong("minor"), versionDoc.getLong("patch")); @@ -415,21 +411,21 @@ public Page getReferencesByVersion(Version version, LoggedUse } @Override - public List getReferencesByUsersProcessRoles(LoggedUser user, Locale locale) { + public List getReferencesByUsersProcessRoles(LoggedUser user, Locale locale) { Query query = Query.query(getProcessRolesCriteria(user)); return mongoTemplate.find(query, com.netgrif.application.engine.adapter.spring.petrinet.domain.PetriNet.class).stream().map(net -> transformToReference(net, locale)).collect(Collectors.toList()); } @Override - public PetriNetReference getReference(String identifier, Version version, LoggedUser user, Locale locale) { + public PetriNetReferenceDto getReference(String identifier, Version version, LoggedUser user, Locale locale) { PetriNet net = version == null ? getNewestVersionByIdentifier(identifier) : getPetriNet(identifier, version); - return net != null ? transformToReference(net, locale) : new PetriNetReference(); + return net != null ? transformToReference(net, locale) : null; } @Override - public List getTransitionReferences(List netIds, LoggedUser user, Locale locale) { + public List getTransitionReferences(List netIds, LoggedUser user, Locale locale) { Iterable nets = get(netIds); - List references = new ArrayList<>(); + List references = new ArrayList<>(); nets.forEach(net -> references.addAll(net.getTransitions().entrySet().stream() .map(entry -> transformToReference(net, entry.getValue(), locale)).collect(Collectors.toList()))); @@ -438,16 +434,16 @@ public List getTransitionReferences(List netIds, Lo } @Override - public List getDataFieldReferences(List transitions, Locale locale) { - Iterable nets = repository.findAllById(transitions.stream().map(TransitionReference::getPetriNetId).collect(Collectors.toList())); - List dataRefs = new ArrayList<>(); - Map> transitionReferenceMap = transitions.stream() - .collect(Collectors.groupingBy(TransitionReference::getPetriNetId)); + public List getDataFieldReferences(List transitions, Locale locale) { + Iterable nets = repository.findAllById(transitions.stream().map(TransitionReferenceDto::petriNetId).collect(Collectors.toList())); + List dataRefs = new ArrayList<>(); + Map> transitionReferenceMap = transitions.stream() + .collect(Collectors.groupingBy(TransitionReferenceDto::petriNetId)); nets.forEach(net -> transitionReferenceMap.get(net.getStringId()) .forEach(transition -> { Transition trans; - if ((trans = net.getTransition(transition.getStringId())) != null) { + if ((trans = net.getTransition(transition.stringId())) != null) { dataRefs.addAll(trans.getDataSet().entrySet().stream() .map(entry -> transformToReference(net, trans, net.getDataSet().get(entry.getKey()), locale)) .collect(Collectors.toList())); @@ -463,7 +459,7 @@ public Optional findByImportId(String id) { } @Override - public Page search(PetriNetSearch criteriaClass, LoggedUser user, Pageable pageable, Locale locale) { + public Page search(PetriNetSearch criteriaClass, LoggedUser user, Pageable pageable, Locale locale) { Query query = new Query(); Query queryTotal = new Query(); @@ -520,7 +516,7 @@ public Page search(PetriNetSearch criteriaClass, LoggedUser u query.with(pageable); List nets = mongoTemplate.find(query, com.netgrif.application.engine.adapter.spring.petrinet.domain.PetriNet.class); - return new PageImpl<>(nets.stream().map(net -> new PetriNetReference(net, locale)).collect(Collectors.toList()), pageable, mongoTemplate.count(queryTotal, com.netgrif.application.engine.adapter.spring.petrinet.domain.PetriNet.class)); + return new PageImpl<>(nets.stream().map(net -> PetriNetReferenceDto.fromPetriNet(net, locale)).collect(Collectors.toList()), pageable, mongoTemplate.count(queryTotal, com.netgrif.application.engine.adapter.spring.petrinet.domain.PetriNet.class)); } private void addValueCriteria(Query query, Query queryTotal, Criteria criteria) { diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java index c6fd966cb51..8510c013f50 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java @@ -1,6 +1,7 @@ package com.netgrif.application.engine.petrinet.service.interfaces; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.*; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.objects.petrinet.domain.Transition; @@ -10,10 +11,6 @@ import com.netgrif.application.engine.objects.petrinet.domain.throwable.MissingIconKeyException; import com.netgrif.application.engine.objects.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.objects.petrinet.domain.version.Version; -import com.netgrif.application.engine.petrinet.web.responsebodies.DataFieldReference; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetImportReference; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; -import com.netgrif.application.engine.petrinet.web.responsebodies.TransitionReference; import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; import org.bson.types.ObjectId; import org.springframework.core.io.FileSystemResource; @@ -30,41 +27,41 @@ public interface IPetriNetService { /** - * Transforms a {@link PetriNet} into a {@link PetriNetReference}. + * Transforms a {@link PetriNet} into a {@link PetriNetReferenceDto}. * * @param net the PetriNet to transform * @param locale the locale to use for translations - * @return a {@link PetriNetReference} representing the given PetriNet + * @return a {@link PetriNetReferenceDto} representing the given PetriNet */ - static PetriNetReference transformToReference(PetriNet net, Locale locale) { - return new PetriNetReference(net, locale); + static PetriNetReferenceDto transformToReference(PetriNet net, Locale locale) { + return PetriNetReferenceDto.fromPetriNet(net, locale); } /** - * Transforms a {@link Transition} into a {@link TransitionReference}. + * Transforms a {@link Transition} into a {@link TransitionReferenceDto}. * * @param net the {@link PetriNet} containing the transition * @param transition the transition to transform * @param locale the locale to use for translations - * @return a {@link TransitionReference} for the given transition + * @return a {@link TransitionReferenceDto} for the given transition */ - static TransitionReference transformToReference(PetriNet net, Transition transition, Locale locale) { - List list = new ArrayList<>(); - transition.getImmediateData().forEach(fieldId -> list.add(new com.netgrif.application.engine.workflow.web.responsebodies.DataFieldReference(net.getDataSet().get(fieldId), locale))); - return new TransitionReference(transition.getStringId(), transition.getTitle().getTranslation(locale), net.getStringId(), list); + static TransitionReferenceDto transformToReference(PetriNet net, Transition transition, Locale locale) { + List list = new ArrayList<>(); + transition.getImmediateData().forEach(fieldId -> list.add(DataFieldReferenceDto.fromField(net.getDataSet().get(fieldId), locale))); + return new TransitionReferenceDto(transition.getStringId(), transition.getTitle().getTranslation(locale), net.getStringId(), list); } /** - * Transforms a {@link Field} into a {@link DataFieldReference}. + * Transforms a {@link Field} into a {@link DataFieldReferenceDto}. * * @param net the {@link PetriNet} containing the field * @param transition the {@link Transition} containing the field * @param field the field to transform * @param locale the locale to use for translations - * @return a {@link DataFieldReference} for the given field + * @return a {@link DataFieldReferenceDto} for the given field */ - static DataFieldReference transformToReference(PetriNet net, Transition transition, Field field, Locale locale) { - return new DataFieldReference(field.getStringId(), field.getName().getTranslation(locale), net.getStringId(), transition.getStringId()); + static DataFieldReferenceDto transformToReference(PetriNet net, Transition transition, Field field, Locale locale) { + return new DataFieldReferenceDto(field.getStringId(), field.getName().getTranslation(locale), net.getStringId(), transition.getStringId(), field.getType().getName()); } /** @@ -183,81 +180,81 @@ static DataFieldReference transformToReference(PetriNet net, Transition transiti * @param user the logged-in user * @param locale the locale for translations * @param pageable the pagination information - * @return a {@link Page} of {@link PetriNetReference} objects + * @return a {@link Page} of {@link PetriNetReferenceDto} objects */ - Page getReferences(LoggedUser user, Locale locale, Pageable pageable); + Page getReferences(LoggedUser user, Locale locale, Pageable pageable); /** - * Retrieves a paginated list of {@link PetriNetReference} objects by their identifier. + * Retrieves a paginated list of {@link PetriNetReferenceDto} objects by their identifier. * * @param identifier the unique identifier of the PetriNet * @param user the logged-in user making the request * @param locale the locale for translations * @param pageable the pagination information - * @return a paginated list of {@link PetriNetReference} objects + * @return a paginated list of {@link PetriNetReferenceDto} objects */ - Page getReferencesByIdentifier(String identifier, LoggedUser user, Locale locale, Pageable pageable); + Page getReferencesByIdentifier(String identifier, LoggedUser user, Locale locale, Pageable pageable); /** - * Retrieves a paginated list of {@link PetriNetReference} objects by version. + * Retrieves a paginated list of {@link PetriNetReferenceDto} objects by version. * * @param version the {@link Version} of the PetriNet * @param user the logged-in user making the request * @param locale the locale for translations * @param pageable the pagination information - * @return a paginated list of {@link PetriNetReference} objects + * @return a paginated list of {@link PetriNetReferenceDto} objects */ - Page getReferencesByVersion(Version version, LoggedUser user, Locale locale, Pageable pageable); + Page getReferencesByVersion(Version version, LoggedUser user, Locale locale, Pageable pageable); /** - * Retrieves a list of {@link PetriNetReference} objects accessible by the user's process roles. + * Retrieves a list of {@link PetriNetReferenceDto} objects accessible by the user's process roles. * * @param user the logged-in user making the request * @param locale the locale for translations - * @return a list of {@link PetriNetReference} objects accessible by the user + * @return a list of {@link PetriNetReferenceDto} objects accessible by the user */ - List getReferencesByUsersProcessRoles(LoggedUser user, Locale locale); + List getReferencesByUsersProcessRoles(LoggedUser user, Locale locale); /** - * Retrieves a single {@link PetriNetReference} by identifier and version. + * Retrieves a single {@link PetriNetReferenceDto} by identifier and version. * * @param identifier the unique identifier of the PetriNet * @param version the {@link Version} of the PetriNet * @param user the logged-in user making the request * @param locale the locale for translations - * @return the {@link PetriNetReference} object corresponding to the given identifier and version + * @return the {@link PetriNetReferenceDto} object corresponding to the given identifier and version */ - PetriNetReference getReference(String identifier, Version version, LoggedUser user, Locale locale); + PetriNetReferenceDto getReference(String identifier, Version version, LoggedUser user, Locale locale); /** - * Retrieves a list of {@link TransitionReference} objects for the given PetriNet IDs. + * Retrieves a list of {@link TransitionReferenceDto} objects for the given PetriNet IDs. * * @param netsIds the list of PetriNet IDs for which to retrieve transitions * @param user the logged-in user making the request * @param locale the locale for translations - * @return a list of {@link TransitionReference} objects for the given PetriNet IDs + * @return a list of {@link TransitionReferenceDto} objects for the given PetriNet IDs */ - List getTransitionReferences(List netsIds, LoggedUser user, Locale locale); + List getTransitionReferences(List netsIds, LoggedUser user, Locale locale); /** - * Retrieves a list of {@link DataFieldReference} objects for the given transition references. + * Retrieves a list of {@link DataFieldReferenceDto} objects for the given transition references. * - * @param transitions the list of {@link TransitionReference} objects + * @param transitions the list of {@link TransitionReferenceDto} objects * @param locale the locale for translations - * @return a list of {@link DataFieldReference} objects + * @return a list of {@link DataFieldReferenceDto} objects */ - List getDataFieldReferences(List transitions, Locale locale); + List getDataFieldReferences(List transitions, Locale locale); /** - * Performs a search for {@link PetriNetReference} objects based on the provided criteria. + * Performs a search for {@link PetriNetReferenceDto} objects based on the provided criteria. * * @param criteria the {@link PetriNetSearch} criteria to filter results * @param user the logged-in user making the request * @param pageable the pagination information * @param locale the locale for translations - * @return a paginated list of {@link PetriNetReference} objects matching the criteria + * @return a paginated list of {@link PetriNetReferenceDto} objects matching the criteria */ - Page search(PetriNetSearch criteria, LoggedUser user, Pageable pageable, Locale locale); + Page search(PetriNetSearch criteria, LoggedUser user, Pageable pageable, Locale locale); /** * Finds a {@link PetriNet} by its import ID. @@ -341,9 +338,9 @@ static DataFieldReference transformToReference(PetriNet net, Transition transiti * Retrieves the reference of a {@link PetriNet} associated with a case ID. * * @param caseId the ID of the workflow case - * @return a {@link PetriNetImportReference} linking the PetriNet + * @return a {@link PetriNetImportReferenceDto} linking the PetriNet */ - PetriNetImportReference getNetFromCase(String caseId); + PetriNetImportReferenceDto getNetFromCase(String caseId); /** diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java index eb9cb4f90f9..8306114d873 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java @@ -6,6 +6,9 @@ import com.netgrif.application.engine.eventoutcomes.LocalisedEventOutcomeFactory; import com.netgrif.application.engine.importer.service.Importer; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetImportReferenceDto; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; +import com.netgrif.application.engine.objects.dto.response.petrinet.TransitionReferenceDto; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.objects.petrinet.domain.VersionType; @@ -122,15 +125,15 @@ public EntityModel importPetriNet( @Operation(summary = "Get all processes", security = {@SecurityRequirement(name = "BasicAuth")}) @GetMapping(produces = MediaTypes.HAL_JSON_VALUE) - public ResponseEntity> getAll(@RequestParam(value = "indentifier", required = false) String identifier, @RequestParam(value = "version", required = false) String version, Pageable pageable, Authentication auth, Locale locale) { + public ResponseEntity> getAll(@RequestParam(value = "indentifier", required = false) String identifier, @RequestParam(value = "version", required = false) String version, Pageable pageable, Authentication auth, Locale locale) { LoggedUser user = (LoggedUser) auth.getPrincipal(); if (identifier != null && version == null) { return ResponseEntity.ok(service.getReferencesByIdentifier(identifier, user, locale, pageable)); } else if (identifier == null && version != null) { return ResponseEntity.ok(service.getReferencesByVersion(converter.convert(version), user, locale, pageable)); } else if (identifier != null) { - PetriNetReference reference = service.getReference(identifier, converter.convert(version), user, locale); - return ResponseEntity.ok(new PageImpl<>(Collections.singletonList(reference), pageable, reference.getIdentifier().isEmpty() ? 0 : 1)); + PetriNetReferenceDto reference = service.getReference(identifier, converter.convert(version), user, locale); + return ResponseEntity.ok(new PageImpl<>(Collections.singletonList(reference), pageable, reference == null ? 0 : 1)); } else { return ResponseEntity.ok(service.getReferences(user, locale, pageable)); } @@ -158,7 +161,7 @@ public TransitionReferencesResource getTransitionReferences(@RequestParam List referenceBody, Locale locale) { + public DataFieldReferencesResource getDataFieldReferences(@RequestBody List referenceBody, Locale locale) { return new DataFieldReferencesResource(service.getDataFieldReferences(referenceBody, locale)); } @@ -191,20 +194,20 @@ public FileSystemResource getNetFile(@PathVariable("netId") String netId, @Reque @Operation(summary = "Search processes", security = {@SecurityRequirement(name = "BasicAuth")}) @PostMapping(value = "/search", produces = MediaTypes.HAL_JSON_VALUE) public @ResponseBody - ResponseEntity> searchPetriNets(@RequestBody PetriNetSearch criteria, Authentication auth, Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { + ResponseEntity> searchPetriNets(@RequestBody PetriNetSearch criteria, Authentication auth, Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { LoggedUser user = (LoggedUser) auth.getPrincipal(); - Page nets = service.search(criteria, user, pageable, locale); + Page nets = service.search(criteria, user, pageable, locale); return ResponseEntity.ok(new PageImpl<>(nets.stream().map(PetriNetReferenceResource::new).toList(), pageable, nets.getTotalElements())); } @Operation(summary = "Search elastic processes", security = {@SecurityRequirement(name = "BasicAuth")}) @PostMapping(value = "/search_elastic", produces = MediaTypes.HAL_JSON_VALUE) public @ResponseBody - PagedModel searchElasticPetriNets(@RequestBody PetriNetSearch criteria, Authentication auth, Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { + PagedModel searchElasticPetriNets(@RequestBody PetriNetSearch criteria, Authentication auth, Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { LoggedUser user = (LoggedUser) auth.getPrincipal(); // TODO: add Merge Filters and its operations - Page nets = elasticService.search(criteria, user, pageable, locale, false); + Page nets = elasticService.search(criteria, user, pageable, locale, false); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(PetriNetController.class) .searchElasticPetriNets(criteria, auth, pageable, assembler, locale)).withRel("search_elastic"); @@ -236,7 +239,7 @@ public MessageResource deletePetriNet(@PathVariable("id") String processId, @Req @Operation(summary = "Get net by case id", security = {@SecurityRequirement(name = "BasicAuth")}) @GetMapping(value = "/case/{id}", produces = MediaTypes.HAL_JSON_VALUE) - public PetriNetImportReference getOne(@PathVariable("id") String caseId) { + public PetriNetImportReferenceDto getOne(@PathVariable("id") String caseId) { return service.getNetFromCase(decodeUrl(caseId)); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PublicPetriNetController.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PublicPetriNetController.java index ab2ce973c53..f88d902f716 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PublicPetriNetController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PublicPetriNetController.java @@ -2,6 +2,8 @@ import com.netgrif.application.engine.auth.service.UserService; import com.netgrif.application.engine.objects.auth.domain.ActorTransformer; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; +import com.netgrif.application.engine.objects.dto.response.petrinet.TransitionReferenceDto; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.petrinet.domain.version.StringToVersionConverter; @@ -70,8 +72,8 @@ public PetriNetReferenceResource getOne(@PathVariable("identifier") String ident @Operation(summary = "Search processes") @PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel searchPetriNets(@RequestBody PetriNetSearch criteria, Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { - Page nets = petriNetService.search(criteria, ActorTransformer.toLoggedUser(userService.getLoggedUser()), pageable, locale); + public PagedModel searchPetriNets(@RequestBody PetriNetSearch criteria, Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { + Page nets = petriNetService.search(criteria, ActorTransformer.toLoggedUser(userService.getLoggedUser()), pageable, locale); // Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(PublicPetriNetController.class) // .searchPetriNets(criteria, pageable, assembler, locale)).withRel("search"); // PagedModel resources = assembler.toModel(nets, new PetriNetReferenceResourceAssembler(), selfLink); @@ -95,7 +97,7 @@ public TransactionsResource getTransactions(@PathVariable("netId") String netId, @Operation(summary = "Get data fields of transitions") @PostMapping(value = "/data", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public DataFieldReferencesResource getDataFieldReferences(@RequestBody List referenceBody, Locale locale) { + public DataFieldReferencesResource getDataFieldReferences(@RequestBody List referenceBody, Locale locale) { return new DataFieldReferencesResource(petriNetService.getDataFieldReferences(referenceBody, locale)); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ArcImportReference.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ArcImportReference.java deleted file mode 100644 index 6d7f1b8f96f..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ArcImportReference.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - -import com.netgrif.application.engine.objects.petrinet.domain.PetriNetObject; -import com.netgrif.application.engine.objects.petrinet.domain.Position; -import com.netgrif.application.engine.objects.petrinet.domain.arcs.Arc; -import com.netgrif.application.engine.objects.petrinet.domain.arcs.InhibitorArc; -import com.netgrif.application.engine.objects.petrinet.domain.arcs.ReadArc; -import com.netgrif.application.engine.objects.petrinet.domain.arcs.ResetArc; -import lombok.Data; - -import java.util.List; - -@Data -public class ArcImportReference extends PetriNetObject { - - protected String sourceId; - - protected String destinationId; - - protected Integer multiplicity; - - protected List breakpoints; - - protected String type; - - public ArcImportReference(Arc arc) { - this.setObjectId(arc.getObjectId()); - this.setImportId(arc.getImportId()); - this.sourceId = arc.getSourceId(); - this.destinationId = arc.getDestinationId(); - this.multiplicity = arc.getMultiplicity(); - this.breakpoints = arc.getBreakpoints(); - this.type = type(arc); - } - - private String type(Arc arc) { - if (arc instanceof ReadArc) { - return "read"; - } else if (arc instanceof InhibitorArc) { - return "inhibitor"; - } else if (arc instanceof ResetArc) { - return "reset"; - } - return "arc"; - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/DataFieldReference.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/DataFieldReference.java deleted file mode 100644 index 3e5eab19aba..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/DataFieldReference.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - - -import lombok.Data; - -@Data -public class DataFieldReference extends Reference { - - private String petriNetId; - private String transitionId; - - public DataFieldReference() { - super(); - } - - public DataFieldReference(String id, String title, String petriNetId, String transitionId) { - super(id, title); - this.petriNetId = petriNetId; - this.transitionId = transitionId; - } - - public DataFieldReference(String id, String title, TransitionReference transition) { - super(id, title); - this.petriNetId = transition.getPetriNetId(); - this.transitionId = transition.getStringId(); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/DataFieldReferencesResource.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/DataFieldReferencesResource.java index 8d43e1de690..d68ba9d84da 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/DataFieldReferencesResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/DataFieldReferencesResource.java @@ -1,14 +1,15 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.petrinet.DataFieldReferenceDto; import com.netgrif.application.engine.petrinet.web.PetriNetController; import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import java.util.ArrayList; -public class DataFieldReferencesResource extends CollectionModel { - public DataFieldReferencesResource(Iterable content) { +public class DataFieldReferencesResource extends CollectionModel { + public DataFieldReferencesResource(Iterable content) { super(content); buildLinks(); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetImportReference.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetImportReference.java deleted file mode 100644 index 95cb6189a3e..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetImportReference.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - -import lombok.Data; - -import java.util.ArrayList; -import java.util.List; - -@Data -public class PetriNetImportReference { - - private List transitions; - - private List places; - - private List arcs; - - private List assignedTasks; - - private List finishedTasks; - - public PetriNetImportReference() { - this.transitions = new ArrayList<>(); - this.places = new ArrayList<>(); - this.arcs = new ArrayList<>(); - this.assignedTasks = new ArrayList<>(); - this.finishedTasks = new ArrayList<>(); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReference.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReference.java deleted file mode 100644 index aab088038e8..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReference.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - - -import com.netgrif.application.engine.objects.auth.domain.ActorRef; -import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; -import com.netgrif.application.engine.workflow.web.responsebodies.DataFieldReference; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Locale; -import java.util.stream.Collectors; - -@Data -public class PetriNetReference extends Reference { - - private String identifier; - private String version; - private String initials; - private String defaultCaseName; - private String icon; - private LocalDateTime createdDate; - private ActorRef author; - private List immediateData; - - - public PetriNetReference() { - super(); - } - - public PetriNetReference(String stringId, String identifier, String version, String title, String initials, String defaultCaseName) { - super(stringId, title); - this.identifier = identifier; - this.version = version; - this.initials = initials; - this.defaultCaseName = defaultCaseName; - } - - public PetriNetReference(String stringId, String title, String identifier, String version, String initials, String icon, LocalDateTime createdDate, ActorRef author) { - super(stringId, title); - this.identifier = identifier; - this.version = version; - this.initials = initials; - this.icon = icon; - this.createdDate = createdDate; - this.author = author; - } - - public PetriNetReference(PetriNet net, Locale locale) { - this(net.getStringId(), net.getIdentifier(), net.getVersion().toString(), net.getTitle().getTranslation(locale), net.getInitials(), net.getTranslatedDefaultCaseName(locale)); - this.icon = net.getIcon(); - this.createdDate = net.getCreationDate(); - this.author = net.getAuthor(); - this.immediateData = net.getImmediateFields().stream().map(field -> new DataFieldReference(field, locale)).collect(Collectors.toList()); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResource.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResource.java index 9bc3f8e23b0..9c3edaa2d50 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResource.java @@ -1,36 +1,36 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.petrinet.web.PetriNetController; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; -public class PetriNetReferenceResource extends EntityModel { +public class PetriNetReferenceResource extends EntityModel { - public PetriNetReferenceResource(PetriNetReference content) { + public PetriNetReferenceResource(PetriNetReferenceDto content) { super(content); buildLinks(); } private void buildLinks() { add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder - .methodOn(PetriNetController.class).getOne(getContent().getStringId(), null, null)) + .methodOn(PetriNetController.class).getOne(getContent().stringId(), null, null)) .withSelfRel()); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder - .methodOn(PetriNetController.class).getOne(getContent().getIdentifier(), getContent().getVersion(), null, null)) + .methodOn(PetriNetController.class).getOne(getContent().identifier(), getContent().version(), null, null)) .withRel("identifier")); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder - .methodOn(PetriNetController.class).getRoles(getContent().getStringId(), null)) + .methodOn(PetriNetController.class).getRoles(getContent().stringId(), null)) .withRel("roles")); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder - .methodOn(PetriNetController.class).getTransactions(getContent().getStringId(), null)) + .methodOn(PetriNetController.class).getTransactions(getContent().stringId(), null)) .withRel("transaction")); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder - .methodOn(PetriNetController.class).getNetFile(getContent().getStringId(), getContent().getTitle(), null, null)) + .methodOn(PetriNetController.class).getNetFile(getContent().stringId(), getContent().title(), null, null)) .withRel("file")); } } \ No newline at end of file diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResourceAssembler.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResourceAssembler.java index e8f2b0e16a5..873cb903907 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResourceAssembler.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResourceAssembler.java @@ -1,9 +1,10 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.server.RepresentationModelAssembler; -public class PetriNetReferenceResourceAssembler implements RepresentationModelAssembler { +public class PetriNetReferenceResourceAssembler implements RepresentationModelAssembler { public static void buildLinks(CollectionModel resources) { // resources.add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder // .methodOn(PetriNetController.class).getAll(null, null, null, null)) @@ -23,7 +24,7 @@ public static void buildLinks(CollectionModel resources) { } @Override - public PetriNetReferenceResource toModel(PetriNetReference petriNetReference) { + public PetriNetReferenceResource toModel(PetriNetReferenceDto petriNetReference) { return new PetriNetReferenceResource(petriNetReference); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResources.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResources.java index 9147570d3b8..0489454f704 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResources.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResources.java @@ -1,8 +1,9 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.Link; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; + import java.util.List; import java.util.stream.Collectors; @@ -18,7 +19,7 @@ public PetriNetReferenceResources(Iterable content) { buildLinks(); } - public PetriNetReferenceResources(List content) { + public PetriNetReferenceResources(List content) { this(content.stream().map(PetriNetReferenceResource::new).collect(Collectors.toList())); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceWithMessage.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceWithMessage.java index fd2c5ca09be..1ebcabd98b1 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceWithMessage.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceWithMessage.java @@ -1,5 +1,6 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.adapter.spring.common.web.responsebodies.ResponseMessage; import lombok.Data; @@ -9,7 +10,7 @@ @Data public class PetriNetReferenceWithMessage extends ResponseMessage { - private PetriNetReference net; + private PetriNetReferenceDto net; public PetriNetReferenceWithMessage(String msg) { super(); @@ -19,14 +20,14 @@ public PetriNetReferenceWithMessage(String msg) { public PetriNetReferenceWithMessage(String msg, PetriNet net, Locale locale) { super(); setSuccess(msg); - setNet(new PetriNetReference(net, locale)); + setNet(PetriNetReferenceDto.fromPetriNet(net, locale)); } - public PetriNetReference getNet() { + public PetriNetReferenceDto getNet() { return net; } - public void setNet(PetriNetReference net) { + public void setNet(PetriNetReferenceDto net) { this.net = net; } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PlaceImportReference.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PlaceImportReference.java deleted file mode 100644 index 826cf8c7b17..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PlaceImportReference.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - -import com.netgrif.application.engine.objects.petrinet.domain.Node; -import com.netgrif.application.engine.objects.petrinet.domain.Place; -import lombok.Data; - -@Data -public class PlaceImportReference extends Node { - - private Integer tokens; - - private Boolean isStatic; - - public PlaceImportReference(Place place) { - this.setPosition(place.getPosition()); - this.setTitle(place.getTitle()); - this.setObjectId(place.getObjectId()); - this.setImportId(place.getImportId()); - this.tokens = place.getTokens(); - this.isStatic = place.getIsStatic(); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRole.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRole.java deleted file mode 100644 index b7cafaaae72..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRole.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - -import lombok.Data; - -@Data -public class ProcessRole { - - private String stringId; - - private String name; - - private String description; - - public ProcessRole(String id, String name, String description) { - this.stringId = id; - this.name = name; - this.description = description; - } - - public ProcessRole() { - } -} \ No newline at end of file diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRolesAndPermissions.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRolesAndPermissions.java index 2b91da348e2..c97890f3e3a 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRolesAndPermissions.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRolesAndPermissions.java @@ -1,5 +1,6 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.petrinet.ProcessRoleDto; import lombok.Data; import java.util.ArrayList; @@ -10,11 +11,11 @@ @Data public class ProcessRolesAndPermissions { - private List processRoles; + private List processRoles; private Map> permissions; - public ProcessRolesAndPermissions(List processRoles, Map> permissions) { + public ProcessRolesAndPermissions(List processRoles, Map> permissions) { this(); this.processRoles = processRoles; this.permissions.putAll(permissions); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRolesResource.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRolesResource.java index 30e459e9db1..9b16e90455e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRolesResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/ProcessRolesResource.java @@ -1,6 +1,7 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.petrinet.ProcessRoleDto; import com.netgrif.application.engine.petrinet.web.PetriNetController; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; @@ -19,8 +20,8 @@ public ProcessRolesResource(ProcessRolesAndPermissions content, String netId) { } public ProcessRolesResource(Collection content, Map> permissions, String netId, Locale locale) { - this(new ProcessRolesAndPermissions(content.stream().map(role -> new ProcessRole( - role.getStringId(), role.getName().getTranslation(locale), role.getDescription() + this(new ProcessRolesAndPermissions(content.stream().map(role -> new ProcessRoleDto( + role, locale )).collect(Collectors.toList()), permissions), netId); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/Reference.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/Reference.java deleted file mode 100644 index 615319f629b..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/Reference.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - -import lombok.Data; - -@Data -public class Reference { - - protected String stringId; - protected String title; - - public Reference() { - } - - public Reference(String stringId, String title) { - this.stringId = stringId; - this.title = title; - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/Transaction.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/Transaction.java deleted file mode 100644 index 984323e5091..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/Transaction.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - -import lombok.Data; - -import java.util.List; - -@Data -public class Transaction { - - private List transitions; - - private String title; - - public Transaction() { - } - - public Transaction(List transitions, String title) { - this.transitions = transitions; - this.title = title; - } -} \ No newline at end of file diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransactionResource.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransactionResource.java index a48f7559324..bbedee6bb15 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransactionResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransactionResource.java @@ -1,13 +1,15 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.petrinet.TransactionDto; +import com.netgrif.application.engine.objects.petrinet.domain.Transaction; import org.springframework.hateoas.EntityModel; import java.util.ArrayList; import java.util.Locale; -public class TransactionResource extends EntityModel { +public class TransactionResource extends EntityModel { - public TransactionResource(com.netgrif.application.engine.objects.petrinet.domain.Transaction content, Locale locale) { - super(new Transaction(content.getTransitions(), content.getTitle().getTranslation(locale)), new ArrayList<>()); + public TransactionResource(Transaction content, Locale locale) { + super(new TransactionDto(content.getTransitions(), content.getTitle().getTranslation(locale)), new ArrayList<>()); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionImportReference.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionImportReference.java deleted file mode 100644 index 8aeb4c70d5b..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionImportReference.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - -import com.netgrif.application.engine.objects.petrinet.domain.Node; -import com.netgrif.application.engine.objects.petrinet.domain.Transition; -import lombok.Data; - -@Data -public class TransitionImportReference extends Node { - - public TransitionImportReference(Transition transition) { - this.setPosition(transition.getPosition()); - this.setTitle(transition.getTitle()); - this.setObjectId(transition.getObjectId()); - this.setImportId(transition.getImportId()); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionReference.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionReference.java deleted file mode 100644 index 6b14e8c0439..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionReference.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.netgrif.application.engine.petrinet.web.responsebodies; - -import com.netgrif.application.engine.workflow.web.responsebodies.DataFieldReference; -import lombok.Data; - -import java.util.List; - -@Data -public class TransitionReference extends Reference { - - private String petriNetId; - - private List immediateData; - - public TransitionReference() { - super(); - } - - public TransitionReference(String id, String title, String petriNetId, List immediate) { - super(id, title); - this.petriNetId = petriNetId; - this.immediateData = immediate; - } - - public TransitionReference(String id, String title, PetriNetReference net) { - super(id, title); - this.petriNetId = net.getStringId(); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionReferencesResource.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionReferencesResource.java index 171ea104f23..576ef722e34 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionReferencesResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/TransitionReferencesResource.java @@ -1,17 +1,23 @@ package com.netgrif.application.engine.petrinet.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.petrinet.DataFieldReferenceDto; +import com.netgrif.application.engine.objects.dto.response.petrinet.TransitionReferenceDto; import com.netgrif.application.engine.petrinet.web.PetriNetController; -import com.netgrif.application.engine.petrinet.web.responsebodies.TransitionReference; import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.server.core.Relation; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; +import java.io.Serializable; import java.util.ArrayList; +import java.util.List; +import java.util.stream.StreamSupport; +public class TransitionReferencesResource extends CollectionModel { -public class TransitionReferencesResource extends CollectionModel { - - public TransitionReferencesResource(Iterable content) { - super(content); + public TransitionReferencesResource(Iterable content) { + super(StreamSupport.stream(content.spliterator(), false) + .map(TransitionReferenceWrapper::new) + .toList()); buildLinks(); } @@ -19,4 +25,30 @@ private void buildLinks() { add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(PetriNetController.class) .getTransitionReferences(new ArrayList<>(), null, null)).withSelfRel()); } + + @Relation(collectionRelation = "transitionReferences", itemRelation = "transitionReference") + public static class TransitionReferenceWrapper implements Serializable { + + private final TransitionReferenceDto delegate; + + public TransitionReferenceWrapper(TransitionReferenceDto dto) { + this.delegate = dto; + } + + public String getStringId() { + return delegate.stringId(); + } + + public String getTitle() { + return delegate.title(); + } + + public String getPetriNetId() { + return delegate.petriNetId(); + } + + public List getImmediateData() { + return delegate.immediateData(); + } + } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/CaseRepositoryImpl.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/CaseRepositoryImpl.java index 9e69bf4e24e..a061b31efee 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/CaseRepositoryImpl.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/CaseRepositoryImpl.java @@ -1,9 +1,8 @@ package com.netgrif.application.engine.workflow.domain.repositories; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; -import com.netgrif.application.engine.petrinet.web.responsebodies.Reference; import com.netgrif.application.engine.adapter.spring.workflow.domain.QCase; import com.netgrif.application.engine.objects.workflow.domain.QDataField; import com.querydsl.core.types.dsl.BooleanExpression; @@ -32,9 +31,9 @@ public void customize(QuerydslBindings bindings, QCase qCase) { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); // TODO: impersonation // List nets = petriNetService.getReferencesByUsersProcessRoles(((LoggedUser) auth.getPrincipal()).getSelfOrImpersonated(), null); - List nets = petriNetService.getReferencesByUsersProcessRoles(((LoggedUser) auth.getPrincipal()), null); - Set netIds = nets.stream().map(Reference::getStringId).collect(Collectors.toSet()); - Set netIdentifiers = nets.stream().map(PetriNetReference::getIdentifier).collect(Collectors.toSet()); + List nets = petriNetService.getReferencesByUsersProcessRoles(((LoggedUser) auth.getPrincipal()), null); + Set netIds = nets.stream().map(PetriNetReferenceDto::stringId).collect(Collectors.toSet()); + Set netIdentifiers = nets.stream().map(PetriNetReferenceDto::identifier).collect(Collectors.toSet()); bindings.bind(qCase.petriNetId).first((stringPath, s) -> { if (!netIds.contains(s)) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/CaseSearchService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/CaseSearchService.java index 923d17bfa54..15b5809006f 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/CaseSearchService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/CaseSearchService.java @@ -2,13 +2,13 @@ import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.importer.service.FieldFactory; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType; import com.netgrif.application.engine.objects.petrinet.domain.dataset.UserFieldValue; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; import com.netgrif.application.engine.utils.FullPageRequest; import com.netgrif.application.engine.objects.workflow.domain.Case; import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; @@ -140,7 +140,7 @@ public Predicate negativeViewUserQuery(String userId) { } public Predicate petriNet(Object query, LoggedUser user, Locale locale) { - List allowedNets = petriNetService.getReferencesByUsersProcessRoles(user, locale); + List allowedNets = petriNetService.getReferencesByUsersProcessRoles(user, locale); if (query instanceof ArrayList) { List expressions = (List) ((ArrayList) query).stream().filter(q -> q instanceof HashMap).map(q -> petriNetObject((HashMap) q, allowedNets)).collect(Collectors.toList()); return constructPredicateTree(expressions, BooleanBuilder::or); @@ -150,8 +150,8 @@ public Predicate petriNet(Object query, LoggedUser user, Locale locale) { return null; } - private static BooleanExpression petriNetObject(HashMap query, List allowedNets) { - if (query.containsKey(PETRINET_IDENTIFIER) && allowedNets.stream().anyMatch(net -> net.getIdentifier().equalsIgnoreCase(query.get(PETRINET_IDENTIFIER)))) + private static BooleanExpression petriNetObject(HashMap query, List allowedNets) { + if (query.containsKey(PETRINET_IDENTIFIER) && allowedNets.stream().anyMatch(net -> net.identifier().equalsIgnoreCase(query.get(PETRINET_IDENTIFIER)))) return QCase.case$.processIdentifier.equalsIgnoreCase(query.get(PETRINET_IDENTIFIER)); return null; } @@ -363,11 +363,11 @@ public Predicate group(Object query, LoggedUser user, Locale locale) { } else if (query instanceof String) { processQuery.setGroup(new ArrayList<>(Arrays.asList((String) query))); } - List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); - if (groupProcesses.size() == 0) + List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); + if (groupProcesses.isEmpty()) return null; - List processQueries = groupProcesses.stream().map(PetriNetReference::getIdentifier).map(QCase.case$.processIdentifier::eq).collect(Collectors.toList()); + List processQueries = groupProcesses.stream().map(PetriNetReferenceDto::identifier).map(QCase.case$.processIdentifier::eq).collect(Collectors.toList()); return constructPredicateTree(processQueries, BooleanBuilder::or); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/ConfigurableMenuService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/ConfigurableMenuService.java index 4ea645837cc..95a204bee5d 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/ConfigurableMenuService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/ConfigurableMenuService.java @@ -4,6 +4,7 @@ import com.netgrif.application.engine.objects.auth.domain.AbstractUser; import com.netgrif.application.engine.objects.auth.domain.ActorTransformer; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; @@ -13,7 +14,6 @@ import com.netgrif.application.engine.objects.petrinet.domain.version.Version; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; import com.netgrif.application.engine.utils.FullPageRequest; import com.netgrif.application.engine.workflow.service.interfaces.IConfigurableMenuService; import org.springframework.beans.factory.annotation.Autowired; @@ -59,15 +59,15 @@ public Map getNetsByAuthorAsMapOptions(AbstractUser author, LoggedUser loggedAuthor = ActorTransformer.toLoggedUser(author); PetriNetSearch requestQuery = new PetriNetSearch(); requestQuery.setAuthor(ActorTransformer.toActorRef(author)); - List nets = this.petriNetService.search(requestQuery, loggedAuthor, new FullPageRequest(), locale).getContent(); + List nets = this.petriNetService.search(requestQuery, loggedAuthor, new FullPageRequest(), locale).getContent(); Map options = new LinkedHashMap<>(); options.put("GLOBAL_ROLE", new I18nString("🌍 Global role")); - for (PetriNetReference net : nets) { - String[] versionSplit = net.getVersion().split("\\."); - I18nString titleAndVersion = new I18nString(net.getTitle() + " :" + net.getVersion()); - options.put(net.getIdentifier() + ":" + versionSplit[0] + "-" + versionSplit[1] + "-" + versionSplit[2], titleAndVersion); + for (PetriNetReferenceDto net : nets) { + String[] versionSplit = net.version().split("\\."); + I18nString titleAndVersion = new I18nString(net.title() + " :" + net.version()); + options.put(net.identifier() + ":" + versionSplit[0] + "-" + versionSplit[1] + "-" + versionSplit[2], titleAndVersion); } return options; diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java index 486dbe6f5b6..e2d264b4b39 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java @@ -1,9 +1,9 @@ package com.netgrif.application.engine.workflow.service; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; import com.netgrif.application.engine.utils.FullPageRequest; import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; import com.netgrif.application.engine.adapter.spring.workflow.domain.QTask; @@ -277,13 +277,13 @@ public boolean buildGroupQuery(TaskSearchRequest request, LoggedUser user, Local PetriNetSearch processQuery = new PetriNetSearch(); processQuery.setGroup(request.group); - List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); - if (groupProcesses.size() == 0) + List groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent(); + if (groupProcesses.isEmpty()) return true; query.and( constructPredicateTree( - groupProcesses.stream().map(PetriNetReference::getStringId).map(QTask.task.processId::eq).collect(Collectors.toList()), + groupProcesses.stream().map(PetriNetReferenceDto::stringId).map(QTask.task.processId::eq).collect(Collectors.toList()), BooleanBuilder::or ) ); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java index eafa862bf8c..8b4c518bead 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java @@ -7,6 +7,7 @@ import com.netgrif.application.engine.elastic.service.interfaces.IElasticTaskService; import com.netgrif.application.engine.elastic.web.requestbodies.singleaslist.SingleElasticTaskSearchRequestAsList; import com.netgrif.application.engine.eventoutcomes.LocalisedEventOutcomeFactory; +import com.netgrif.application.engine.objects.dto.response.task.TaskDto; import com.netgrif.application.engine.workflow.web.responsebodies.LocalisedTaskResource; import com.netgrif.application.engine.objects.petrinet.domain.throwable.TransitionNotExecutableException; import com.netgrif.application.engine.workflow.domain.IllegalArgumentWithChangedFieldsException; @@ -48,7 +49,7 @@ public abstract class AbstractTaskController { - public static final Logger log = LoggerFactory.getLogger(TaskController.class); + public static final Logger log = LoggerFactory.getLogger(AbstractTaskController.class); private final ITaskService taskService; @@ -76,7 +77,7 @@ public PagedModel getAll(Authentication auth, Pageable pa .getAll(auth, pageable, assembler, locale)).withRel("all"); PagedModel resources = assembler.toModel(page, new TaskResourceAssembler(locale), selfLink); ResourceLinkAssembler.addLinks(resources, Task.class, selfLink.getRel().toString()); - return PagedModel.of(page.stream().map(t -> new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), page.getTotalElements())); + return PagedModel.of(page.stream().map(t -> new LocalisedTaskResource(TaskDto.fromTask(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), page.getTotalElements())); } public PagedModel getAllByCases(List cases, Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { @@ -86,7 +87,7 @@ public PagedModel getAllByCases(List cases, Pagea .getAllByCases(cases, pageable, assembler, locale)).withRel("case"); PagedModel resources = assembler.toModel(page, new TaskResourceAssembler(locale), selfLink); ResourceLinkAssembler.addLinks(resources, Task.class, selfLink.getRel().toString()); - return PagedModel.of(page.stream().map(t -> new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), page.getTotalElements())); + return PagedModel.of(page.stream().map(t -> new LocalisedTaskResource(TaskDto.fromTask(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), page.getTotalElements())); } public List getTasksOfCase(String caseId, Locale locale) { @@ -97,7 +98,7 @@ public LocalisedTaskResource getOne(String taskId, Locale locale) { Task task = taskService.findById(taskId); if (task == null) return null; - return new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(task, locale)); + return new LocalisedTaskResource(TaskDto.fromTask(task, locale)); } public EntityModel assign(LoggedUser loggedUser, String taskId, Locale locale) { @@ -155,7 +156,7 @@ public PagedModel getMy(Authentication auth, Pageable pag .getMy(auth, pageable, assembler, locale)).withRel("my"); PagedModel resources = assembler.toModel(page, new TaskResourceAssembler(locale), selfLink); ResourceLinkAssembler.addLinks(resources, Task.class, selfLink.getRel().toString()); - return PagedModel.of(page.stream().map(t -> new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), page.getTotalElements())); + return PagedModel.of(page.stream().map(t -> new LocalisedTaskResource(TaskDto.fromTask(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), page.getTotalElements())); } public PagedModel getMyFinished(Pageable pageable, Authentication auth, PagedResourcesAssembler assembler, Locale locale) { @@ -164,7 +165,7 @@ public PagedModel getMyFinished(Pageable pageable, Authen .getMyFinished(pageable, auth, assembler, locale)).withRel("finished"); PagedModel resources = assembler.toModel(page, new TaskResourceAssembler(locale), selfLink); ResourceLinkAssembler.addLinks(resources, Task.class, selfLink.getRel().toString()); - return PagedModel.of(page.stream().map(t -> new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), page.getTotalElements())); + return PagedModel.of(page.stream().map(t -> new LocalisedTaskResource(TaskDto.fromTask(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), page.getTotalElements())); } public PagedModel search(Authentication auth, Pageable pageable, SingleTaskSearchRequestAsList searchBody, MergeFilterOperation operation, PagedResourcesAssembler assembler, Locale locale) { @@ -173,7 +174,7 @@ public PagedModel search(Authentication auth, Pageable pa .search(auth, pageable, searchBody, operation, assembler, locale)).withRel("search"); PagedModel resources = assembler.toModel(tasks, new TaskResourceAssembler(locale), selfLink); ResourceLinkAssembler.addLinks(resources, Task.class, selfLink.getRel().toString()); - return PagedModel.of(tasks.stream().map(t -> new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), tasks.getTotalElements())); + return PagedModel.of(tasks.stream().map(t -> new LocalisedTaskResource(TaskDto.fromTask(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), tasks.getTotalElements())); } public PagedModel searchPublic(LoggedUser loggedUser, Pageable pageable, SingleTaskSearchRequestAsList searchBody, MergeFilterOperation operation, PagedResourcesAssembler assembler, Locale locale) { @@ -182,7 +183,7 @@ public PagedModel searchPublic(LoggedUser loggedUser, Pag .searchPublic(loggedUser, pageable, searchBody, operation, assembler, locale)).withRel("search"); PagedModel resources = assembler.toModel(tasks, new TaskResourceAssembler(locale), selfLink); ResourceLinkAssembler.addLinks(resources, Task.class, selfLink.getRel().toString()); - return PagedModel.of(tasks.stream().map(t -> new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), tasks.getTotalElements())); + return PagedModel.of(tasks.stream().map(t -> new LocalisedTaskResource(TaskDto.fromTask(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), tasks.getTotalElements())); } public PagedModel searchElastic(Authentication auth, Pageable pageable, SingleElasticTaskSearchRequestAsList searchBody, MergeFilterOperation operation, PagedResourcesAssembler assembler, Locale locale) { @@ -191,7 +192,7 @@ public PagedModel searchElastic(Authentication auth, Page .searchElastic(auth, pageable, searchBody, operation, assembler, locale)).withRel("search_es"); PagedModel resources = assembler.toModel(tasks, new TaskResourceAssembler(locale), selfLink); ResourceLinkAssembler.addLinks(resources, Task.class, selfLink.getRel().toString()); - return PagedModel.of(tasks.stream().map(t -> new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), tasks.getTotalElements())); + return PagedModel.of(tasks.stream().map(t -> new LocalisedTaskResource(TaskDto.fromTask(t, locale))).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), tasks.getTotalElements())); } public CountResponse count(SingleElasticTaskSearchRequestAsList query, MergeFilterOperation operation, Authentication auth, Locale locale) { diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/PublicTaskController.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/PublicTaskController.java index e6623f3dd9f..b797fc7cf1a 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/PublicTaskController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/PublicTaskController.java @@ -50,14 +50,12 @@ public class PublicTaskController extends AbstractTaskController { final UserService userService; private final ITaskService taskService; - private final IDataService dataService; public PublicTaskController(ITaskService taskService, IDataService dataService, UserService userService) { super(taskService, dataService, null, userService); this.taskService = taskService; - this.dataService = dataService; this.userService = userService; } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java index bf932161134..0ffc47151c4 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java @@ -1,14 +1,14 @@ package com.netgrif.application.engine.workflow.web; -import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService; import com.netgrif.application.engine.elastic.web.requestbodies.singleaslist.SingleCaseSearchRequestAsList; import com.netgrif.application.engine.eventoutcomes.LocalisedEventOutcomeFactory; -import com.netgrif.application.engine.objects.elastic.domain.ElasticCase; +import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.objects.dto.response.workflow.CaseDto; import com.netgrif.application.engine.objects.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.MergeFilterOperation; import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.caseoutcomes.DeleteCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.MergeFilterOperation; import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessage; import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessageResource; import com.netgrif.application.engine.workflow.service.FileFieldInputStream; @@ -23,9 +23,9 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.core.io.InputStreamResource; @@ -47,10 +47,8 @@ import org.springframework.web.bind.annotation.*; import java.io.FileNotFoundException; -import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.Locale; import java.util.Map; @@ -66,17 +64,20 @@ public class WorkflowController { private static final Logger log = LoggerFactory.getLogger(WorkflowController.class.getName()); - @Autowired - private IWorkflowService workflowService; + private final IWorkflowService workflowService; + + private final ITaskService taskService; - @Autowired - private ITaskService taskService; + private final IElasticCaseService elasticCaseService; - @Autowired - private IElasticCaseService elasticCaseService; + private final IDataService dataService; - @Autowired - private IDataService dataService; + public WorkflowController(IWorkflowService workflowService, ITaskService taskService, IElasticCaseService elasticCaseService, IDataService dataService) { + this.workflowService = workflowService; + this.taskService = taskService; + this.elasticCaseService = elasticCaseService; + this.dataService = dataService; + } @PreAuthorize("@workflowAuthorizationService.canCallCreate(#auth.getPrincipal(), #body.netId)") @@ -86,7 +87,7 @@ public EntityModel createCase(@RequestBody CreateCaseBo LoggedUser loggedUser = (LoggedUser) auth.getPrincipal(); try { CreateCaseEventOutcome outcome = workflowService.createCase(body.netId, body.title, body.color, loggedUser, locale); - return EventOutcomeWithMessageResource.successMessage("Case with id " + outcome.getCase().getStringId() + " was created succesfully", + return EventOutcomeWithMessageResource.successMessage("Case with id " + outcome.getCase().getStringId() + " was created successfully", LocalisedEventOutcomeFactory.from(outcome, locale)); } catch (Exception e) { // TODO: 5. 2. 2017 change to custom exception log.error("Creating case failed:", e); @@ -96,49 +97,41 @@ public EntityModel createCase(@RequestBody CreateCaseBo @Operation(summary = "Get all cases of the system, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @GetMapping(value = "/all", produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel getAll(Pageable pageable, PagedResourcesAssembler assembler) { - Page cases = workflowService.getAll(pageable); + public PagedModel getAll(Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { + Page cases = workflowService.getAll(pageable).map(domainCase -> CaseDto.fromCase(domainCase, locale)); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) - .getAll(pageable, assembler)).withRel("all"); - PagedModel resources = assembler.toModel(cases, new CaseResourceAssembler(), selfLink); - ResourceLinkAssembler.addLinks(resources, Case.class, selfLink.getRel().toString()); - return PagedModel.of(cases.stream().map(CaseResource::new).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), cases.getTotalElements())); + .getAll(pageable, assembler, locale)).withRel("all"); + return buildResponse(assembler, cases, selfLink); } @Operation(summary = "Generic case search with QueryDSL predicate, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @PostMapping(value = "/case/search2", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel search2(@QuerydslPredicate(root = Case.class) Predicate predicate, Pageable pageable, PagedResourcesAssembler assembler) { - Page cases = workflowService.search(predicate, pageable); + public PagedModel search2(@QuerydslPredicate(root = Case.class) Predicate predicate, Pageable pageable, + PagedResourcesAssembler assembler, Locale locale) { + Page cases = workflowService.search(predicate, pageable).map(domainCase -> CaseDto.fromCase(domainCase, locale)); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) - .search2(predicate, pageable, assembler)).withRel("search2"); - PagedModel resources = assembler.toModel(cases, new CaseResourceAssembler(), selfLink); - ResourceLinkAssembler.addLinks(resources, Case.class, selfLink.getRel().toString()); - return PagedModel.of(cases.stream().map(CaseResource::new).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), cases.getTotalElements())); + .search2(predicate, pageable, assembler, locale)).withRel("search2"); + return buildResponse(assembler, cases, selfLink); } @Operation(summary = "Generic case search on Elasticsearch database, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @PostMapping(value = "/case/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel search(@RequestBody SingleCaseSearchRequestAsList searchBody, @RequestParam(defaultValue = "OR") MergeFilterOperation operation, Pageable pageable, PagedResourcesAssembler assembler, Authentication auth, Locale locale) { + public PagedModel search(@RequestBody SingleCaseSearchRequestAsList searchBody, @RequestParam(defaultValue = "OR") MergeFilterOperation operation, Pageable pageable, PagedResourcesAssembler assembler, Authentication auth, Locale locale) { LoggedUser user = (LoggedUser) auth.getPrincipal(); - Page cases = elasticCaseService.search(searchBody.getList(), user, pageable, locale, operation == MergeFilterOperation.AND); + Page cases = elasticCaseService.search(searchBody.getList(), user, pageable, locale, operation == MergeFilterOperation.AND).map(domainCase -> CaseDto.fromCase(domainCase, locale)); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) .search(searchBody, operation, pageable, assembler, auth, locale)).withRel("search"); - - PagedModel resources = assembler.toModel(cases, new CaseResourceAssembler(), selfLink); - ResourceLinkAssembler.addLinks(resources, ElasticCase.class, selfLink.getRel().toString()); - return PagedModel.of(cases.stream().map(CaseResource::new).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), cases.getTotalElements())); + return buildResponse(assembler, cases, selfLink); } @Operation(summary = "Generic case search on Mongo database, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @PostMapping(value = "/case/search_mongo", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel searchMongo(@RequestBody Map searchBody, Pageable pageable, Authentication auth, PagedResourcesAssembler assembler, Locale locale) { - Page cases = workflowService.search(searchBody, pageable, (LoggedUser) auth.getPrincipal(), locale); + public PagedModel searchMongo(@RequestBody Map searchBody, Pageable pageable, Authentication auth, PagedResourcesAssembler assembler, Locale locale) { + Page cases = workflowService.search(searchBody, pageable, (LoggedUser) auth.getPrincipal(), locale).map(domainCase -> CaseDto.fromCase(domainCase, locale)); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) .searchMongo(searchBody, pageable, auth, assembler, locale)).withRel("search"); - PagedModel resources = assembler.toModel(cases, new CaseResourceAssembler(), selfLink); - ResourceLinkAssembler.addLinks(resources, Case.class, selfLink.getRel().toString()); - return PagedModel.of(cases.stream().map(CaseResource::new).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), cases.getTotalElements())); + return buildResponse(assembler, cases, selfLink); } @@ -151,22 +144,20 @@ public CountResponse count(@RequestBody SingleCaseSearchRequestAsList searchBody @Operation(summary = "Get case by id", security = {@SecurityRequirement(name = "BasicAuth")}) @GetMapping(value = "/case/{id}", produces = MediaTypes.HAL_JSON_VALUE) - public CaseResource getOne(@PathVariable("id") String caseId) { + public CaseResource getOne(@PathVariable("id") String caseId, Locale locale) { Case aCase = workflowService.findOne(caseId); if (aCase == null) return null; - return new CaseResource(aCase); + return new CaseResource(CaseDto.fromCase(aCase, locale)); } @Operation(summary = "Get all cases by user that created them, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @RequestMapping(value = "/case/author/{id}", method = RequestMethod.POST, consumes = MediaType.TEXT_PLAIN_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel findAllByAuthor(@PathVariable("id") String authorId, @RequestBody String petriNet, PagedResourcesAssembler assembler, Pageable pageable) { - Page cases = workflowService.findAllByAuthor(authorId, petriNet, pageable); + public PagedModel findAllByAuthor(@PathVariable("id") String authorId, @RequestBody String petriNet, PagedResourcesAssembler assembler, Pageable pageable, Locale locale) { + Page cases = workflowService.findAllByAuthor(authorId, petriNet, pageable).map(domainCase -> CaseDto.fromCase(domainCase, locale)); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) - .findAllByAuthor(authorId, petriNet, assembler, pageable)).withRel("author"); - PagedModel resources = assembler.toModel(cases, new CaseResourceAssembler(), selfLink); - ResourceLinkAssembler.addLinks(resources, Case.class, selfLink.getRel().toString()); - return PagedModel.of(cases.stream().map(CaseResource::new).toList(), new PagedModel.PageMetadata(pageable.getPageSize(), pageable.getPageNumber(), cases.getTotalElements())); + .findAllByAuthor(authorId, petriNet, assembler, pageable, locale)).withRel("author"); + return buildResponse(assembler, cases, selfLink); } @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") @@ -180,13 +171,13 @@ public PagedModel findAllByAuthor(@PathVariable("id") String autho }) public MessageResource reloadTasks(@PathVariable("id") String caseId) { try { - caseId = URLDecoder.decode(caseId, StandardCharsets.UTF_8.name()); + caseId = URLDecoder.decode(caseId, StandardCharsets.UTF_8); Case aCase = workflowService.findOne(caseId); taskService.reloadTasks(aCase); return MessageResource.successMessage("Task reloaded in case [" + caseId + "]"); } catch (Exception e) { - log.error("Reloading tasks of case [" + caseId + "] failed:", e); + log.error("Reloading tasks of case [{}] failed:", caseId, e); return MessageResource.errorMessage("Reloading tasks in case " + caseId + " has failed!"); } } @@ -209,20 +200,15 @@ public MessageResource reloadTasks(@PathVariable("id") String caseId) { @Operation(summary = "Delete case", security = {@SecurityRequirement(name = "BasicAuth")}) @DeleteMapping(value = "/case/{id}", produces = MediaTypes.HAL_JSON_VALUE) public EntityModel deleteCase(Authentication auth, @PathVariable("id") String caseId, @RequestParam(defaultValue = "false") boolean deleteSubtree) { - try { - caseId = URLDecoder.decode(caseId, StandardCharsets.UTF_8.name()); - DeleteCaseEventOutcome outcome; - if (deleteSubtree) { - outcome = workflowService.deleteSubtreeRootedAt(caseId); - } else { - outcome = workflowService.deleteCase(caseId); - } - return EventOutcomeWithMessageResource.successMessage("Case " + caseId + " was deleted", - LocalisedEventOutcomeFactory.from(outcome, LocaleContextHolder.getLocale())); - } catch (UnsupportedEncodingException e) { - log.error("Deleting case [" + caseId + "] failed:", e); - return EventOutcomeWithMessageResource.errorMessage("Deleting case " + caseId + " has failed!"); + caseId = URLDecoder.decode(caseId, StandardCharsets.UTF_8); + DeleteCaseEventOutcome outcome; + if (deleteSubtree) { + outcome = workflowService.deleteSubtreeRootedAt(caseId); + } else { + outcome = workflowService.deleteCase(caseId); } + return EventOutcomeWithMessageResource.successMessage("Case " + caseId + " was deleted", + LocalisedEventOutcomeFactory.from(outcome, LocaleContextHolder.getLocale())); } @Operation(summary = "Download case file field value", security = {@SecurityRequirement(name = "BasicAuth")}) @@ -260,4 +246,11 @@ public ResponseEntity getFileByName(@PathVariable("id") String caseId, .headers(headers) .body(new InputStreamResource(fileFieldInputStream.getInputStream())); } + + @NotNull + private PagedModel buildResponse(PagedResourcesAssembler assembler, Page cases, Link selfLink) { + PagedModel resources = assembler.toModel(cases, new CaseResourceAssembler(), selfLink); + ResourceLinkAssembler.addLinks(resources, Case.class, selfLink.getRel().toString()); + return resources; + } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResource.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResource.java index dcd0a65f416..fe7a9e1702e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResource.java @@ -1,19 +1,28 @@ package com.netgrif.application.engine.workflow.web.responsebodies; -import com.netgrif.application.engine.objects.workflow.domain.Case; +import com.fasterxml.jackson.annotation.JsonUnwrapped; +import com.netgrif.application.engine.objects.dto.response.workflow.CaseDto; import com.netgrif.application.engine.workflow.web.WorkflowController; import com.netgrif.application.engine.workflow.web.requestbodies.CreateCaseBody; +import lombok.Getter; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.RepresentationModel; +import org.springframework.hateoas.server.core.Relation; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import java.util.ArrayList; -public class CaseResource extends EntityModel { +@Getter +@Relation(collectionRelation = "cases", itemRelation = "case") +public class CaseResource extends RepresentationModel { - public CaseResource(Case content) { - super(content, new ArrayList<>()); + @JsonUnwrapped + private final CaseDto content; + + public CaseResource(CaseDto content) { + this.content = content; buildLinks(); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResourceAssembler.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResourceAssembler.java index bb6484e8921..fc45a4d4b56 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResourceAssembler.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResourceAssembler.java @@ -1,12 +1,12 @@ package com.netgrif.application.engine.workflow.web.responsebodies; -import com.netgrif.application.engine.objects.workflow.domain.Case; +import com.netgrif.application.engine.objects.dto.response.workflow.CaseDto; import org.springframework.hateoas.server.RepresentationModelAssembler; -public class CaseResourceAssembler implements RepresentationModelAssembler { +public class CaseResourceAssembler implements RepresentationModelAssembler { @Override - public CaseResource toModel(Case aCase) { + public CaseResource toModel(CaseDto aCase) { return new CaseResource(aCase); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/DataFieldReference.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/DataFieldReference.java deleted file mode 100644 index 6fc6e4ee7f3..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/DataFieldReference.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.netgrif.application.engine.workflow.web.responsebodies; - -import com.netgrif.application.engine.objects.petrinet.domain.dataset.Field; -import com.netgrif.application.engine.petrinet.web.responsebodies.Reference; -import lombok.Data; - -import java.util.Locale; - -@Data -public class DataFieldReference extends Reference { - - private String type; - - public DataFieldReference() { - super(); - } - - public DataFieldReference(String stringId, String title, String type) { - super(stringId, title); - this.type = type; - } - - public DataFieldReference(Field field, Locale locale) { - this(field.getStringId(), field.getTranslatedName(locale), field.getType().getName()); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/ElasticTaskResourceAssembler.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/ElasticTaskResourceAssembler.java deleted file mode 100644 index f884184dbdd..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/ElasticTaskResourceAssembler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.netgrif.application.engine.workflow.web.responsebodies; - -import com.netgrif.application.engine.objects.elastic.domain.ElasticTask; -import org.springframework.hateoas.server.RepresentationModelAssembler; - -public class ElasticTaskResourceAssembler implements RepresentationModelAssembler { - - @Override - public LocalisedTaskResource toModel(ElasticTask entity) { - return new LocalisedTaskResource(new Task(entity)); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/LocalisedTaskResource.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/LocalisedTaskResource.java index 36b0ce5d636..d0d0eb31e4c 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/LocalisedTaskResource.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/LocalisedTaskResource.java @@ -1,45 +1,52 @@ package com.netgrif.application.engine.workflow.web.responsebodies; +import com.fasterxml.jackson.annotation.JsonUnwrapped; +import com.netgrif.application.engine.objects.dto.response.task.TaskDto; import com.netgrif.application.engine.workflow.web.TaskController; +import lombok.Getter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.hateoas.EntityModel; -import org.springframework.hateoas.Link; +import org.springframework.hateoas.RepresentationModel; +import org.springframework.hateoas.server.core.Relation; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.security.core.Authentication; import java.io.FileNotFoundException; -import java.util.ArrayList; -public class LocalisedTaskResource extends EntityModel { +@Getter +@Relation(collectionRelation = "tasks", itemRelation = "task") +public class LocalisedTaskResource extends RepresentationModel { public static final Logger log = LoggerFactory.getLogger(LocalisedTaskResource.class); - public LocalisedTaskResource(Task content) { - super(content, new ArrayList()); + @JsonUnwrapped + private final TaskDto content; + + public LocalisedTaskResource(TaskDto content) { + this.content = content; buildLinks(); } private void buildLinks() { - Task task = getContent(); + TaskDto taskDto = getContent(); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(TaskController.class) - .getOne(task.getStringId(), null)).withSelfRel()); + .getOne(taskDto.stringId(), null)).withSelfRel()); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(TaskController.class) - .assign((Authentication) null, task.getStringId(), null)).withRel("assign")); + .assign((Authentication) null, taskDto.stringId(), null)).withRel("assign")); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(TaskController.class) - .delegate((Authentication) null, task.getStringId(), null, null)).withRel("delegate")); + .delegate((Authentication) null, taskDto.stringId(), null, null)).withRel("delegate")); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(TaskController.class) - .finish((Authentication) null, task.getStringId(), null)).withRel("finish")); + .finish((Authentication) null, taskDto.stringId(), null)).withRel("finish")); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(TaskController.class) - .cancel((Authentication) null, task.getStringId(), null)).withRel("cancel")); + .cancel((Authentication) null, taskDto.stringId(), null)).withRel("cancel")); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(TaskController.class) - .getData(task.getStringId(), null)).withRel("data")); + .getData(taskDto.stringId(), null)).withRel("data")); add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(TaskController.class) - .setData(task.getStringId(), null, null)).withRel("data-edit")); + .setData(taskDto.stringId(), null, null)).withRel("data-edit")); try { add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(TaskController.class) - .getFile(task.getStringId(), "")).withRel("file")); + .getFile(taskDto.stringId(), "")).withRel("file")); } catch (FileNotFoundException e) { log.error("Building links failed: ", e); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/ResourceLinkAssembler.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/ResourceLinkAssembler.java index 401b8306bbb..438364c3576 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/ResourceLinkAssembler.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/ResourceLinkAssembler.java @@ -2,8 +2,8 @@ import com.netgrif.application.engine.objects.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.MergeFilterOperation; import com.netgrif.application.engine.objects.workflow.domain.Task; +import com.netgrif.application.engine.workflow.domain.MergeFilterOperation; import com.netgrif.application.engine.workflow.web.TaskController; import com.netgrif.application.engine.workflow.web.WorkflowController; import org.springframework.hateoas.PagedModel; @@ -45,7 +45,7 @@ private static void addTasksLinks(PagedModel pagedResources, String selfRel) { private static void addCasesLinks(PagedModel pagedResources, String selfRel) { if (!selfRel.equalsIgnoreCase("all")) pagedResources.add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) - .getAll(null, null)).withRel("all")); + .getAll(null, null, null)).withRel("all")); if (!selfRel.equalsIgnoreCase("search")) pagedResources.add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) .search(null, MergeFilterOperation.OR, null, null, null, null)).withRel("search")); @@ -54,7 +54,7 @@ private static void addCasesLinks(PagedModel pagedResources, String selfRel) { .count(null, MergeFilterOperation.OR, null, null)).withRel("count")); if (!selfRel.equalsIgnoreCase("author")) pagedResources.add(WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) - .findAllByAuthor(null, "", null, null)).withRel("author")); + .findAllByAuthor(null, "", null, null, null)).withRel("author")); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java deleted file mode 100644 index b226b7e8895..00000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.netgrif.application.engine.workflow.web.responsebodies; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.netgrif.application.engine.objects.elastic.domain.ElasticTask; -import com.netgrif.application.engine.objects.petrinet.domain.dataset.Field; -import com.netgrif.application.engine.objects.petrinet.domain.events.EventType; -import com.netgrif.application.engine.objects.petrinet.domain.layout.TaskLayout; -import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -/** - * Localised task data object - */ -@Data -public class Task { - - @JsonIgnore - private ProcessResourceId _id; - - private String caseId; - - private String transitionId; - - private TaskLayout layout; - - private String title; - - private String caseColor; - - private String caseTitle; - - private Integer priority; - - private String userId; - - private String userRealmId; - - private Map> roles; - - private Map> users; - - private LocalDateTime startDate; - - private LocalDateTime finishDate; - - private String finishedBy; - - private String transactionId; - - private Boolean requiredFilled; - - private List> immediateData; - - private String icon; - - private String assignPolicy; - - private String dataFocusPolicy; - - private String finishPolicy; - - private String finishTitle; - - private String cancelTitle; - - private String delegateTitle; - - private String assignTitle; - - private Map assignedUserPolicy; - - private Map tags; - - public Task(com.netgrif.application.engine.objects.workflow.domain.Task task, Locale locale) { - this._id = task.getObjectId(); - this.caseId = task.getCaseId(); - this.transitionId = task.getTransitionId(); - this.layout = task.getLayout(); - this.title = task.getTitle().getTranslation(locale); - this.caseColor = task.getCaseColor(); - this.caseTitle = task.getCaseTitle(); - this.priority = task.getPriority(); - this.userId = task.getUser() != null ? task.getUser().getStringId() : null; - this.userRealmId = task.getUser() != null ? task.getUser().getRealmId() : null; - this.roles = task.getRoles(); - this.users = task.getUsers(); - this.startDate = task.getStartDate(); - this.finishDate = task.getFinishDate(); - this.finishedBy = task.getFinishedBy(); - this.transactionId = task.getTransactionId(); - this.requiredFilled = task.getRequiredFilled(); - this.immediateData = task.getImmediateData(); - this.icon = task.getIcon(); - this.assignPolicy = task.getAssignPolicy().toString(); - this.dataFocusPolicy = task.getDataFocusPolicy().toString(); - this.finishPolicy = task.getFinishPolicy().toString(); - this.finishTitle = task.getTranslatedEventTitle(EventType.FINISH, locale); - this.assignTitle = task.getTranslatedEventTitle(EventType.ASSIGN, locale); - this.cancelTitle = task.getTranslatedEventTitle(EventType.CANCEL, locale); - this.delegateTitle = task.getTranslatedEventTitle(EventType.DELEGATE, locale); - this.assignedUserPolicy = task.getAssignedUserPolicy(); - this.tags = task.getTags(); - } - - public Task(ElasticTask entity) { - _id = new ProcessResourceId(entity.getId()); - caseId = entity.getCaseId(); - transitionId = entity.getTransitionId(); - title = entity.getTitle().getDefaultValue(); - caseTitle = entity.getCaseTitle(); - priority = entity.getPriority(); - } - - public String getStringId() { - return _id.toString(); - } -} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/TaskResourceAssembler.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/TaskResourceAssembler.java index f2d9e0693b8..979ae10c8b6 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/TaskResourceAssembler.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/TaskResourceAssembler.java @@ -1,5 +1,6 @@ package com.netgrif.application.engine.workflow.web.responsebodies; +import com.netgrif.application.engine.objects.dto.response.task.TaskDto; import com.netgrif.application.engine.objects.workflow.domain.Task; import org.springframework.hateoas.server.RepresentationModelAssembler; @@ -15,6 +16,6 @@ public TaskResourceAssembler(Locale locale) { @Override public LocalisedTaskResource toModel(com.netgrif.application.engine.objects.workflow.domain.Task task) { - return new LocalisedTaskResource(new com.netgrif.application.engine.workflow.web.responsebodies.Task(task, locale)); + return new LocalisedTaskResource(TaskDto.fromTask(task, locale)); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedCaseEventOutcome.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedCaseEventOutcome.java index 345341939f6..a6f69112498 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedCaseEventOutcome.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedCaseEventOutcome.java @@ -1,31 +1,28 @@ package com.netgrif.application.engine.workflow.web.responsebodies.eventoutcomes.base; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; +import com.netgrif.application.engine.objects.dto.response.workflow.CaseDto; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.workflow.domain.Case; import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.caseoutcomes.CaseEventOutcome; +import lombok.Getter; +import lombok.Setter; import java.util.List; import java.util.Locale; public abstract class LocalisedCaseEventOutcome extends LocalisedPetriNetEventOutcome { - private Case aCase; + @Getter + @Setter + private CaseDto aCase; protected LocalisedCaseEventOutcome(CaseEventOutcome outcome, Locale locale) { super(outcome, locale); - this.aCase = outcome.getCase(); + this.aCase = CaseDto.fromCase(outcome.getCase(), locale); } protected LocalisedCaseEventOutcome(String message, List outcomes, Locale locale, Case aCase) { - super(message, outcomes, new PetriNetReference(aCase.getPetriNet(), locale)); - this.aCase = aCase; - } - - public Case getaCase() { - return aCase; - } - - public void setaCase(Case aCase) { - this.aCase = aCase; + super(message, outcomes, PetriNetReferenceDto.fromPetriNet(aCase.getPetriNet(), locale)); + this.aCase = CaseDto.fromCase(aCase, locale); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedPetriNetEventOutcome.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedPetriNetEventOutcome.java index 12889dcefbb..f76a7d9c511 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedPetriNetEventOutcome.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedPetriNetEventOutcome.java @@ -1,30 +1,26 @@ package com.netgrif.application.engine.workflow.web.responsebodies.eventoutcomes.base; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto; import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.petrinetoutcomes.PetriNetEventOutcome; +import lombok.Getter; +import lombok.Setter; import java.util.List; import java.util.Locale; public abstract class LocalisedPetriNetEventOutcome extends LocalisedEventOutcome { - private PetriNetReference net; + @Getter + @Setter + private PetriNetReferenceDto net; protected LocalisedPetriNetEventOutcome(PetriNetEventOutcome outcome, Locale locale) { super(outcome, locale); - this.net = new PetriNetReference(outcome.getNet(), locale); + this.net = PetriNetReferenceDto.fromPetriNet(outcome.getNet(), locale); } - protected LocalisedPetriNetEventOutcome(String message, List outcomes, PetriNetReference net) { + protected LocalisedPetriNetEventOutcome(String message, List outcomes, PetriNetReferenceDto net) { super(message, outcomes); this.net = net; } - - public PetriNetReference getNet() { - return net; - } - - public void setNet(PetriNetReference net) { - this.net = net; - } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedTaskEventOutcome.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedTaskEventOutcome.java index 39441c303d6..12a1951d6a8 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedTaskEventOutcome.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/eventoutcomes/base/LocalisedTaskEventOutcome.java @@ -1,31 +1,31 @@ package com.netgrif.application.engine.workflow.web.responsebodies.eventoutcomes.base; +import com.netgrif.application.engine.objects.dto.response.task.TaskDto; import com.netgrif.application.engine.objects.workflow.domain.Case; import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome; -import com.netgrif.application.engine.workflow.web.responsebodies.Task; import java.util.List; import java.util.Locale; public abstract class LocalisedTaskEventOutcome extends LocalisedCaseEventOutcome { - private Task task; + private TaskDto taskDto; protected LocalisedTaskEventOutcome(TaskEventOutcome outcome, Locale locale) { super(outcome, locale); - this.task = outcome.getTask() == null ? null : new Task(outcome.getTask(), locale); + this.taskDto = outcome.getTask() == null ? null : TaskDto.fromTask(outcome.getTask(), locale); } protected LocalisedTaskEventOutcome(String message, List outcomes, Locale locale, Case aCase, com.netgrif.application.engine.objects.workflow.domain.Task task) { super(message, outcomes, locale, aCase); - this.task = task == null ? null : new Task(task, locale); + this.taskDto = task == null ? null : TaskDto.fromTask(task, locale); } - public Task getTask() { - return task; + public TaskDto getTask() { + return taskDto; } - public void setTask(Task task) { - this.task = task; + public void setTask(TaskDto taskDto) { + this.taskDto = taskDto; } } diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy index 19b9b76ec8b..7f0558bfe74 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy @@ -2,6 +2,7 @@ package com.netgrif.application.engine.petrinet.domain import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.importer.service.Importer +import com.netgrif.application.engine.objects.dto.response.petrinet.PetriNetReferenceDto import com.netgrif.application.engine.objects.petrinet.domain.PetriNet import com.netgrif.application.engine.objects.petrinet.domain.VersionType import com.netgrif.application.engine.objects.petrinet.domain.arcs.Arc @@ -10,7 +11,6 @@ import com.netgrif.application.engine.objects.petrinet.domain.arcs.ReadArc import com.netgrif.application.engine.objects.petrinet.domain.arcs.ResetArc import com.netgrif.application.engine.petrinet.domain.roles.ProcessRoleRepository import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference import com.netgrif.application.engine.startup.runner.SuperCreatorRunner import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -97,7 +97,7 @@ class PetriNetTest { def netOptional3 = petriNetService.importPetriNet(netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper) assert netOptional3.getNet() != null - Page nets = petriNetService.getReferencesByVersion(null, superCreator.loggedSuper, Locale.UK, Pageable.unpaged()) + Page nets = petriNetService.getReferencesByVersion(null, superCreator.loggedSuper, Locale.UK, Pageable.unpaged()) assert nets.findAll { it.identifier in [netOptional.getNet().identifier, netOptional3.getNet().identifier] }.size() == 2 assert nets.find { it.identifier == "new_model" }.version == "1.0.0" assert nets.find { it.identifier == "test" }.version == "2.0.0" @@ -122,7 +122,7 @@ class PetriNetTest { def lastImport = petriNetService.importPetriNet(netResource4.inputStream, VersionType.PATCH, superCreator.loggedSuper) assert lastImport.getNet().version.toString() == "3.1.1" - Page nets = petriNetService.getByIdentifier(zeroImport.getNet().identifier, Pageable.unpaged()) + Page nets = petriNetService.getByIdentifier(zeroImport.getNet().identifier, Pageable.unpaged()) assert nets.getSize() == 5 } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/dto/AuthoritySearchDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/dto/AuthoritySearchDto.java deleted file mode 100644 index 45c5ff31253..00000000000 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/dto/AuthoritySearchDto.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.netgrif.application.engine.objects.auth.dto; - -import lombok.Data; - -@Data -public class AuthoritySearchDto { - private String fullText; -} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/dto/GroupSearchDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/dto/GroupSearchDto.java deleted file mode 100644 index a8560fabf19..00000000000 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/dto/GroupSearchDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.netgrif.application.engine.objects.auth.dto; - -import lombok.Data; - -@Data -public class GroupSearchDto { - private String fullText; - private String realmId; -} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/PreferencesDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/PreferencesDto.java new file mode 100644 index 00000000000..9b1d2143750 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/PreferencesDto.java @@ -0,0 +1,22 @@ +package com.netgrif.application.engine.objects.dto; + +import com.netgrif.application.engine.objects.preferences.Preferences; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * DTO for {@link Preferences} + */ +public record PreferencesDto(String userId, String locale, int drawerWidth, + Map> taskFilters, + Map> caseFilters, + Map> headers) implements Serializable{ + + public static PreferencesDto fromPreferences(Preferences preferences) { + return new PreferencesDto(preferences.getUserId(), preferences.getLocale(), + preferences.getDrawerWidth(), preferences.getTaskFilters(), preferences.getCaseFilters(), + preferences.getHeaders()); + } +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/authority/AuthoritySearchRequestDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/authority/AuthoritySearchRequestDto.java new file mode 100644 index 00000000000..8accca087db --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/authority/AuthoritySearchRequestDto.java @@ -0,0 +1,9 @@ +package com.netgrif.application.engine.objects.dto.request.authority; + +import java.io.Serializable; + +/** + * DTO for {@link com.netgrif.application.engine.objects.auth.domain.Authority} search request + */ +public record AuthoritySearchRequestDto(String fullText) implements Serializable { +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/group/CreateGroupRequestDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/group/CreateGroupRequestDto.java new file mode 100644 index 00000000000..c81d990ea02 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/group/CreateGroupRequestDto.java @@ -0,0 +1,6 @@ +package com.netgrif.application.engine.objects.dto.request.group; + +import java.io.Serializable; + +public record CreateGroupRequestDto(String displayName, String realmId, String identifier, String ownerId) implements Serializable { +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/group/GroupSearchRequestDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/group/GroupSearchRequestDto.java new file mode 100644 index 00000000000..8095146c9b5 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/group/GroupSearchRequestDto.java @@ -0,0 +1,10 @@ +package com.netgrif.application.engine.objects.dto.request.group; + +import com.netgrif.application.engine.objects.auth.domain.Group; + +import java.io.Serializable; + +/** + * DTO for {@link Group} search request + */ +public record GroupSearchRequestDto(String fullText, String realmId) implements Serializable { } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/impersonation/ImpersonationSearchRequestDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/impersonation/ImpersonationSearchRequestDto.java new file mode 100644 index 00000000000..2175b91cdc2 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/impersonation/ImpersonationSearchRequestDto.java @@ -0,0 +1,6 @@ +package com.netgrif.application.engine.objects.dto.request.impersonation; + +import java.io.Serializable; + +public record ImpersonationSearchRequestDto(String query) implements Serializable { +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/realm/RealmSearchDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/realm/RealmSearchDto.java new file mode 100644 index 00000000000..bc41623192a --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/realm/RealmSearchDto.java @@ -0,0 +1,15 @@ +package com.netgrif.application.engine.objects.dto.request.realm; + +import java.io.Serializable; + +public record RealmSearchDto(String id, + String name, + String description, + Boolean defaultRealm, + Boolean adminRealm, + Boolean enableBlocking, + Integer maxFailedAttempts, + Integer blockDurationMinutes, + Boolean enableLimitSessions, + Integer maxSessionsAllowed) implements Serializable { +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequest.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequest.java new file mode 100644 index 00000000000..485017512dc --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequest.java @@ -0,0 +1,6 @@ +package com.netgrif.application.engine.objects.dto.request.user; + +import java.io.Serializable; + +public record UserCreateRequest(String username, String email, String firstName, String lastName, String password) implements Serializable { +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserSearchRequestBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserSearchRequestBody.java new file mode 100644 index 00000000000..320821bbc85 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserSearchRequestBody.java @@ -0,0 +1,18 @@ +package com.netgrif.application.engine.objects.dto.request.user; + +import java.io.Serializable; +import java.util.List; + +/** + * Represents the request body for searching users with specific criteria. + * + * @param fulltext A full-text search string to filter the users. + * The search is typically applied to user attributes like name, username, or email. + * @param realmId The ID of the realm in which to search for users. + * This field is used to scope the search to a particular multi-tenancy realm. + * @param roles A list of roles the users must have. + * The search will include users who possess all the specified roles. + */ +public record UserSearchRequestBody(String realmId, String fulltext, List roles +) implements Serializable { +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/authority/AuthorityDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/authority/AuthorityDto.java new file mode 100644 index 00000000000..bea583d166b --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/authority/AuthorityDto.java @@ -0,0 +1,17 @@ +package com.netgrif.application.engine.objects.dto.response.authority; + +import com.netgrif.application.engine.objects.auth.domain.Authority; +import org.bson.types.ObjectId; + +import java.io.Serializable; + +/** + * DTO for {@link Authority} + */ +public record AuthorityDto(ObjectId id, String name) implements Serializable { + + public static AuthorityDto fromAuthority(Authority authority) { + return new AuthorityDto(authority.get_id(), authority.getName()); + } + +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/group/GroupDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/group/GroupDto.java new file mode 100644 index 00000000000..7b7994aea9d --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/group/GroupDto.java @@ -0,0 +1,21 @@ +package com.netgrif.application.engine.objects.dto.response.group; + +import com.netgrif.application.engine.objects.auth.domain.Group; +import com.netgrif.application.engine.objects.dto.response.authority.AuthorityDto; +import com.netgrif.application.engine.objects.dto.response.petrinet.ProcessRoleDto; + +import java.io.Serializable; +import java.util.Locale; +import java.util.Set; +import java.util.stream.Collectors; + +public record GroupDto(String id, String displayName, String identifier, String ownerUsername, + Set authoritySet, Set processRoles) implements Serializable { + + public static GroupDto fromGroup(Group group, Locale locale) { + return new GroupDto(group.getStringId(), group.getDisplayName(), group.getIdentifier(), group.getOwnerUsername(), + group.getAuthoritySet().stream().map(AuthorityDto::fromAuthority).collect(Collectors.toSet()), + group.getProcessRoles().stream().map(processRole -> new ProcessRoleDto(processRole, locale)).collect(Collectors.toSet()) + ); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/impersonation/ImpersonationNotAvailableResponseDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/impersonation/ImpersonationNotAvailableResponseDto.java new file mode 100644 index 00000000000..0695416eba7 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/impersonation/ImpersonationNotAvailableResponseDto.java @@ -0,0 +1,6 @@ +package com.netgrif.application.engine.objects.dto.response.impersonation; + +import java.io.Serializable; + +public record ImpersonationNotAvailableResponseDto(boolean alreadyImpersonated) implements Serializable { +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/ArcImportReferenceDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/ArcImportReferenceDto.java new file mode 100644 index 00000000000..4eccb0f83b9 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/ArcImportReferenceDto.java @@ -0,0 +1,32 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + +import com.netgrif.application.engine.objects.petrinet.domain.arcs.Arc; +import com.netgrif.application.engine.objects.petrinet.domain.arcs.InhibitorArc; +import com.netgrif.application.engine.objects.petrinet.domain.arcs.ReadArc; +import com.netgrif.application.engine.objects.petrinet.domain.arcs.ResetArc; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +public record ArcImportReferenceDto(String importId, String sourceId, String destinationId, Integer multiplicity, + List breakpoints, String type) implements Serializable { + + public static ArcImportReferenceDto fromArc(Arc arc) { + return new ArcImportReferenceDto(arc.getImportId(), arc.getSourceId(), arc.getDestinationId(), + arc.getMultiplicity(), arc.getBreakpoints().stream().map(PositionDto::fromPosition).toList(), + resolveArcType(arc)); + + } + + private static String resolveArcType(Arc arc) { + if (arc instanceof ReadArc) { + return "read"; + } else if (arc instanceof InhibitorArc) { + return "inhibitor"; + } else if (arc instanceof ResetArc) { + return "reset"; + } + return "arc"; + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/DataFieldReferenceDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/DataFieldReferenceDto.java new file mode 100644 index 00000000000..0a6f9e382de --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/DataFieldReferenceDto.java @@ -0,0 +1,22 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + + +import com.netgrif.application.engine.objects.petrinet.domain.dataset.Field; + +import java.io.Serializable; +import java.util.Locale; + +public record DataFieldReferenceDto(String stringId, + String title, + String petriNetId, + String transitionId, + String type) implements Serializable { + + public static DataFieldReferenceDto fromField(Field field, Locale locale) { + return new DataFieldReferenceDto(field.getStringId(), field.getTranslatedName(locale), null, null, field.getType().getName()); + } + + public static DataFieldReferenceDto fromField(Field field, Locale locale, String petriNetId, String transitionId) { + return new DataFieldReferenceDto(field.getStringId(), field.getTranslatedName(locale), petriNetId, transitionId, field.getType().getName()); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PetriNetImportReferenceDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PetriNetImportReferenceDto.java new file mode 100644 index 00000000000..2cd10452912 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PetriNetImportReferenceDto.java @@ -0,0 +1,11 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + +import java.io.Serializable; +import java.util.List; + +public record PetriNetImportReferenceDto(List transitions, + List places, + List arcs, + List assignedTasks, + List finishedTasks) implements Serializable { +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PetriNetReferenceDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PetriNetReferenceDto.java new file mode 100644 index 00000000000..feaf6f11a8f --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PetriNetReferenceDto.java @@ -0,0 +1,23 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + + +import com.netgrif.application.engine.objects.auth.domain.ActorRef; +import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Locale; + +public record PetriNetReferenceDto(String stringId, String title, String identifier, String version, String initials, + String defaultCaseName, String icon, LocalDateTime creationDate, ActorRef author, + List immediateData) implements Serializable { + + public static PetriNetReferenceDto fromPetriNet(PetriNet net, Locale locale) { + return new PetriNetReferenceDto(net.getStringId(), net.getTranslatedTitle(locale), net.getIdentifier(), + net.getVersion().toString(), net.getInitials(), net.getTranslatedDefaultCaseName(locale), net.getIcon(), + net.getCreationDate(), net.getAuthor(), + net.getImmediateFields().stream().map(field -> DataFieldReferenceDto.fromField(field, locale)).toList() + ); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PlaceImportReferenceDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PlaceImportReferenceDto.java new file mode 100644 index 00000000000..a04d4061dd7 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PlaceImportReferenceDto.java @@ -0,0 +1,15 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + +import com.netgrif.application.engine.objects.petrinet.domain.I18nString; +import com.netgrif.application.engine.objects.petrinet.domain.Place; + +import java.io.Serializable; + +public record PlaceImportReferenceDto(String setImportId, I18nString title, Integer tokens, PositionDto position, + Boolean isStatic) implements Serializable { + + public static PlaceImportReferenceDto fromPlace(Place place) { + return new PlaceImportReferenceDto(place.getImportId(), place.getTitle(), place.getTokens(), + PositionDto.fromPosition(place.getPosition()), place.getIsStatic()); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PositionDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PositionDto.java new file mode 100644 index 00000000000..4931d037742 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/PositionDto.java @@ -0,0 +1,12 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + +import com.netgrif.application.engine.objects.petrinet.domain.Position; + +import java.io.Serializable; + +public record PositionDto(int x, int y) implements Serializable { + + public static PositionDto fromPosition(Position position) { + return new PositionDto(position.getX(), position.getY()); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/ProcessRoleDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/ProcessRoleDto.java new file mode 100644 index 00000000000..5c820c76913 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/ProcessRoleDto.java @@ -0,0 +1,28 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + +import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole; + +import java.io.Serializable; +import java.util.Locale; + +public record ProcessRoleDto(String stringId, String name, String description, String importId, String netImportId, + String netVersion, String netStringId, boolean global) implements Serializable { + + /** + * This constructor doesn't set attributes regarding the Petri net. + *

+ * Use the ProcessRoleFactory to create instances that have these attributes set. + */ + public ProcessRoleDto(ProcessRole role, Locale locale) { + this(role.getStringId(), role.getLocalisedName(locale), role.getDescription(), role.getImportId(), null, null, null, role.isGlobal()); + } + + public ProcessRoleDto(ProcessRole role, Locale locale, String netImportId, + String netVersion, String netStringId) { + this(role.getStringId(), role.getLocalisedName(locale), role.getDescription(), role.getImportId(),netImportId, netVersion, netStringId, role.isGlobal()); + } + + public ProcessRoleDto(String id, String name, String description, boolean global) { + this(id, name, description, null, null, null, null, global); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransactionDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransactionDto.java new file mode 100644 index 00000000000..d292c298e16 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransactionDto.java @@ -0,0 +1,8 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + +import java.io.Serializable; +import java.util.List; + +public record TransactionDto(List transitions, String title) implements Serializable { + +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransitionImportReferenceDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransitionImportReferenceDto.java new file mode 100644 index 00000000000..9abbd7855ec --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransitionImportReferenceDto.java @@ -0,0 +1,14 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + +import com.netgrif.application.engine.objects.petrinet.domain.I18nString; +import com.netgrif.application.engine.objects.petrinet.domain.Transition; + +import java.io.Serializable; + +public record TransitionImportReferenceDto(PositionDto position, I18nString title, String stringId, String importId) implements Serializable { + + public static TransitionImportReferenceDto fromTransition(Transition transition) { + return new TransitionImportReferenceDto(PositionDto.fromPosition(transition.getPosition()), transition.getTitle(), + transition.getObjectId().toString(), transition.getImportId()); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransitionReferenceDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransitionReferenceDto.java new file mode 100644 index 00000000000..a63a8e6d098 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/petrinet/TransitionReferenceDto.java @@ -0,0 +1,17 @@ +package com.netgrif.application.engine.objects.dto.response.petrinet; + +import java.io.Serializable; +import java.util.List; + +public record TransitionReferenceDto(String stringId, + String title, + String petriNetId, + List immediateData) implements Serializable { + + public TransitionReferenceDto(String stringId, String title, String petriNetId, List immediateData) { + this.stringId = stringId; + this.title = title; + this.petriNetId = petriNetId; + this.immediateData = immediateData; + } +} diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/RealmDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/realm/RealmDto.java similarity index 68% rename from nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/RealmDto.java rename to nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/realm/RealmDto.java index ac514eacc75..c92e1a62543 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/RealmDto.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/realm/RealmDto.java @@ -1,4 +1,6 @@ -package com.netgrif.application.engine.auth.realm; +package com.netgrif.application.engine.objects.dto.response.realm; + +import java.io.Serializable; public record RealmDto(String name, String description, @@ -8,5 +10,5 @@ public record RealmDto(String name, Integer maxFailedAttempts, Integer blockDurationMinutes, Boolean enableLimitSessions, - Integer maxSessionsAllowed) { + Integer maxSessionsAllowed) implements Serializable { } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/task/TaskDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/task/TaskDto.java new file mode 100644 index 00000000000..840c20b38d4 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/task/TaskDto.java @@ -0,0 +1,62 @@ +package com.netgrif.application.engine.objects.dto.response.task; + +import com.netgrif.application.engine.objects.petrinet.domain.dataset.localised.LocalisedField; +import com.netgrif.application.engine.objects.petrinet.domain.dataset.localised.LocalisedFieldFactory; +import com.netgrif.application.engine.objects.petrinet.domain.events.EventType; +import com.netgrif.application.engine.objects.petrinet.domain.layout.TaskLayout; +import com.netgrif.application.engine.objects.workflow.domain.Task; +import jakarta.annotation.Nullable; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +/** + * Localised task data object + */ +public record TaskDto(String stringId, String caseId, String transitionId, String title, String caseTitle, + Integer priority, + @Nullable String userId, @Nullable String userRealmId, @Nullable TaskLayout layout, + @Nullable String caseColor, + Map> roles, @Nullable Map> users, + LocalDateTime startDate, @Nullable LocalDateTime finishDate, @Nullable String finishedBy, + @Nullable String transactionId, + Boolean requiredFilled, @Nullable List immediateData, @Nullable String icon, + String assignPolicy, @Nullable String dataFocusPolicy, @Nullable String finishPolicy, + @Nullable String finishTitle, + String cancelTitle, @Nullable String delegateTitle, @Nullable String assignTitle, + Map assignedUserPolicy, @Nullable Map tags) { + + public static TaskDto fromTask(Task task, Locale locale) { + return new TaskDto( + task.getStringId(), + task.getCaseId(), + task.getTransitionId(), + task.getTitle().getTranslation(locale), + task.getCaseTitle(), + task.getPriority(), + task.getUser() != null ? task.getUser().getStringId() : null, + task.getUser() != null ? task.getUser().getRealmId() : null, + task.getLayout(), + task.getCaseColor(), + task.getRoles(), + task.getUsers(), + task.getStartDate(), + task.getFinishDate(), + task.getFinishedBy(), + task.getTransactionId(), + task.getRequiredFilled(), + task.getImmediateData().stream().map(field -> LocalisedFieldFactory.from(field, locale)).toList(), + task.getIcon(), + task.getAssignPolicy().toString(), + task.getDataFocusPolicy().toString(), + task.getFinishPolicy().toString(), + task.getTranslatedEventTitle(EventType.FINISH, locale), + task.getTranslatedEventTitle(EventType.ASSIGN, locale), + task.getTranslatedEventTitle(EventType.CANCEL, locale), + task.getTranslatedEventTitle(EventType.DELEGATE, locale), + task.getAssignedUserPolicy(), + task.getTags()); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/user/UserDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/user/UserDto.java new file mode 100644 index 00000000000..d2c2ed27ad5 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/user/UserDto.java @@ -0,0 +1,68 @@ +package com.netgrif.application.engine.objects.dto.response.user; + +import com.netgrif.application.engine.objects.auth.domain.User; +import com.netgrif.application.engine.objects.dto.response.petrinet.ProcessRoleDto; +import com.netgrif.application.engine.objects.auth.domain.AbstractUser; +import com.netgrif.application.engine.objects.auth.domain.Attribute; +import com.netgrif.application.engine.objects.auth.domain.Credential; +import com.netgrif.application.engine.objects.auth.domain.enums.UserState; +import com.netgrif.application.engine.objects.dto.response.authority.AuthorityDto; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +public record UserDto(String id, String username, String realmId, String email, String avatar, String firstName, + String lastName, String fullName, Set authorities, + Set processRoles, Set nextGroups, UserDto impersonated, LocalDateTime createdAt, + Map> attributes, boolean enabled, boolean emailVerified, UserState state) implements Serializable { + public static final String ATTR_ENABLED_CREDENTIALS = "enabledCredentials"; + + public static UserDto fromAbstractUser(AbstractUser user) { + return fromAbstractUser(user, null); + } + + public static UserDto fromAbstractUser(AbstractUser user, Set processRoles) { + return fromAbstractUser(user, null, processRoles); + } + + public static UserDto fromAbstractUser(AbstractUser user, UserDto impersonated, Set processRoles) { + LocalDateTime createdAt = null; + boolean enabled = false; + boolean emailVerified = false; + UserState state = null; + Attribute> enabledCredentialsAttribute = new Attribute<>(); + Map> attributes = new HashMap<>(); + if (user instanceof User domainUser) { + createdAt = domainUser.getCreatedAt(); + enabled = domainUser.isActive(); + emailVerified = domainUser.isEmailVerified(); + state = domainUser.getState(); + Map> credentials = domainUser.getCredentials(); + enabledCredentialsAttribute.setValue( + (credentials == null ? java.util.Map.>of() : credentials) + .values().stream() + .filter(java.util.Objects::nonNull) + .filter(Credential::isEnabled) + .map(Credential::getType) + .filter(java.util.Objects::nonNull) + .collect(Collectors.toSet())); + enabledCredentialsAttribute.setRequired(true); + if (enabledCredentialsAttribute.getValue() != null && !enabledCredentialsAttribute.getValue().isEmpty()) { + attributes.put(ATTR_ENABLED_CREDENTIALS, enabledCredentialsAttribute); + } + } +// todo negative roles were not set before now, is it ok? + return new UserDto( + user.getStringId(), user.getUsername(), user.getRealmId(), user.getEmail(), user.getAvatar(), + user.getFirstName(), user.getLastName(), user.getFullName(), + user.getAuthoritySet().stream().map(AuthorityDto::fromAuthority).collect(Collectors.toSet()), + processRoles, user.getGroupIds(), impersonated, + createdAt, attributes, enabled, emailVerified, state + ); + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/workflow/CaseDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/workflow/CaseDto.java new file mode 100644 index 00000000000..1ec42ef1e56 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/workflow/CaseDto.java @@ -0,0 +1,40 @@ +package com.netgrif.application.engine.objects.dto.response.workflow; + +import com.netgrif.application.engine.objects.auth.domain.ActorRef; +import com.netgrif.application.engine.objects.petrinet.domain.dataset.localised.LocalisedField; +import com.netgrif.application.engine.objects.petrinet.domain.dataset.localised.LocalisedFieldFactory; +import com.netgrif.application.engine.objects.workflow.domain.Case; +import com.netgrif.application.engine.objects.workflow.domain.TaskPair; +import org.bson.types.ObjectId; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +/** + * DTO for {@link Case} + */ +public record CaseDto(String stringId, String processIdentifier, String title, String icon, ActorRef author, + String visualId, ObjectId petriNetObjectId, LocalDateTime lastModified, + LocalDateTime creationDate, + String color, Map activePlaces, List immediateData, + Map consumedTokens, Set tasks, Set enabledRoles, + Map> permissions, Map> userRefs, + Map> users, List viewRoles, List viewUserRefs, + List viewUsers, List negativeViewRoles, List negativeViewUsers, + Map tags) implements Serializable { + + public static CaseDto fromCase(Case aCase, Locale locale) { + return new CaseDto(aCase.getStringId(), aCase.getProcessIdentifier(), aCase.getTitle(), aCase.getIcon(), + aCase.getAuthor(), aCase.getVisualId(), aCase.getPetriNetObjectId(), aCase.getLastModified(), + aCase.getCreationDate(), aCase.getColor(), aCase.getActivePlaces(), + aCase.getImmediateData().stream().map(field -> LocalisedFieldFactory.from(field, locale)).toList(), + aCase.getConsumedTokens(), aCase.getTasks(), aCase.getEnabledRoles(), aCase.getPermissions(), + aCase.getUserRefs(), aCase.getUsers(), aCase.getViewRoles(), aCase.getViewUserRefs(), aCase.getViewUsers(), + aCase.getNegativeViewRoles(), aCase.getNegativeViewUsers(), aCase.getTags() + ); + } +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/impersonation/web/requestbodies/SearchRequest.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/impersonation/web/requestbodies/SearchRequest.java deleted file mode 100644 index cbfac3bc38b..00000000000 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/impersonation/web/requestbodies/SearchRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.netgrif.application.engine.objects.impersonation.web.requestbodies; - -import lombok.Getter; -import lombok.Setter; - -public class SearchRequest { - - @Setter - @Getter - protected String query; - - public SearchRequest() { - } - - public SearchRequest(String query) { - this.query = query; - } -} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/impersonation/web/responsebodies/ImpersonationNotAvailableResponse.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/impersonation/web/responsebodies/ImpersonationNotAvailableResponse.java deleted file mode 100644 index d0ae8a3dd32..00000000000 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/impersonation/web/responsebodies/ImpersonationNotAvailableResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.netgrif.application.engine.objects.impersonation.web.responsebodies; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ImpersonationNotAvailableResponse { - - private boolean alreadyImpersonated; - - -} diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/petrinet/web/responsebodies/ProcessRole.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/petrinet/web/responsebodies/ProcessRole.java deleted file mode 100644 index 0a70cd91061..00000000000 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/petrinet/web/responsebodies/ProcessRole.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.netgrif.application.engine.adapter.spring.petrinet.web.responsebodies; - -import lombok.Data; - -import java.util.Locale; - -@Data -public class ProcessRole { - - private String stringId; - - private String name; - - private String description; - - private String importId; - - // net attributes are set in the Factory service - private String netImportId; - - private String netVersion; - - private String netStringId; - - private boolean global; - - /** - * The constructor doesn't set attributes regarding the Petri net. - * - * Use the ProcessRoleFactory to create instances that have these attributes set. - */ - public ProcessRole(com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole role, Locale locale) { - stringId = role.getStringId(); - name = role.getLocalisedName(locale); - description = role.getDescription(); - importId = role.getImportId(); - global = role.isGlobal(); - } -} diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/preferences/Preferences.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/preferences/Preferences.java index 45cd854fb38..e6dae632bc7 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/preferences/Preferences.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/preferences/Preferences.java @@ -1,12 +1,25 @@ package com.netgrif.application.engine.adapter.spring.preferences; +import com.netgrif.application.engine.objects.dto.PreferencesDto; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; +import java.util.HashMap; + @Document public class Preferences extends com.netgrif.application.engine.objects.preferences.Preferences { public Preferences(String userId) { super(userId); } + + public static Preferences fromDto(PreferencesDto preferencesDto, String userId) { + Preferences preferences = new Preferences(userId); + preferences.setLocale(preferencesDto.locale()); + preferences.setDrawerWidth(preferencesDto.drawerWidth() <= 0 ? preferencesDto.drawerWidth() : 200); + preferences.setTaskFilters(preferencesDto.taskFilters() != null ? preferencesDto.taskFilters() : new HashMap<>()); + preferences.setCaseFilters(preferencesDto.caseFilters() != null ? preferencesDto.caseFilters() : new HashMap<>()); + preferences.setHeaders(preferencesDto.headers() != null ? preferencesDto.headers() : new HashMap<>()); + return preferences; + } } diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/AuthorityServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/AuthorityServiceImpl.java index f8dc0971834..be4b0e48d25 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/AuthorityServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/AuthorityServiceImpl.java @@ -3,7 +3,7 @@ import com.netgrif.application.engine.adapter.spring.auth.domain.AuthorityImpl; import com.netgrif.application.engine.auth.repository.AuthorityRepository; import com.netgrif.application.engine.objects.auth.domain.Authority; -import com.netgrif.application.engine.objects.auth.dto.AuthoritySearchDto; +import com.netgrif.application.engine.objects.dto.request.authority.AuthoritySearchRequestDto; import lombok.extern.slf4j.Slf4j; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; @@ -59,12 +59,12 @@ public Page findAllByIds(Collection ids, Pageable pageable) { } @Override - public Page search(AuthoritySearchDto searchDto, Pageable pageable) { + public Page search(AuthoritySearchRequestDto searchDto, Pageable pageable) { Query query; - if (searchDto.getFullText() != null && !searchDto.getFullText().isBlank()) { + if (searchDto.fullText() != null && !searchDto.fullText().isBlank()) { Criteria criteria = new Criteria().orOperator( - Criteria.where("name").regex(searchDto.getFullText(), "i") + Criteria.where("name").regex(searchDto.fullText(), "i") ); query = Query.query(criteria); } else { diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/GroupServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/GroupServiceImpl.java index b13df2a0321..8c94d91cb9d 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/GroupServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/GroupServiceImpl.java @@ -6,7 +6,7 @@ import com.netgrif.application.engine.auth.repository.GroupRepository; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; import com.netgrif.application.engine.objects.auth.domain.Group; -import com.netgrif.application.engine.objects.auth.dto.GroupSearchDto; +import com.netgrif.application.engine.objects.dto.request.group.GroupSearchRequestDto; import com.netgrif.application.engine.objects.common.ResourceNotFoundException; import com.netgrif.application.engine.objects.common.ResourceNotFoundExceptionCode; import org.springframework.data.domain.PageImpl; @@ -372,18 +372,18 @@ public String getGroupOwnerEmail(String groupId) { } @Override - public Page search(GroupSearchDto searchDto, Pageable pageable) { + public Page search(GroupSearchRequestDto searchDto, Pageable pageable) { List filters = new ArrayList<>(); - if (searchDto.getFullText() != null && !searchDto.getFullText().isBlank()) { + if (searchDto.fullText() != null && !searchDto.fullText().isBlank()) { Criteria criteria = new Criteria().orOperator( - Criteria.where("identifier").regex(searchDto.getFullText(), "i"), - Criteria.where("displayName").regex(searchDto.getFullText(), "i"), - Criteria.where("ownerUsername").regex(searchDto.getFullText(), "i") + Criteria.where("identifier").regex(searchDto.fullText(), "i"), + Criteria.where("displayName").regex(searchDto.fullText(), "i"), + Criteria.where("ownerUsername").regex(searchDto.fullText(), "i") ); filters.add(criteria); } - if (searchDto.getRealmId() != null && !searchDto.getRealmId().isBlank()) { - filters.add(Criteria.where("realmId").regex(searchDto.getRealmId(), "i")); + if (searchDto.realmId() != null && !searchDto.realmId().isBlank()) { + filters.add(Criteria.where("realmId").regex(searchDto.realmId(), "i")); } Query query = Query.query(filters.isEmpty() ? new Criteria() : new Criteria().andOperator(filters.toArray(new Criteria[0]))); long count = mongoTemplate.count(query, Group.class); diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/RealmServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/RealmServiceImpl.java index b38c2c00d90..a2326aa866c 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/RealmServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/RealmServiceImpl.java @@ -7,7 +7,7 @@ import com.netgrif.application.engine.auth.provider.AuthMethodProvider; import com.netgrif.application.engine.auth.provider.CollectionNameProvider; import com.netgrif.application.engine.auth.provider.ProviderRegistry; -import com.netgrif.application.engine.auth.realm.request.RealmSearch; +import com.netgrif.application.engine.objects.dto.request.realm.RealmSearchDto; import com.netgrif.application.engine.auth.repository.RealmRepository; import com.netgrif.application.engine.objects.auth.domain.Realm; import com.netgrif.application.engine.objects.auth.domain.User; @@ -90,7 +90,7 @@ public Realm createRealm(Realm createRequest) { } @Override - public Page search(RealmSearch nodeProbe, Pageable pageable) { + public Page search(RealmSearchDto nodeProbe, Pageable pageable) { return realmRepository.searchRealms(nodeProbe, pageable, mongoTemplate).map(Realm.class::cast); } diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java index 2f909d90944..b0a212fef7e 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java @@ -1,12 +1,13 @@ package com.netgrif.application.engine.auth.service; import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; -import com.netgrif.application.engine.adapter.spring.petrinet.web.responsebodies.ProcessRole; -import com.netgrif.application.engine.auth.web.responsebodies.User; +import com.netgrif.application.engine.objects.dto.response.petrinet.ProcessRoleDto; +import com.netgrif.application.engine.objects.dto.response.user.UserDto; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; import org.springframework.beans.factory.annotation.Autowired; import java.util.Locale; +import java.util.Set; import java.util.stream.Collectors; public class UserFactoryImpl implements UserFactory { @@ -18,25 +19,28 @@ public class UserFactoryImpl implements UserFactory { private ProcessRoleFactory processRoleFactory; @Override - public User getUser(AbstractUser user, Locale locale) { - User result = getUser(user); + public UserDto getUser(AbstractUser user, Locale locale) { + return getUserWithImpersonation(user, null, locale); + } + @Override + public UserDto getUserWithImpersonation(AbstractUser user, AbstractUser impersonated, Locale locale) { String defaultRoleId = processRoleService.getDefaultRole().getStringId(); String anonymousRoleId = processRoleService.getAnonymousRole().getStringId(); - result.setProcessRoles(user.getProcessRoles().stream().map(processRole -> { +// todo negative processRoles? + Set roles = user.getProcessRoles().stream().map(processRole -> { if (processRole.getStringId().equals(defaultRoleId)) { - return new ProcessRole(processRole, locale); + return new ProcessRoleDto(processRole, locale); } if (processRole.getStringId().equals(anonymousRoleId)) { - return new ProcessRole(processRole, locale); + return new ProcessRoleDto(processRole, locale); } return processRoleFactory.getProcessRole(processRole, locale); - }).collect(Collectors.toSet())); - - return result; - } - - protected User getUser(AbstractUser user) { - return User.createUser(user); + }).collect(Collectors.toSet()); + UserDto impersonatedUser = null; + if(impersonated != null) { + impersonatedUser = this.getUserWithImpersonation(impersonated, null, locale); + } + return UserDto.fromAbstractUser(user, impersonatedUser, roles); } } diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index 9820e6296b5..dbae0f1ea3f 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -398,8 +398,8 @@ public Page searchAllCoMembers(String query, LoggedUser loggedUser } @Override - public Page searchAllCoMembers(String query, Collection roleIds, Collection negateRoleIds, LoggedUser loggedUser, Pageable pageable) { - if ((roleIds == null || roleIds.isEmpty()) && (negateRoleIds == null || negateRoleIds.isEmpty())) { + public Page searchAllCoMembers(String query, Collection roleIds, LoggedUser loggedUser, Pageable pageable) { + if (roleIds == null || roleIds.isEmpty()) { return searchAllCoMembers(query, loggedUser, pageable); } @@ -410,9 +410,6 @@ public Page searchAllCoMembers(String query, Collection users = userRepository.findAllByQuery(predicate, pageable, mongoTemplate, collectionName); diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/request/RealmSearch.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/request/RealmSearch.java deleted file mode 100644 index 67d3f6f3998..00000000000 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/request/RealmSearch.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.netgrif.application.engine.auth.realm.request; - -public record RealmSearch(String id, - String name, - String description, - Boolean defaultRealm, - Boolean adminRealm, - Boolean enableBlocking, - Integer maxFailedAttempts, - Integer blockDurationMinutes, - Boolean enableLimitSessions, - Integer maxSessionsAllowed) { -} diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/response/RealmSearchResponse.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/response/RealmSearchResponse.java deleted file mode 100644 index 4e853c80127..00000000000 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/realm/response/RealmSearchResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.netgrif.application.engine.auth.realm.response; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.netgrif.application.engine.auth.realm.RealmDto; -import org.springframework.data.domain.Page; -//TODO! -@JsonInclude(JsonInclude.Include.NON_NULL) -public record RealmSearchResponse(int found, - long total, - Page content) { - -} diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/repository/RealmRepository.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/repository/RealmRepository.java index 1ef78f7f18f..dd723d5cef8 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/repository/RealmRepository.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/repository/RealmRepository.java @@ -1,7 +1,7 @@ package com.netgrif.application.engine.auth.repository; import com.netgrif.application.engine.adapter.spring.auth.domain.Realm; -import com.netgrif.application.engine.auth.realm.request.RealmSearch; +import com.netgrif.application.engine.objects.dto.request.realm.RealmSearchDto; import org.bson.Document; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -32,7 +32,7 @@ public interface RealmRepository extends MongoRepository { @Query("{ 'adminRealm': true }") Optional findAdminRealm(); - default Page searchRealms(RealmSearch realmSerach, Pageable pageable, MongoTemplate mongoTemplate) { + default Page searchRealms(RealmSearchDto realmSerach, Pageable pageable, MongoTemplate mongoTemplate) { Criteria searchCriteria = new Criteria(); List criteriaList = new ArrayList<>(); diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/AuthorityService.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/AuthorityService.java index 0197249bc87..95044a11ea1 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/AuthorityService.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/AuthorityService.java @@ -1,7 +1,7 @@ package com.netgrif.application.engine.auth.service; import com.netgrif.application.engine.objects.auth.domain.Authority; -import com.netgrif.application.engine.objects.auth.dto.AuthoritySearchDto; +import com.netgrif.application.engine.objects.dto.request.authority.AuthoritySearchRequestDto; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -49,9 +49,9 @@ public interface AuthorityService { /** * Searches for {@link Authority} entities based on the specified query criteria, with pagination support. * - * @param searchDto the {@link AuthoritySearchDto} containing search criteria such as filters or keywords. + * @param searchDto the {@link AuthoritySearchRequestDto} containing search criteria such as filters or keywords. * @param pageable the {@link Pageable} object containing pagination information. * @return a {@link Page} of {@link Authority} entities matching the search criteria. */ - Page search(AuthoritySearchDto searchDto, Pageable pageable); + Page search(AuthoritySearchRequestDto searchDto, Pageable pageable); } diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/GroupService.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/GroupService.java index 81f5a20714c..bdd38e43925 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/GroupService.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/GroupService.java @@ -2,7 +2,7 @@ import com.netgrif.application.engine.objects.auth.domain.AbstractUser; import com.netgrif.application.engine.objects.auth.domain.Group; -import com.netgrif.application.engine.objects.auth.dto.GroupSearchDto; +import com.netgrif.application.engine.objects.dto.request.group.GroupSearchRequestDto; import org.springframework.data.mongodb.core.query.Query; import com.querydsl.core.types.Predicate; import org.springframework.data.domain.Page; @@ -302,9 +302,9 @@ public interface GroupService { /** * Searches for groups based on the provided search criteria and pageable details. * - * @param searchDto the search criteria encapsulated in a {@link GroupSearchDto} + * @param searchDto the search criteria encapsulated in a {@link GroupSearchRequestDto} * @param pageable pagination information for the results * @return a page of {@link Group} objects that match the search criteria */ - Page search(GroupSearchDto searchDto, Pageable pageable); + Page search(GroupSearchRequestDto searchDto, Pageable pageable); } diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/ProcessRoleFactory.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/ProcessRoleFactory.java index 81c6f5fdd0d..7db9d7cbf43 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/ProcessRoleFactory.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/ProcessRoleFactory.java @@ -1,9 +1,9 @@ package com.netgrif.application.engine.auth.service; -import com.netgrif.application.engine.adapter.spring.petrinet.web.responsebodies.ProcessRole; +import com.netgrif.application.engine.objects.dto.response.petrinet.ProcessRoleDto; import java.util.Locale; public interface ProcessRoleFactory { - ProcessRole getProcessRole(com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole role, Locale locale); + ProcessRoleDto getProcessRole(com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole role, Locale locale); } diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/RealmService.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/RealmService.java index ff9df20e824..5ad087b4e06 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/RealmService.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/RealmService.java @@ -1,21 +1,20 @@ package com.netgrif.application.engine.auth.service; import com.netgrif.application.engine.auth.provider.AbstractAuthConfig; -import com.netgrif.application.engine.auth.realm.request.RealmSearch; +import com.netgrif.application.engine.objects.dto.request.realm.RealmSearchDto; import com.netgrif.application.engine.objects.auth.domain.Realm; import com.netgrif.application.engine.objects.auth.provider.AuthMethodConfig; import com.netgrif.application.engine.objects.auth.provider.RealmUpdate; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import java.util.Map; import java.util.Optional; public interface RealmService { Realm createRealm(Realm realm); - Page search(RealmSearch nodeProbe, Pageable pageable); + Page search(RealmSearchDto nodeProbe, Pageable pageable); void enableAnonymUser(Realm realm); diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserFactory.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserFactory.java index 8d5b3d73092..ef778ae2dcd 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserFactory.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserFactory.java @@ -1,8 +1,8 @@ package com.netgrif.application.engine.auth.service; -import com.netgrif.application.engine.auth.web.responsebodies.User; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; +import com.netgrif.application.engine.objects.dto.response.user.UserDto; import java.util.Locale; @@ -12,5 +12,13 @@ public interface UserFactory { * @param locale the locale for translations * @return a full version of the user response object, that has all of its attributes set */ - User getUser(AbstractUser user, Locale locale); + UserDto getUser(AbstractUser user, Locale locale); + + /** + * @param user the domain User object we want to send to frontend + * @param locale the locale for translations + * @param impersonated impersonated User object + * @return a full version of the user response object, that has all of its attributes set + */ + UserDto getUserWithImpersonation(AbstractUser user, AbstractUser impersonated, Locale locale); } diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserService.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserService.java index 63e0111c821..2b856301a10 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserService.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserService.java @@ -301,7 +301,7 @@ public interface UserService { * @return page of matching co-members */ Page searchAllCoMembers(String query, Collection roleIds, - Collection negateRoleIds, LoggedUser loggedUser, Pageable pageable); + LoggedUser loggedUser, Pageable pageable); /** * Removes specified process roles from a user. diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/PreferencesRequest.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/PreferencesRequest.java deleted file mode 100644 index 7691ef82397..00000000000 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/PreferencesRequest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.netgrif.application.engine.auth.web.requestbodies; - -import com.netgrif.application.engine.objects.preferences.Preferences; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class PreferencesRequest { - - private String userId; - private String locale; - private int drawerWidth; - private Map> taskFilters = new HashMap<>(); - private Map> caseFilters = new HashMap<>(); - private Map> headers = new HashMap<>(); - - public Preferences toPreferences() { - Preferences preferences = new com.netgrif.application.engine.adapter.spring.preferences.Preferences(userId); - preferences.setLocale(locale); - preferences.setDrawerWidth(drawerWidth); - preferences.setTaskFilters(taskFilters); - preferences.setCaseFilters(caseFilters); - preferences.setHeaders(headers); - return preferences; - } - -} diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UserCreateRequest.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UserCreateRequest.java deleted file mode 100644 index 3af8c4c71ba..00000000000 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UserCreateRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.netgrif.application.engine.auth.web.requestbodies; - -import lombok.Data; - -@Data -public class UserCreateRequest { - private String username; - private String email; - private String firstName; - private String lastName; - private String password; - -} \ No newline at end of file diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UserSearchRequestBody.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UserSearchRequestBody.java deleted file mode 100644 index 9c2d38dc1f8..00000000000 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UserSearchRequestBody.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.netgrif.application.engine.auth.web.requestbodies; - -import lombok.Data; - -import java.util.List; - -/** - * Represents the request body for searching users with specific criteria. - */ -@Data -public class UserSearchRequestBody { - - /** - * The ID of the realm in which to search for users. - * This field is used to scope the search to a particular multi-tenancy realm. - */ - private String realmId; - - /** - * A full-text search string to filter the users. - * The search is typically applied to user attributes like name, username, or email. - */ - private String fulltext; - - /** - * A list of roles the users must have. - * The search will include users who possess all of the specified roles. - */ - private List roles; - - /** - * A list of roles the users must not have. - * The search will exclude users who possess any of the specified roles. - */ - private List negativeRoles; -} \ No newline at end of file diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/PreferencesResource.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/PreferencesResource.java index 722cb3aaaff..88cd964fbbf 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/PreferencesResource.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/PreferencesResource.java @@ -1,14 +1,14 @@ package com.netgrif.application.engine.auth.web.responsebodies; import com.fasterxml.jackson.annotation.JsonInclude; -import com.netgrif.application.engine.objects.preferences.Preferences; +import com.netgrif.application.engine.objects.dto.PreferencesDto; import lombok.Data; @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class PreferencesResource { - private Preferences preferences; + private PreferencesDto preferences; private String error; private String message; @@ -16,7 +16,7 @@ public PreferencesResource(String error) { this.error = error; } - public PreferencesResource(Preferences preferences) { + public PreferencesResource(PreferencesDto preferences) { this.preferences = preferences; } @@ -24,11 +24,11 @@ public static PreferencesResource withError(String errorMsg) { return new PreferencesResource(errorMsg); } - public static PreferencesResource withPreferences(Preferences preferences) { + public static PreferencesResource withPreferences(PreferencesDto preferences) { return new PreferencesResource(preferences); } - public static PreferencesResource withMessage(Preferences preferences, String message) { + public static PreferencesResource withMessage(PreferencesDto preferences, String message) { PreferencesResource preferencesResource = new PreferencesResource(preferences); preferencesResource.setMessage(message); return preferencesResource; diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java deleted file mode 100644 index 42605f8591e..00000000000 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.netgrif.application.engine.auth.web.responsebodies; - -import com.netgrif.application.engine.adapter.spring.petrinet.web.responsebodies.ProcessRole; -import com.netgrif.application.engine.objects.auth.domain.AbstractUser; -import com.netgrif.application.engine.objects.auth.domain.Attribute; -import com.netgrif.application.engine.objects.auth.domain.Authority; -import com.netgrif.application.engine.objects.auth.domain.Credential; -import com.netgrif.application.engine.objects.auth.domain.enums.UserState; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -@Data -public class User { - public static final String ATTR_ENABLED_CREDENTIALS = "enabledCredentials"; - - private String id; - private String username; - private String realmId; - private String email; - private String avatar; - private String firstName; - private String lastName; - private String fullName; - private Set authorities; - private Set processRoles; - private Set negativeProcessRoles; - private Set nextGroups; - private User impersonated; - private LocalDateTime createdAt; - private Map> attributes; - private boolean enabled; - private boolean emailVerified; - protected UserState state; - - public User(AbstractUser user) { - Attribute> enabledCredentialsAttribute = new Attribute<>(); - if (user instanceof com.netgrif.application.engine.objects.auth.domain.User domainUser) { - Map> credentials = domainUser.getCredentials(); - enabledCredentialsAttribute.setValue( - (credentials == null ? java.util.Map.>of() : credentials) - .values().stream() - .filter(java.util.Objects::nonNull) - .filter(Credential::isEnabled) - .map(Credential::getType) - .filter(java.util.Objects::nonNull) - .collect(Collectors.toSet())); - enabledCredentialsAttribute.setRequired(true); - } - - id = user.getStringId(); - username = user.getUsername(); - realmId = user.getRealmId(); - email = user.getEmail(); - avatar = user.getAvatar(); - firstName = user.getFirstName(); - lastName = user.getLastName(); - fullName = user.getFullName(); - attributes = user.getAttributes() != null - ? new java.util.HashMap<>(user.getAttributes()) - : new java.util.HashMap<>(); - if (enabledCredentialsAttribute.getValue() != null && !enabledCredentialsAttribute.getValue().isEmpty()) { - attributes.put(ATTR_ENABLED_CREDENTIALS, enabledCredentialsAttribute); - } - if (user instanceof com.netgrif.application.engine.objects.auth.domain.User u) { - createdAt = u.getCreatedAt(); - enabled = u.isActive(); - emailVerified = u.isEmailVerified(); - state = u.getState(); - } - } - - public static User createUser(AbstractUser user) { - User result = new User(user); - result.setAuthorities(user.getAuthoritySet()); - result.setNextGroups(user.getGroupIds()); - return result; - } -} From 18592913fe559a98bb9d954e55d37454afdc0b41 Mon Sep 17 00:00:00 2001 From: palajsamuel Date: Tue, 11 Nov 2025 16:09:41 +0100 Subject: [PATCH 2/2] [NAE-2221] NOL: DTO refactor - added missing dtos - CaseResourceAssembler changes --- .../engine/auth/web/UserController.java | 4 +-- .../workflow/web/WorkflowController.java | 34 +++++++++---------- .../responsebodies/CaseResourceAssembler.java | 15 ++++++-- .../request/user/PasswordResetRequestDto.java | 10 ++++++ .../dto/request/user/UserCreateRequest.java | 6 ---- .../request/user/UserCreateRequestDto.java | 6 ++++ .../dto/response/authority/AuthorityDto.java | 4 +-- .../objects/dto/response/realm/RealmDto.java | 8 +++++ .../objects/dto/response/user/UserDto.java | 2 +- .../engine/auth/service/UserFactoryImpl.java | 1 - 10 files changed, 58 insertions(+), 32 deletions(-) create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/PasswordResetRequestDto.java delete mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequest.java create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequestDto.java diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java index 3740110a228..7509a73aaee 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java @@ -8,7 +8,7 @@ import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.objects.auth.domain.Realm; import com.netgrif.application.engine.objects.dto.PreferencesDto; -import com.netgrif.application.engine.objects.dto.request.user.UserCreateRequest; +import com.netgrif.application.engine.objects.dto.request.user.UserCreateRequestDto; import com.netgrif.application.engine.objects.dto.request.user.UserSearchRequestBody; import com.netgrif.application.engine.objects.dto.response.authority.AuthorityDto; import com.netgrif.application.engine.objects.dto.response.user.UserDto; @@ -62,7 +62,7 @@ public class UserController { @ApiResponse(responseCode = "500", description = "Internal server error") }) @PostMapping("/{realmId}") - public ResponseEntity createUser(@PathVariable String realmId, @RequestBody UserCreateRequest request, Locale locale) { + public ResponseEntity createUser(@PathVariable String realmId, @RequestBody UserCreateRequestDto request, Locale locale) { try { if (!realmExists(realmId)) { log.error("Realm with id [{}] not found", realmId); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java index 0ffc47151c4..9b50646aa46 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java @@ -97,41 +97,41 @@ public EntityModel createCase(@RequestBody CreateCaseBo @Operation(summary = "Get all cases of the system, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @GetMapping(value = "/all", produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel getAll(Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { - Page cases = workflowService.getAll(pageable).map(domainCase -> CaseDto.fromCase(domainCase, locale)); + public PagedModel getAll(Pageable pageable, PagedResourcesAssembler assembler, Locale locale) { + Page cases = workflowService.getAll(pageable); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) .getAll(pageable, assembler, locale)).withRel("all"); - return buildResponse(assembler, cases, selfLink); + return buildResponse(assembler, cases, selfLink, locale); } @Operation(summary = "Generic case search with QueryDSL predicate, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @PostMapping(value = "/case/search2", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE) public PagedModel search2(@QuerydslPredicate(root = Case.class) Predicate predicate, Pageable pageable, - PagedResourcesAssembler assembler, Locale locale) { - Page cases = workflowService.search(predicate, pageable).map(domainCase -> CaseDto.fromCase(domainCase, locale)); + PagedResourcesAssembler assembler, Locale locale) { + Page cases = workflowService.search(predicate, pageable); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) .search2(predicate, pageable, assembler, locale)).withRel("search2"); - return buildResponse(assembler, cases, selfLink); + return buildResponse(assembler, cases, selfLink, locale); } @Operation(summary = "Generic case search on Elasticsearch database, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @PostMapping(value = "/case/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel search(@RequestBody SingleCaseSearchRequestAsList searchBody, @RequestParam(defaultValue = "OR") MergeFilterOperation operation, Pageable pageable, PagedResourcesAssembler assembler, Authentication auth, Locale locale) { + public PagedModel search(@RequestBody SingleCaseSearchRequestAsList searchBody, @RequestParam(defaultValue = "OR") MergeFilterOperation operation, Pageable pageable, PagedResourcesAssembler assembler, Authentication auth, Locale locale) { LoggedUser user = (LoggedUser) auth.getPrincipal(); - Page cases = elasticCaseService.search(searchBody.getList(), user, pageable, locale, operation == MergeFilterOperation.AND).map(domainCase -> CaseDto.fromCase(domainCase, locale)); + Page cases = elasticCaseService.search(searchBody.getList(), user, pageable, locale, operation == MergeFilterOperation.AND); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) .search(searchBody, operation, pageable, assembler, auth, locale)).withRel("search"); - return buildResponse(assembler, cases, selfLink); + return buildResponse(assembler, cases, selfLink, locale); } @Operation(summary = "Generic case search on Mongo database, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @PostMapping(value = "/case/search_mongo", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel searchMongo(@RequestBody Map searchBody, Pageable pageable, Authentication auth, PagedResourcesAssembler assembler, Locale locale) { - Page cases = workflowService.search(searchBody, pageable, (LoggedUser) auth.getPrincipal(), locale).map(domainCase -> CaseDto.fromCase(domainCase, locale)); + public PagedModel searchMongo(@RequestBody Map searchBody, Pageable pageable, Authentication auth, PagedResourcesAssembler assembler, Locale locale) { + Page cases = workflowService.search(searchBody, pageable, (LoggedUser) auth.getPrincipal(), locale); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) .searchMongo(searchBody, pageable, auth, assembler, locale)).withRel("search"); - return buildResponse(assembler, cases, selfLink); + return buildResponse(assembler, cases, selfLink, locale); } @@ -153,11 +153,11 @@ public CaseResource getOne(@PathVariable("id") String caseId, Locale locale) { @Operation(summary = "Get all cases by user that created them, paginated", security = {@SecurityRequirement(name = "BasicAuth")}) @RequestMapping(value = "/case/author/{id}", method = RequestMethod.POST, consumes = MediaType.TEXT_PLAIN_VALUE, produces = MediaTypes.HAL_JSON_VALUE) - public PagedModel findAllByAuthor(@PathVariable("id") String authorId, @RequestBody String petriNet, PagedResourcesAssembler assembler, Pageable pageable, Locale locale) { - Page cases = workflowService.findAllByAuthor(authorId, petriNet, pageable).map(domainCase -> CaseDto.fromCase(domainCase, locale)); + public PagedModel findAllByAuthor(@PathVariable("id") String authorId, @RequestBody String petriNet, PagedResourcesAssembler assembler, Pageable pageable, Locale locale) { + Page cases = workflowService.findAllByAuthor(authorId, petriNet, pageable); Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class) .findAllByAuthor(authorId, petriNet, assembler, pageable, locale)).withRel("author"); - return buildResponse(assembler, cases, selfLink); + return buildResponse(assembler, cases, selfLink, locale); } @PreAuthorize("@authorizationService.hasAuthority('ADMIN')") @@ -248,8 +248,8 @@ public ResponseEntity getFileByName(@PathVariable("id") String caseId, } @NotNull - private PagedModel buildResponse(PagedResourcesAssembler assembler, Page cases, Link selfLink) { - PagedModel resources = assembler.toModel(cases, new CaseResourceAssembler(), selfLink); + private PagedModel buildResponse(PagedResourcesAssembler assembler, Page cases, Link selfLink, Locale locale) { + PagedModel resources = assembler.toModel(cases, new CaseResourceAssembler(locale), selfLink); ResourceLinkAssembler.addLinks(resources, Case.class, selfLink.getRel().toString()); return resources; } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResourceAssembler.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResourceAssembler.java index fc45a4d4b56..2f2e6f13f07 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResourceAssembler.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/CaseResourceAssembler.java @@ -2,11 +2,20 @@ import com.netgrif.application.engine.objects.dto.response.workflow.CaseDto; +import com.netgrif.application.engine.objects.workflow.domain.Case; import org.springframework.hateoas.server.RepresentationModelAssembler; -public class CaseResourceAssembler implements RepresentationModelAssembler { +import java.util.Locale; + +public class CaseResourceAssembler implements RepresentationModelAssembler { + private Locale locale; + + public CaseResourceAssembler(Locale locale) { + this.locale = locale; + } + @Override - public CaseResource toModel(CaseDto aCase) { - return new CaseResource(aCase); + public CaseResource toModel(Case aCase) { + return new CaseResource(CaseDto.fromCase(aCase, locale)); } } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/PasswordResetRequestDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/PasswordResetRequestDto.java new file mode 100644 index 00000000000..ad7740cfca7 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/PasswordResetRequestDto.java @@ -0,0 +1,10 @@ +package com.netgrif.application.engine.objects.dto.request.user; + +import jakarta.annotation.Nullable; + +public record PasswordResetRequestDto(String username, + @Nullable + String oldPassword, + String newPassword, + String realmId) { +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequest.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequest.java deleted file mode 100644 index 485017512dc..00000000000 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequest.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.netgrif.application.engine.objects.dto.request.user; - -import java.io.Serializable; - -public record UserCreateRequest(String username, String email, String firstName, String lastName, String password) implements Serializable { -} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequestDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequestDto.java new file mode 100644 index 00000000000..502faf92810 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/request/user/UserCreateRequestDto.java @@ -0,0 +1,6 @@ +package com.netgrif.application.engine.objects.dto.request.user; + +import java.io.Serializable; + +public record UserCreateRequestDto(String username, String email, String firstName, String lastName, String password) implements Serializable { +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/authority/AuthorityDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/authority/AuthorityDto.java index bea583d166b..a8dc57ffc52 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/authority/AuthorityDto.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/authority/AuthorityDto.java @@ -8,10 +8,10 @@ /** * DTO for {@link Authority} */ -public record AuthorityDto(ObjectId id, String name) implements Serializable { +public record AuthorityDto(ObjectId id, String authority, String stringId) implements Serializable { public static AuthorityDto fromAuthority(Authority authority) { - return new AuthorityDto(authority.get_id(), authority.getName()); + return new AuthorityDto(authority.get_id(), authority.getName(), authority.getStringId()); } } \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/realm/RealmDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/realm/RealmDto.java index c92e1a62543..32ef8c93e09 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/realm/RealmDto.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/realm/RealmDto.java @@ -1,5 +1,7 @@ package com.netgrif.application.engine.objects.dto.response.realm; +import com.netgrif.application.engine.objects.auth.domain.Realm; + import java.io.Serializable; public record RealmDto(String name, @@ -11,4 +13,10 @@ public record RealmDto(String name, Integer blockDurationMinutes, Boolean enableLimitSessions, Integer maxSessionsAllowed) implements Serializable { + + public static RealmDto fromRealm(Realm realm) { + return new RealmDto(realm.getName(), realm.getDescription(), realm.isDefaultRealm(), realm.isAdminRealm(), + realm.isEnableBlocking(), realm.getMaxFailedAttempts(), realm.getBlockDurationMinutes(), + realm.isEnableLimitSessions(), realm.getMaxSessionsAllowed()); + } } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/user/UserDto.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/user/UserDto.java index d2c2ed27ad5..b39f04f5cd9 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/user/UserDto.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/dto/response/user/UserDto.java @@ -56,7 +56,7 @@ public static UserDto fromAbstractUser(AbstractUser user, UserDto impersonated, attributes.put(ATTR_ENABLED_CREDENTIALS, enabledCredentialsAttribute); } } -// todo negative roles were not set before now, is it ok? + return new UserDto( user.getStringId(), user.getUsername(), user.getRealmId(), user.getEmail(), user.getAvatar(), user.getFirstName(), user.getLastName(), user.getFullName(), diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java index b0a212fef7e..566bea024c2 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java @@ -27,7 +27,6 @@ public UserDto getUser(AbstractUser user, Locale locale) { public UserDto getUserWithImpersonation(AbstractUser user, AbstractUser impersonated, Locale locale) { String defaultRoleId = processRoleService.getDefaultRole().getStringId(); String anonymousRoleId = processRoleService.getAnonymousRole().getStringId(); -// todo negative processRoles? Set roles = user.getProcessRoles().stream().map(processRole -> { if (processRole.getStringId().equals(defaultRoleId)) { return new ProcessRoleDto(processRole, locale);