Skip to content

Commit 13cbc27

Browse files
authored
Merge pull request #430 from TaskFlow-CLAP/CLAP-335
CLAP-335 회원 등록 시에 해당 부서가 담당자 권한을 가지는지 검증 로직 구현
2 parents efa7ab0 + a2f1899 commit 13cbc27

32 files changed

+158
-141
lines changed
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package clap.server.adapter.inbound.web.dto.admin.response;
22

3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
35
public record FindAllDepartmentsResponse(
46
Long departmentId,
5-
String name) {
7+
String name,
8+
@Schema(description = "담당자 권한 여부")
9+
Boolean isManager) {
610
}

src/main/java/clap/server/adapter/inbound/web/example/ErrorExampleController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public void getCommentErrorCode() {}
5353
@GetMapping("/statistic")
5454
@DevelopOnlyApi
5555
@Operation(summary = "작업 통계 관련 에러 코드 나열")
56-
@ApiErrorCodes(LabelErrorCode.class)
56+
@ApiErrorCodes(StatisticsErrorCode.class)
5757
public void getStatisticsErrorCode() {}
5858

5959
@GetMapping("/label")

src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,26 @@
44
import clap.server.adapter.outbound.persistense.entity.member.MemberEntity;
55
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
66
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus;
7-
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
8-
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
97
import clap.server.adapter.outbound.persistense.mapper.MemberPersistenceMapper;
10-
import clap.server.adapter.outbound.persistense.mapper.TaskPersistenceMapper;
118
import clap.server.adapter.outbound.persistense.repository.member.MemberRepository;
12-
import clap.server.adapter.outbound.persistense.repository.task.TaskRepository;
139
import clap.server.application.port.outbound.member.CommandMemberPort;
1410
import clap.server.application.port.outbound.member.LoadMemberPort;
1511
import clap.server.common.annotation.architecture.PersistenceAdapter;
1612
import clap.server.domain.model.member.Member;
17-
import clap.server.domain.model.task.Task;
1813
import lombok.RequiredArgsConstructor;
1914
import org.springframework.data.domain.Page;
2015
import org.springframework.data.domain.Pageable;
2116

2217
import java.util.List;
2318
import java.util.Optional;
19+
import java.util.Set;
2420
import java.util.stream.Collectors;
2521

2622
@PersistenceAdapter
2723
@RequiredArgsConstructor
2824
public class MemberPersistenceAdapter implements LoadMemberPort, CommandMemberPort {
2925
private final MemberRepository memberRepository;
3026
private final MemberPersistenceMapper memberPersistenceMapper;
31-
private final TaskRepository taskRepository;
32-
private final TaskPersistenceMapper taskPersistenceMapper;
3327

3428
@Override
3529
public Optional<Member> findById(final Long id) {
@@ -83,14 +77,6 @@ public List<Member> findActiveManagers() {
8377
.collect(Collectors.toList());
8478
}
8579

86-
@Override
87-
public List<Task> findTasksByMemberIdAndStatus(final Long memberId, final List<TaskStatus> taskStatuses) {
88-
List<TaskEntity> taskEntities = taskRepository.findByProcessor_MemberIdAndTaskStatusIn(memberId, taskStatuses);
89-
return taskEntities.stream()
90-
.map(taskPersistenceMapper::toDomain)
91-
.collect(Collectors.toList());
92-
}
93-
9480
@Override
9581
public Page<Member> findAllMembers(final Pageable pageable) {
9682
return memberRepository.findAllMembers(pageable).map(memberPersistenceMapper::toDomain);
@@ -117,4 +103,8 @@ public Optional<Member> findByEmail(final String email) {
117103
.map(memberPersistenceMapper::toDomain);
118104
}
119105

106+
@Override
107+
public boolean existsByNicknamesOrEmails(Set<String> nicknames, Set<String> emails) {
108+
return memberRepository.existsByNicknamesOrEmails(nicknames, emails);
109+
}
120110
}

src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.time.LocalTime;
2222
import java.util.List;
2323
import java.util.Optional;
24+
import java.util.stream.Collectors;
2425

2526
@Slf4j
2627
@PersistenceAdapter
@@ -116,5 +117,12 @@ public List<Task> findTeamStatus(final Long memberId, final FilterTeamStatusRequ
116117
.map(taskPersistenceMapper::toDomain).toList();
117118
}
118119

120+
@Override
121+
public List<Task> findTasksByMemberIdAndStatus(final Long memberId, final List<TaskStatus> taskStatuses) {
122+
List<TaskEntity> taskEntities = taskRepository.findByProcessor_MemberIdAndTaskStatusIn(memberId, taskStatuses);
123+
return taskEntities.stream()
124+
.map(taskPersistenceMapper::toDomain)
125+
.collect(Collectors.toList());
126+
}
119127

120128
}

src/main/java/clap/server/adapter/outbound/persistense/entity/member/DepartmentEntity.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,7 @@ public class DepartmentEntity extends BaseTimeEntity {
3030
@Column(nullable = false)
3131
@Enumerated(EnumType.STRING)
3232
private DepartmentStatus status;
33+
34+
@Column(nullable = false)
35+
private boolean isManager;
3336
}

src/main/java/clap/server/adapter/outbound/persistense/mapper/DepartmentPersistenceMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
public interface DepartmentPersistenceMapper extends PersistenceMapper<DepartmentEntity, Department> {
1111

1212
@Mapping(source = "admin.memberId", target = "adminId")
13+
@Mapping(source = "manager", target = "isManager")
1314
Department toDomain(DepartmentEntity entity);
1415

1516
@Mapping(source = "adminId", target = "admin.memberId")
17+
@Mapping(source = "manager", target = "isManager")
1618
DepartmentEntity toEntity(Department domain);
1719
}

src/main/java/clap/server/adapter/outbound/persistense/mapper/MemberPersistenceMapper.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,12 @@ protected Member toDomainAdmin(MemberEntity admin) {
4545
if (admin == null) return null;
4646
return Member.builder()
4747
.memberId(admin.getMemberId())
48-
.memberInfo(new MemberInfo(
49-
admin.getName(),
50-
admin.getEmail(),
51-
admin.getNickname(),
52-
admin.isReviewer(),
53-
departmentPersistenceMapper.toDomain(admin.getDepartment()),
54-
admin.getRole(),
55-
admin.getDepartmentRole()
56-
))
48+
.memberInfo(MemberInfo.builder()
49+
.name(admin.getName())
50+
.email(admin.getEmail())
51+
.nickname(admin.getNickname())
52+
.isReviewer(admin.isReviewer())
53+
.build())
5754
.createdAt(admin.getCreatedAt())
5855
.updatedAt(admin.getUpdatedAt())
5956
.build();

src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
55
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus;
66
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
79
import org.springframework.stereotype.Repository;
810

911
import java.util.List;
1012
import java.util.Optional;
13+
import java.util.Set;
1114

1215
@Repository
1316
public interface MemberRepository extends JpaRepository<MemberEntity, Long>, MemberCustomRepository {
@@ -28,5 +31,8 @@ public interface MemberRepository extends JpaRepository<MemberEntity, Long>, Me
2831
Optional<MemberEntity> findByNameAndEmail(String name, String email);
2932

3033
Optional<MemberEntity> findByEmail(String email);
34+
35+
@Query("SELECT COUNT(m) > 0 FROM MemberEntity m WHERE m.nickname IN :nicknames OR m.email IN :emails")
36+
boolean existsByNicknamesOrEmails(@Param("nicknames") Set<String> nicknames, @Param("emails") Set<String> emails);
3137
}
3238

src/main/java/clap/server/application/mapper/response/DepartmentResponseMapper.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ public class DepartmentResponseMapper {
77
private DepartmentResponseMapper() {
88
throw new IllegalStateException("Utility class");
99
}
10+
1011
public static FindAllDepartmentsResponse toFindAllDepartmentsResponse(Department department) {
11-
return new FindAllDepartmentsResponse(department.getDepartmentId(), department.getName());
12+
return new FindAllDepartmentsResponse(
13+
department.getDepartmentId(),
14+
department.getName(),
15+
department.isManager());
1216
}
1317
}

src/main/java/clap/server/application/port/inbound/domain/MemberService.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ public Member findActiveMember(Long memberId) {
2525
() -> new ApplicationException(MemberErrorCode.ACTIVE_MEMBER_NOT_FOUND));
2626
}
2727

28-
public int getRemainingTasks(Long memberId) {
29-
List<TaskStatus> targetStatuses = List.of(TaskStatus.IN_PROGRESS, TaskStatus.IN_REVIEWING);
30-
return loadMemberPort.findTasksByMemberIdAndStatus(memberId, targetStatuses).size();
31-
}
32-
3328
public List<Member> findActiveManagers() {
3429
List<Member> activeManagers = loadMemberPort.findActiveManagers();
3530

0 commit comments

Comments
 (0)