diff --git a/server/src/main/java/io/flexwork/modules/collab/repository/NotificationRepository.java b/server/src/main/java/io/flexwork/modules/collab/repository/NotificationRepository.java index bdd14a1c..48e879c9 100644 --- a/server/src/main/java/io/flexwork/modules/collab/repository/NotificationRepository.java +++ b/server/src/main/java/io/flexwork/modules/collab/repository/NotificationRepository.java @@ -2,6 +2,7 @@ import io.flexwork.modules.collab.domain.Notification; import java.util.List; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -11,7 +12,7 @@ @Repository public interface NotificationRepository extends JpaRepository { - List findByUserIdAndIsReadFalse(Long userId); + List findByUserIdAndIsReadFalse(Long userId, Sort sort); @Modifying @Query("UPDATE Notification n SET n.isRead = true WHERE n.id IN :ids") diff --git a/server/src/main/java/io/flexwork/modules/collab/service/NotificationService.java b/server/src/main/java/io/flexwork/modules/collab/service/NotificationService.java index 23585f64..ebd7eb53 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/NotificationService.java +++ b/server/src/main/java/io/flexwork/modules/collab/service/NotificationService.java @@ -4,6 +4,7 @@ import io.flexwork.modules.collab.service.dto.NotificationDTO; import io.flexwork.modules.collab.service.mapper.NotificationMapper; import java.util.List; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,7 +23,9 @@ public NotificationService( @Transactional(readOnly = true) public List getUnreadNotificationsForUser(Long userId) { - return notificationRepository.findByUserIdAndIsReadFalse(userId).stream() + return notificationRepository + .findByUserIdAndIsReadFalse(userId, Sort.by(Sort.Direction.DESC, "createdAt")) + .stream() .map(notificationMapper::toDTO) .toList(); } diff --git a/server/src/main/java/io/flexwork/modules/crm/web/rest/AccountController.java b/server/src/main/java/io/flexwork/modules/crm/web/rest/AccountController.java index 5130adcc..8ad0523e 100644 --- a/server/src/main/java/io/flexwork/modules/crm/web/rest/AccountController.java +++ b/server/src/main/java/io/flexwork/modules/crm/web/rest/AccountController.java @@ -69,7 +69,7 @@ public ResponseEntity> findAccounts( return new ResponseEntity<>(accounts, HttpStatus.OK); } - @GetMapping("/next/{currentId}") + @GetMapping("/{currentId}/next") public ResponseEntity getNextEntity(@PathVariable Long currentId) { return accountService .getNextEntity(currentId) @@ -77,7 +77,7 @@ public ResponseEntity getNextEntity(@PathVariable Long currentId) { .orElse(ResponseEntity.notFound().build()); } - @GetMapping("/previous/{currentId}") + @GetMapping("/{currentId}/previous") public ResponseEntity getPreviousEntity(@PathVariable Long currentId) { return accountService .getPreviousEntity(currentId) diff --git a/server/src/main/java/io/flexwork/modules/collab/domain/Organization.java b/server/src/main/java/io/flexwork/modules/teams/domain/Organization.java similarity index 92% rename from server/src/main/java/io/flexwork/modules/collab/domain/Organization.java rename to server/src/main/java/io/flexwork/modules/teams/domain/Organization.java index b9b7dc7f..db2710e5 100644 --- a/server/src/main/java/io/flexwork/modules/collab/domain/Organization.java +++ b/server/src/main/java/io/flexwork/modules/teams/domain/Organization.java @@ -1,4 +1,4 @@ -package io.flexwork.modules.collab.domain; +package io.flexwork.modules.teams.domain; import jakarta.persistence.*; import java.util.Set; diff --git a/server/src/main/java/io/flexwork/modules/collab/domain/Team.java b/server/src/main/java/io/flexwork/modules/teams/domain/Team.java similarity index 91% rename from server/src/main/java/io/flexwork/modules/collab/domain/Team.java rename to server/src/main/java/io/flexwork/modules/teams/domain/Team.java index 1a1695a4..0cedc2bb 100644 --- a/server/src/main/java/io/flexwork/modules/collab/domain/Team.java +++ b/server/src/main/java/io/flexwork/modules/teams/domain/Team.java @@ -1,7 +1,5 @@ -package io.flexwork.modules.collab.domain; +package io.flexwork.modules.teams.domain; -import io.flexwork.modules.teams.domain.TeamWorkflowSelection; -import io.flexwork.modules.teams.domain.Workflow; import io.flexwork.modules.usermanagement.domain.User; import io.flexwork.modules.usermanagement.domain.UserTeam; import jakarta.persistence.*; diff --git a/server/src/main/java/io/flexwork/modules/teams/domain/TeamRequest.java b/server/src/main/java/io/flexwork/modules/teams/domain/TeamRequest.java index 53328726..4540032f 100644 --- a/server/src/main/java/io/flexwork/modules/teams/domain/TeamRequest.java +++ b/server/src/main/java/io/flexwork/modules/teams/domain/TeamRequest.java @@ -1,6 +1,5 @@ package io.flexwork.modules.teams.domain; -import io.flexwork.modules.collab.domain.Team; import io.flexwork.modules.usermanagement.domain.User; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/server/src/main/java/io/flexwork/modules/collab/domain/TeamRole.java b/server/src/main/java/io/flexwork/modules/teams/domain/TeamRole.java similarity index 93% rename from server/src/main/java/io/flexwork/modules/collab/domain/TeamRole.java rename to server/src/main/java/io/flexwork/modules/teams/domain/TeamRole.java index 850ef094..9ffacded 100644 --- a/server/src/main/java/io/flexwork/modules/collab/domain/TeamRole.java +++ b/server/src/main/java/io/flexwork/modules/teams/domain/TeamRole.java @@ -1,4 +1,4 @@ -package io.flexwork.modules.collab.domain; +package io.flexwork.modules.teams.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/server/src/main/java/io/flexwork/modules/teams/domain/TeamWorkflowSelection.java b/server/src/main/java/io/flexwork/modules/teams/domain/TeamWorkflowSelection.java index 94be8956..7f780703 100644 --- a/server/src/main/java/io/flexwork/modules/teams/domain/TeamWorkflowSelection.java +++ b/server/src/main/java/io/flexwork/modules/teams/domain/TeamWorkflowSelection.java @@ -1,6 +1,5 @@ package io.flexwork.modules.teams.domain; -import io.flexwork.modules.collab.domain.Team; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; diff --git a/server/src/main/java/io/flexwork/modules/teams/domain/Workflow.java b/server/src/main/java/io/flexwork/modules/teams/domain/Workflow.java index 86ac8f3d..668e85c8 100644 --- a/server/src/main/java/io/flexwork/modules/teams/domain/Workflow.java +++ b/server/src/main/java/io/flexwork/modules/teams/domain/Workflow.java @@ -1,6 +1,5 @@ package io.flexwork.modules.teams.domain; -import io.flexwork.modules.collab.domain.Team; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/server/src/main/java/io/flexwork/modules/collab/repository/OrganizationRepository.java b/server/src/main/java/io/flexwork/modules/teams/repository/OrganizationRepository.java similarity index 76% rename from server/src/main/java/io/flexwork/modules/collab/repository/OrganizationRepository.java rename to server/src/main/java/io/flexwork/modules/teams/repository/OrganizationRepository.java index 3e108f76..fc20ddc1 100644 --- a/server/src/main/java/io/flexwork/modules/collab/repository/OrganizationRepository.java +++ b/server/src/main/java/io/flexwork/modules/teams/repository/OrganizationRepository.java @@ -1,6 +1,6 @@ -package io.flexwork.modules.collab.repository; +package io.flexwork.modules.teams.repository; -import io.flexwork.modules.collab.domain.Organization; +import io.flexwork.modules.teams.domain.Organization; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; diff --git a/server/src/main/java/io/flexwork/modules/collab/repository/TeamRepository.java b/server/src/main/java/io/flexwork/modules/teams/repository/TeamRepository.java similarity index 89% rename from server/src/main/java/io/flexwork/modules/collab/repository/TeamRepository.java rename to server/src/main/java/io/flexwork/modules/teams/repository/TeamRepository.java index f8cdd4bd..f5a93d26 100644 --- a/server/src/main/java/io/flexwork/modules/collab/repository/TeamRepository.java +++ b/server/src/main/java/io/flexwork/modules/teams/repository/TeamRepository.java @@ -1,7 +1,7 @@ -package io.flexwork.modules.collab.repository; +package io.flexwork.modules.teams.repository; -import io.flexwork.modules.collab.domain.Team; -import io.flexwork.modules.collab.service.dto.TeamDTO; +import io.flexwork.modules.teams.domain.Team; +import io.flexwork.modules.teams.service.dto.TeamDTO; import io.flexwork.modules.usermanagement.domain.User; import io.flexwork.modules.usermanagement.service.dto.UserWithTeamRoleDTO; import java.util.List; @@ -17,7 +17,7 @@ @Repository public interface TeamRepository extends JpaRepository, JpaSpecificationExecutor { @Query( - "SELECT new io.flexwork.modules.collab.service.dto.TeamDTO(t.id, t.name, t.logoUrl, t.slogan, t.description, t.organization.id, COUNT(m.id)) " + "SELECT new io.flexwork.modules.teams.service.dto.TeamDTO(t.id, t.name, t.logoUrl, t.slogan, t.description, t.organization.id, COUNT(m.id)) " + "FROM Team t LEFT JOIN t.users m " + "GROUP BY t.id") Page findAllDTOs(Specification spec, Pageable pageable); diff --git a/server/src/main/java/io/flexwork/modules/teams/repository/TeamRequestRepository.java b/server/src/main/java/io/flexwork/modules/teams/repository/TeamRequestRepository.java index 5ce6fe90..d35f767a 100644 --- a/server/src/main/java/io/flexwork/modules/teams/repository/TeamRequestRepository.java +++ b/server/src/main/java/io/flexwork/modules/teams/repository/TeamRequestRepository.java @@ -1,12 +1,15 @@ package io.flexwork.modules.teams.repository; import io.flexwork.modules.teams.domain.TeamRequest; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository @@ -15,4 +18,41 @@ public interface TeamRequestRepository @EntityGraph(attributePaths = {"team", "requestUser", "assignUser", "workflow"}) Page findAll(Specification spec, Pageable pageable); + + @EntityGraph(attributePaths = {"team", "requestUser", "assignUser", "workflow"}) + Optional findById(@Param("id") Long id); + + @EntityGraph(attributePaths = {"team", "requestUser", "assignUser", "workflow"}) + @Query( + value = + """ + SELECT tr + FROM TeamRequest tr + WHERE tr.team.id = ( + SELECT r.team.id + FROM TeamRequest r + WHERE r.id = :requestId + ) + AND tr.id < :requestId + ORDER BY tr.id DESC + LIMIT 1 + """) + Optional findPreviousEntity(@Param("requestId") Long requestId); + + @EntityGraph(attributePaths = {"team", "requestUser", "assignUser", "workflow"}) + @Query( + value = + """ + SELECT tr + FROM TeamRequest tr + WHERE tr.team.id = ( + SELECT r.team.id + FROM TeamRequest r + WHERE r.id = :requestId + ) + AND tr.id > :requestId + ORDER BY tr.id ASC + LIMIT 1 + """) + Optional findNextEntity(@Param("requestId") Long requestId); } diff --git a/server/src/main/java/io/flexwork/modules/collab/repository/TeamRoleRepository.java b/server/src/main/java/io/flexwork/modules/teams/repository/TeamRoleRepository.java similarity index 67% rename from server/src/main/java/io/flexwork/modules/collab/repository/TeamRoleRepository.java rename to server/src/main/java/io/flexwork/modules/teams/repository/TeamRoleRepository.java index 2064aaac..076e0991 100644 --- a/server/src/main/java/io/flexwork/modules/collab/repository/TeamRoleRepository.java +++ b/server/src/main/java/io/flexwork/modules/teams/repository/TeamRoleRepository.java @@ -1,6 +1,6 @@ -package io.flexwork.modules.collab.repository; +package io.flexwork.modules.teams.repository; -import io.flexwork.modules.collab.domain.TeamRole; +import io.flexwork.modules.teams.domain.TeamRole; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/server/src/main/java/io/flexwork/modules/collab/service/OrganizationService.java b/server/src/main/java/io/flexwork/modules/teams/service/OrganizationService.java similarity index 94% rename from server/src/main/java/io/flexwork/modules/collab/service/OrganizationService.java rename to server/src/main/java/io/flexwork/modules/teams/service/OrganizationService.java index 1c5cdf6a..ae6a165f 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/OrganizationService.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/OrganizationService.java @@ -1,9 +1,9 @@ -package io.flexwork.modules.collab.service; +package io.flexwork.modules.teams.service; import static io.flexwork.query.QueryUtils.createSpecification; -import io.flexwork.modules.collab.domain.Organization; -import io.flexwork.modules.collab.repository.OrganizationRepository; +import io.flexwork.modules.teams.domain.Organization; +import io.flexwork.modules.teams.repository.OrganizationRepository; import io.flexwork.query.QueryDTO; import jakarta.persistence.EntityNotFoundException; import java.util.Optional; diff --git a/server/src/main/java/io/flexwork/modules/teams/service/TeamRequestService.java b/server/src/main/java/io/flexwork/modules/teams/service/TeamRequestService.java index 54c64b8f..8802c4cc 100644 --- a/server/src/main/java/io/flexwork/modules/teams/service/TeamRequestService.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/TeamRequestService.java @@ -2,15 +2,18 @@ import static io.flexwork.query.QueryUtils.createSpecification; -import io.flexwork.modules.collab.service.event.NewTeamRequestCreatedEvent; import io.flexwork.modules.teams.domain.TeamRequest; import io.flexwork.modules.teams.domain.WorkflowState; import io.flexwork.modules.teams.repository.TeamRequestRepository; import io.flexwork.modules.teams.repository.WorkflowRepository; import io.flexwork.modules.teams.repository.WorkflowStateRepository; import io.flexwork.modules.teams.service.dto.TeamRequestDTO; +import io.flexwork.modules.teams.service.event.NewTeamRequestCreatedEvent; import io.flexwork.modules.teams.service.mapper.TeamRequestMapper; import io.flexwork.query.QueryDTO; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityNotFoundException; +import jakarta.persistence.PersistenceContext; import java.util.Objects; import java.util.Optional; import org.jclouds.rest.ResourceNotFoundException; @@ -25,6 +28,7 @@ @Service @Transactional public class TeamRequestService { + @PersistenceContext private EntityManager entityManager; private final TeamRequestRepository teamRequestRepository; private final TeamRequestMapper teamRequestMapper; @@ -88,6 +92,13 @@ public TeamRequestDTO createTeamRequest(TeamRequestDTO teamRequestDTO) { TeamRequest teamRequest = teamRequestMapper.toEntity(teamRequestDTO); teamRequest = teamRequestRepository.save(teamRequest); + // Clear the persistence context to force a reload + entityManager.clear(); + + teamRequest = + teamRequestRepository + .findById(teamRequest.getId()) + .orElseThrow(() -> new EntityNotFoundException("TeamRequest not found")); TeamRequestDTO savedTeamRequestDTO = teamRequestMapper.toDto(teamRequest); eventPublisher.publishEvent(new NewTeamRequestCreatedEvent(this, savedTeamRequestDTO)); return savedTeamRequestDTO; @@ -123,4 +134,12 @@ private static boolean hasTeamIdFilter(QueryDTO queryDTO) { .filter(Objects::nonNull) .anyMatch(filter -> "team.id".equals(filter.getField())); } + + public Optional getNextEntity(Long requestId) { + return teamRequestRepository.findNextEntity(requestId).map(teamRequestMapper::toDto); + } + + public Optional getPreviousEntity(Long requestId) { + return teamRequestRepository.findPreviousEntity(requestId).map(teamRequestMapper::toDto); + } } diff --git a/server/src/main/java/io/flexwork/modules/collab/service/TeamService.java b/server/src/main/java/io/flexwork/modules/teams/service/TeamService.java similarity index 94% rename from server/src/main/java/io/flexwork/modules/collab/service/TeamService.java rename to server/src/main/java/io/flexwork/modules/teams/service/TeamService.java index 9e46eeff..fa4ca9e1 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/TeamService.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/TeamService.java @@ -1,13 +1,13 @@ -package io.flexwork.modules.collab.service; +package io.flexwork.modules.teams.service; import static io.flexwork.query.QueryUtils.createSpecification; -import io.flexwork.modules.collab.domain.Team; -import io.flexwork.modules.collab.domain.TeamRole; -import io.flexwork.modules.collab.repository.TeamRepository; -import io.flexwork.modules.collab.repository.TeamRoleRepository; -import io.flexwork.modules.collab.service.dto.TeamDTO; -import io.flexwork.modules.collab.service.mapper.TeamMapper; +import io.flexwork.modules.teams.domain.Team; +import io.flexwork.modules.teams.domain.TeamRole; +import io.flexwork.modules.teams.repository.TeamRepository; +import io.flexwork.modules.teams.repository.TeamRoleRepository; +import io.flexwork.modules.teams.service.dto.TeamDTO; +import io.flexwork.modules.teams.service.mapper.TeamMapper; import io.flexwork.modules.usermanagement.domain.User; import io.flexwork.modules.usermanagement.domain.UserTeam; import io.flexwork.modules.usermanagement.domain.UserTeamId; diff --git a/server/src/main/java/io/flexwork/modules/collab/service/dto/OrganizationDTO.java b/server/src/main/java/io/flexwork/modules/teams/service/dto/OrganizationDTO.java similarity index 85% rename from server/src/main/java/io/flexwork/modules/collab/service/dto/OrganizationDTO.java rename to server/src/main/java/io/flexwork/modules/teams/service/dto/OrganizationDTO.java index 5f2ad945..bbd136f4 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/dto/OrganizationDTO.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/dto/OrganizationDTO.java @@ -1,4 +1,4 @@ -package io.flexwork.modules.collab.service.dto; +package io.flexwork.modules.teams.service.dto; import java.util.Set; import lombok.Builder; diff --git a/server/src/main/java/io/flexwork/modules/collab/service/dto/TeamDTO.java b/server/src/main/java/io/flexwork/modules/teams/service/dto/TeamDTO.java similarity index 87% rename from server/src/main/java/io/flexwork/modules/collab/service/dto/TeamDTO.java rename to server/src/main/java/io/flexwork/modules/teams/service/dto/TeamDTO.java index b212dffb..018bc027 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/dto/TeamDTO.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/dto/TeamDTO.java @@ -1,4 +1,4 @@ -package io.flexwork.modules.collab.service.dto; +package io.flexwork.modules.teams.service.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/server/src/main/java/io/flexwork/modules/collab/service/event/NewTeamRequestCreatedEvent.java b/server/src/main/java/io/flexwork/modules/teams/service/event/NewTeamRequestCreatedEvent.java similarity index 89% rename from server/src/main/java/io/flexwork/modules/collab/service/event/NewTeamRequestCreatedEvent.java rename to server/src/main/java/io/flexwork/modules/teams/service/event/NewTeamRequestCreatedEvent.java index cfe9ee03..0c0b833a 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/event/NewTeamRequestCreatedEvent.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/event/NewTeamRequestCreatedEvent.java @@ -1,4 +1,4 @@ -package io.flexwork.modules.collab.service.event; +package io.flexwork.modules.teams.service.event; import io.flexwork.modules.teams.service.dto.TeamRequestDTO; import lombok.Getter; diff --git a/server/src/main/java/io/flexwork/modules/collab/service/listener/TeamRequestEventListener.java b/server/src/main/java/io/flexwork/modules/teams/service/listener/TeamRequestEventListener.java similarity index 55% rename from server/src/main/java/io/flexwork/modules/collab/service/listener/TeamRequestEventListener.java rename to server/src/main/java/io/flexwork/modules/teams/service/listener/TeamRequestEventListener.java index dfdbe144..b2c8285e 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/listener/TeamRequestEventListener.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/listener/TeamRequestEventListener.java @@ -1,12 +1,13 @@ -package io.flexwork.modules.collab.service.listener; +package io.flexwork.modules.teams.service.listener; import static j2html.TagCreator.*; +import com.flexwork.platform.utils.Obfuscator; import io.flexwork.modules.collab.domain.Notification; import io.flexwork.modules.collab.repository.NotificationRepository; -import io.flexwork.modules.collab.repository.TeamRepository; -import io.flexwork.modules.collab.service.event.NewTeamRequestCreatedEvent; +import io.flexwork.modules.teams.repository.TeamRepository; import io.flexwork.modules.teams.service.dto.TeamRequestDTO; +import io.flexwork.modules.teams.service.event.NewTeamRequestCreatedEvent; import io.flexwork.modules.usermanagement.domain.User; import io.flexwork.modules.usermanagement.service.dto.UserWithTeamRoleDTO; import java.time.LocalDateTime; @@ -31,15 +32,33 @@ public void onNewTeamRequestCreated(NewTeamRequestCreatedEvent event) { String html = p( text("A new "), - a("ticket request").withHref("#"), - text(" has been just created by "), - a("user").withHref("#")) + a("ticket ") + .withHref( + "/portal/teams/" + + Obfuscator.obfuscate( + teamRequestDTO.getTeamId()) + + "/requests/" + + Obfuscator.obfuscate( + teamRequestDTO.getId())), + text(" has been created by "), + a(teamRequestDTO.getRequestUserName()) + .withHref( + "/portals/users/" + + Obfuscator.obfuscate( + teamRequestDTO.getRequestUserId()))) .render(); List usersInTeam = teamRepository.findUsersByTeamId(teamRequestDTO.getTeamId()); List notifications = usersInTeam.stream() + .filter( + user -> + !user.getId() + .equals( + teamRequestDTO + .getRequestUserId())) // Exclude + // creator .map( user -> Notification.builder() diff --git a/server/src/main/java/io/flexwork/modules/collab/service/mapper/OrganizationMapper.java b/server/src/main/java/io/flexwork/modules/teams/service/mapper/OrganizationMapper.java similarity index 75% rename from server/src/main/java/io/flexwork/modules/collab/service/mapper/OrganizationMapper.java rename to server/src/main/java/io/flexwork/modules/teams/service/mapper/OrganizationMapper.java index 38ac6fa3..1663ffc9 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/mapper/OrganizationMapper.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/mapper/OrganizationMapper.java @@ -1,9 +1,9 @@ -package io.flexwork.modules.collab.service.mapper; +package io.flexwork.modules.teams.service.mapper; -import io.flexwork.modules.collab.domain.Organization; -import io.flexwork.modules.collab.domain.Team; -import io.flexwork.modules.collab.service.dto.OrganizationDTO; -import io.flexwork.modules.collab.service.dto.TeamDTO; +import io.flexwork.modules.teams.domain.Organization; +import io.flexwork.modules.teams.domain.Team; +import io.flexwork.modules.teams.service.dto.OrganizationDTO; +import io.flexwork.modules.teams.service.dto.TeamDTO; import java.util.Set; import java.util.stream.Collectors; import org.mapstruct.Mapper; diff --git a/server/src/main/java/io/flexwork/modules/collab/service/mapper/TeamMapper.java b/server/src/main/java/io/flexwork/modules/teams/service/mapper/TeamMapper.java similarity index 79% rename from server/src/main/java/io/flexwork/modules/collab/service/mapper/TeamMapper.java rename to server/src/main/java/io/flexwork/modules/teams/service/mapper/TeamMapper.java index bbb786e0..6c17c9c8 100644 --- a/server/src/main/java/io/flexwork/modules/collab/service/mapper/TeamMapper.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/mapper/TeamMapper.java @@ -1,8 +1,8 @@ -package io.flexwork.modules.collab.service.mapper; +package io.flexwork.modules.teams.service.mapper; -import io.flexwork.modules.collab.domain.Organization; -import io.flexwork.modules.collab.domain.Team; -import io.flexwork.modules.collab.service.dto.TeamDTO; +import io.flexwork.modules.teams.domain.Organization; +import io.flexwork.modules.teams.domain.Team; +import io.flexwork.modules.teams.service.dto.TeamDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; diff --git a/server/src/main/java/io/flexwork/modules/teams/service/mapper/TeamRequestMapper.java b/server/src/main/java/io/flexwork/modules/teams/service/mapper/TeamRequestMapper.java index fd9cf517..6aa2b198 100644 --- a/server/src/main/java/io/flexwork/modules/teams/service/mapper/TeamRequestMapper.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/mapper/TeamRequestMapper.java @@ -1,6 +1,6 @@ package io.flexwork.modules.teams.service.mapper; -import io.flexwork.modules.collab.domain.Team; +import io.flexwork.modules.teams.domain.Team; import io.flexwork.modules.teams.domain.TeamRequest; import io.flexwork.modules.teams.domain.Workflow; import io.flexwork.modules.teams.service.dto.TeamRequestDTO; diff --git a/server/src/main/java/io/flexwork/modules/teams/service/mapper/WorkflowMapper.java b/server/src/main/java/io/flexwork/modules/teams/service/mapper/WorkflowMapper.java index c754c8bf..ab3049d0 100644 --- a/server/src/main/java/io/flexwork/modules/teams/service/mapper/WorkflowMapper.java +++ b/server/src/main/java/io/flexwork/modules/teams/service/mapper/WorkflowMapper.java @@ -1,6 +1,6 @@ package io.flexwork.modules.teams.service.mapper; -import io.flexwork.modules.collab.domain.Team; +import io.flexwork.modules.teams.domain.Team; import io.flexwork.modules.teams.domain.Workflow; import io.flexwork.modules.teams.service.dto.WorkflowDTO; import org.mapstruct.Mapper; diff --git a/server/src/main/java/io/flexwork/modules/collab/web/rest/OrganizationController.java b/server/src/main/java/io/flexwork/modules/teams/web/rest/OrganizationController.java similarity index 90% rename from server/src/main/java/io/flexwork/modules/collab/web/rest/OrganizationController.java rename to server/src/main/java/io/flexwork/modules/teams/web/rest/OrganizationController.java index 17d9acb7..e7f0f5b6 100644 --- a/server/src/main/java/io/flexwork/modules/collab/web/rest/OrganizationController.java +++ b/server/src/main/java/io/flexwork/modules/teams/web/rest/OrganizationController.java @@ -1,9 +1,9 @@ -package io.flexwork.modules.collab.web.rest; +package io.flexwork.modules.teams.web.rest; -import io.flexwork.modules.collab.domain.Organization; -import io.flexwork.modules.collab.service.OrganizationService; -import io.flexwork.modules.collab.service.dto.OrganizationDTO; -import io.flexwork.modules.collab.service.mapper.OrganizationMapper; +import io.flexwork.modules.teams.domain.Organization; +import io.flexwork.modules.teams.service.OrganizationService; +import io.flexwork.modules.teams.service.dto.OrganizationDTO; +import io.flexwork.modules.teams.service.mapper.OrganizationMapper; import io.flexwork.query.QueryDTO; import java.util.Optional; import org.springframework.data.domain.Page; diff --git a/server/src/main/java/io/flexwork/modules/collab/web/rest/TeamController.java b/server/src/main/java/io/flexwork/modules/teams/web/rest/TeamController.java similarity index 96% rename from server/src/main/java/io/flexwork/modules/collab/web/rest/TeamController.java rename to server/src/main/java/io/flexwork/modules/teams/web/rest/TeamController.java index 7b5a860c..2e0844c4 100644 --- a/server/src/main/java/io/flexwork/modules/collab/web/rest/TeamController.java +++ b/server/src/main/java/io/flexwork/modules/teams/web/rest/TeamController.java @@ -1,10 +1,10 @@ -package io.flexwork.modules.collab.web.rest; +package io.flexwork.modules.teams.web.rest; -import io.flexwork.modules.collab.domain.Team; -import io.flexwork.modules.collab.service.TeamService; -import io.flexwork.modules.collab.service.dto.TeamDTO; import io.flexwork.modules.fss.ResourceRemoveEvent; import io.flexwork.modules.fss.service.StorageService; +import io.flexwork.modules.teams.domain.Team; +import io.flexwork.modules.teams.service.TeamService; +import io.flexwork.modules.teams.service.dto.TeamDTO; import io.flexwork.modules.usermanagement.service.dto.UserDTO; import io.flexwork.modules.usermanagement.service.dto.UserWithTeamRoleDTO; import io.flexwork.query.QueryDTO; @@ -117,7 +117,6 @@ public ResponseEntity findTeamById(@PathVariable Long id) { .orElseGet(() -> ResponseEntity.notFound().build()); } - // Find teams @PostMapping("/search") public ResponseEntity> findTeams( @Valid @RequestBody Optional queryDTO, Pageable pageable) { diff --git a/server/src/main/java/io/flexwork/modules/teams/web/rest/TeamRequestController.java b/server/src/main/java/io/flexwork/modules/teams/web/rest/TeamRequestController.java index 721f57c2..8d956037 100644 --- a/server/src/main/java/io/flexwork/modules/teams/web/rest/TeamRequestController.java +++ b/server/src/main/java/io/flexwork/modules/teams/web/rest/TeamRequestController.java @@ -66,4 +66,20 @@ public ResponseEntity deleteTeamRequest(@PathVariable Long id) { teamRequestService.deleteTeamRequest(id); return ResponseEntity.noContent().build(); } + + @GetMapping("/{currentId}/next") + public ResponseEntity getNextEntity(@PathVariable Long currentId) { + return teamRequestService + .getNextEntity(currentId) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @GetMapping("/{currentId}/previous") + public ResponseEntity getPreviousEntity(@PathVariable Long currentId) { + return teamRequestService + .getPreviousEntity(currentId) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } } diff --git a/server/src/main/java/io/flexwork/modules/usermanagement/domain/User.java b/server/src/main/java/io/flexwork/modules/usermanagement/domain/User.java index fe1c70f0..bf0b1c6b 100644 --- a/server/src/main/java/io/flexwork/modules/usermanagement/domain/User.java +++ b/server/src/main/java/io/flexwork/modules/usermanagement/domain/User.java @@ -1,7 +1,7 @@ package io.flexwork.modules.usermanagement.domain; import com.fasterxml.jackson.annotation.JsonIgnore; -import io.flexwork.modules.collab.domain.Team; +import io.flexwork.modules.teams.domain.Team; import jakarta.persistence.*; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotNull; diff --git a/server/src/main/java/io/flexwork/modules/usermanagement/domain/UserTeam.java b/server/src/main/java/io/flexwork/modules/usermanagement/domain/UserTeam.java index ce91b681..5d329c20 100644 --- a/server/src/main/java/io/flexwork/modules/usermanagement/domain/UserTeam.java +++ b/server/src/main/java/io/flexwork/modules/usermanagement/domain/UserTeam.java @@ -1,7 +1,7 @@ package io.flexwork.modules.usermanagement.domain; -import io.flexwork.modules.collab.domain.Team; -import io.flexwork.modules.collab.domain.TeamRole; +import io.flexwork.modules.teams.domain.Team; +import io.flexwork.modules.teams.domain.TeamRole; import jakarta.persistence.EmbeddedId; import jakarta.persistence.Entity; import jakarta.persistence.JoinColumn; diff --git a/server/src/main/java/io/flexwork/modules/usermanagement/web/rest/UserController.java b/server/src/main/java/io/flexwork/modules/usermanagement/web/rest/UserController.java index 6f9f6172..e831f3b7 100644 --- a/server/src/main/java/io/flexwork/modules/usermanagement/web/rest/UserController.java +++ b/server/src/main/java/io/flexwork/modules/usermanagement/web/rest/UserController.java @@ -1,6 +1,6 @@ package io.flexwork.modules.usermanagement.web.rest; -import com.flexwork.platform.utils.CodecUtils; +import com.flexwork.platform.utils.Obfuscator; import io.flexwork.modules.collab.service.MailService; import io.flexwork.modules.fss.service.StorageService; import io.flexwork.modules.usermanagement.AuthoritiesConstants; @@ -186,7 +186,7 @@ public ResponseEntity updateUser( String avatarPath = storageService.uploadImage( "avatar", - CodecUtils.encodeLongToBase64(userDTO.getId()), + Obfuscator.obfuscate(userDTO.getId()), avatarFile.getInputStream()); userDTO.setImageUrl(avatarPath); } diff --git a/server/src/test/java/io/flexwork/modules/usermanagement/service/mapper/OrganizationMapperTest.java b/server/src/test/java/io/flexwork/modules/usermanagement/service/mapper/OrganizationMapperTest.java index 7f7dbd37..09e0d26b 100644 --- a/server/src/test/java/io/flexwork/modules/usermanagement/service/mapper/OrganizationMapperTest.java +++ b/server/src/test/java/io/flexwork/modules/usermanagement/service/mapper/OrganizationMapperTest.java @@ -4,10 +4,10 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; -import io.flexwork.modules.collab.domain.Organization; -import io.flexwork.modules.collab.domain.Team; -import io.flexwork.modules.collab.service.dto.OrganizationDTO; -import io.flexwork.modules.collab.service.mapper.OrganizationMapper; +import io.flexwork.modules.teams.domain.Organization; +import io.flexwork.modules.teams.domain.Team; +import io.flexwork.modules.teams.service.dto.OrganizationDTO; +import io.flexwork.modules.teams.service.mapper.OrganizationMapper; import java.util.Set; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; diff --git a/server/src/test/java/io/flexwork/modules/usermanagement/service/mapper/TeamMapperTest.java b/server/src/test/java/io/flexwork/modules/usermanagement/service/mapper/TeamMapperTest.java index cc0b0915..ea86b562 100644 --- a/server/src/test/java/io/flexwork/modules/usermanagement/service/mapper/TeamMapperTest.java +++ b/server/src/test/java/io/flexwork/modules/usermanagement/service/mapper/TeamMapperTest.java @@ -3,10 +3,10 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; -import io.flexwork.modules.collab.domain.Organization; -import io.flexwork.modules.collab.domain.Team; -import io.flexwork.modules.collab.service.dto.TeamDTO; -import io.flexwork.modules.collab.service.mapper.TeamMapper; +import io.flexwork.modules.teams.domain.Organization; +import io.flexwork.modules.teams.domain.Team; +import io.flexwork.modules.teams.service.dto.TeamDTO; +import io.flexwork.modules.teams.service.mapper.TeamMapper; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; diff --git a/tools/platform/src/main/java/com/flexwork/platform/utils/CodecUtils.java b/tools/platform/src/main/java/com/flexwork/platform/utils/CodecUtils.java deleted file mode 100644 index e28b1e56..00000000 --- a/tools/platform/src/main/java/com/flexwork/platform/utils/CodecUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.flexwork.platform.utils; - -import java.nio.ByteBuffer; -import java.util.Base64; - -public class CodecUtils { - - public static String encodeLongToBase64(Long value) { - ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); - buffer.putLong(value); - return Base64.getUrlEncoder().withoutPadding().encodeToString(buffer.array()); - } - - - public static Long decodeBase64ToLong(String base64) { - byte[] bytes = Base64.getUrlDecoder().decode(base64); - ByteBuffer buffer = ByteBuffer.wrap(bytes); - return buffer.getLong(); - } -} diff --git a/tools/platform/src/main/java/com/flexwork/platform/utils/Obfuscator.java b/tools/platform/src/main/java/com/flexwork/platform/utils/Obfuscator.java new file mode 100644 index 00000000..02aafa58 --- /dev/null +++ b/tools/platform/src/main/java/com/flexwork/platform/utils/Obfuscator.java @@ -0,0 +1,41 @@ +package com.flexwork.platform.utils; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class Obfuscator { + + // Function to obfuscate a value (string or number) + public static String obfuscate(Object value) { + if (value == null) { + throw new IllegalArgumentException("Invalid input: value cannot be null"); + } + + // Convert the value to a string, encode to Base64, and make it URL-safe + String base64 = Base64.getEncoder().encodeToString(value.toString().getBytes(StandardCharsets.UTF_8)); + return base64.replace("+", "-").replace("/", "_").replace("=", ""); + } + + // Function to deobfuscate the value (returns the original type: string or number) + public static Object deobfuscate(String encodedValue) { + if (encodedValue == null || encodedValue.isEmpty()) { + throw new IllegalArgumentException("Invalid input: encodedValue cannot be null or empty"); + } + + // Decode the URL-safe Base64 string + String base64 = encodedValue.replace("-", "+").replace("_", "/"); + while (base64.length() % 4 != 0) { + base64 += "="; // Add padding + } + + String decodedString = new String(Base64.getDecoder().decode(base64), StandardCharsets.UTF_8); + + // Try to parse the decoded string as a number + try { + return Double.parseDouble(decodedString); + } catch (NumberFormatException e) { + return decodedString; + } + } +} +