Skip to content

Commit

Permalink
Team request edit (#14)
Browse files Browse the repository at this point in the history
  • Loading branch information
haiphucnguyen authored Nov 25, 2024
1 parent 6b58679 commit 59f68b5
Show file tree
Hide file tree
Showing 34 changed files with 207 additions and 94 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -11,7 +12,7 @@
@Repository
public interface NotificationRepository extends JpaRepository<Notification, Long> {

List<Notification> findByUserIdAndIsReadFalse(Long userId);
List<Notification> findByUserIdAndIsReadFalse(Long userId, Sort sort);

@Modifying
@Query("UPDATE Notification n SET n.isRead = true WHERE n.id IN :ids")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -22,7 +23,9 @@ public NotificationService(

@Transactional(readOnly = true)
public List<NotificationDTO> getUnreadNotificationsForUser(Long userId) {
return notificationRepository.findByUserIdAndIsReadFalse(userId).stream()
return notificationRepository
.findByUserIdAndIsReadFalse(userId, Sort.by(Sort.Direction.DESC, "createdAt"))
.stream()
.map(notificationMapper::toDTO)
.toList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,15 @@ public ResponseEntity<Page<AccountDTO>> findAccounts(
return new ResponseEntity<>(accounts, HttpStatus.OK);
}

@GetMapping("/next/{currentId}")
@GetMapping("/{currentId}/next")
public ResponseEntity<AccountDTO> getNextEntity(@PathVariable Long currentId) {
return accountService
.getNextEntity(currentId)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}

@GetMapping("/previous/{currentId}")
@GetMapping("/{currentId}/previous")
public ResponseEntity<AccountDTO> getPreviousEntity(@PathVariable Long currentId) {
return accountService
.getPreviousEntity(currentId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.flexwork.modules.collab.domain;
package io.flexwork.modules.teams.domain;

import jakarta.persistence.*;
import java.util.Set;
Expand Down
Original file line number Diff line number Diff line change
@@ -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.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.flexwork.modules.collab.domain;
package io.flexwork.modules.teams.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -17,7 +17,7 @@
@Repository
public interface TeamRepository extends JpaRepository<Team, Long>, JpaSpecificationExecutor<Team> {
@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<TeamDTO> findAllDTOs(Specification<Team> spec, Pageable pageable);
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -15,4 +18,41 @@ public interface TeamRequestRepository

@EntityGraph(attributePaths = {"team", "requestUser", "assignUser", "workflow"})
Page<TeamRequest> findAll(Specification<TeamRequest> spec, Pageable pageable);

@EntityGraph(attributePaths = {"team", "requestUser", "assignUser", "workflow"})
Optional<TeamRequest> 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<TeamRequest> 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<TeamRequest> findNextEntity(@Param("requestId") Long requestId);
}
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,6 +28,7 @@
@Service
@Transactional
public class TeamRequestService {
@PersistenceContext private EntityManager entityManager;

private final TeamRequestRepository teamRequestRepository;
private final TeamRequestMapper teamRequestMapper;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -123,4 +134,12 @@ private static boolean hasTeamIdFilter(QueryDTO queryDTO) {
.filter(Objects::nonNull)
.anyMatch(filter -> "team.id".equals(filter.getField()));
}

public Optional<TeamRequestDTO> getNextEntity(Long requestId) {
return teamRequestRepository.findNextEntity(requestId).map(teamRequestMapper::toDto);
}

public Optional<TeamRequestDTO> getPreviousEntity(Long requestId) {
return teamRequestRepository.findPreviousEntity(requestId).map(teamRequestMapper::toDto);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.flexwork.modules.collab.service.dto;
package io.flexwork.modules.teams.service.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<UserWithTeamRoleDTO> usersInTeam =
teamRepository.findUsersByTeamId(teamRequestDTO.getTeamId());
List<Notification> notifications =
usersInTeam.stream()
.filter(
user ->
!user.getId()
.equals(
teamRequestDTO
.getRequestUserId())) // Exclude
// creator
.map(
user ->
Notification.builder()
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Loading

0 comments on commit 59f68b5

Please sign in to comment.