특정 스페이스 멤버 조회 api도 만들었다.
스페이스 멤버 조회 API 추가(스페이스에 가입한 사용자들의 목록을 반환하는 API를 추가)
아래 코드는 Controller Facade Service Repository 합친 코드이다.
@GetMapping("/{spaceId}/members")
public Flux<UserResponseDto> getSpaceMembers(@PathVariable Long spaceId) {
return spaceFacade.getSpaceMembers(spaceId);
}
public Flux<UserResponseDto> getSpaceMembers(Long spaceId) {
return spaceService.getSpaceMembers(spaceId)
.flatMap(spaceMember -> userFacade.findUserById(spaceMember.getUserId()));
}
public Flux<SpaceMember> getSpaceMembers(Long spaceId) {
return spaceRepository.findById(spaceId)
.switchIfEmpty(Mono.error(new CustomException(SpaceErrorCode.SPACE_NOT_FOUND)))
.flatMapMany(existingSpace -> spaceMemberRepository.findAllBySpaceId(spaceId));
}
Flux<SpaceMember> findAllBySpaceId(Long spaceId);
그리고 저번에 space 쪽 crud를 할 때, SpaceFacade 부분에서 다른 코드의 Service 부분을 주입받아야 하는데 내가 Facade 부분을 주입받았다. 그래서 코드를 고쳐줬다.
public class SpaceFacade {
private final SpaceService spaceService;
private final UserService userService;
public Mono<SpaceResponseDto> createSpace(SpaceRequestDto requestDto, Long userId) {
return spaceService.createSpace(requestDto, userId);
@@ -50,8 +50,8 @@ public Flux<SpaceResponseDto> getUserSpaces(Long userId) {
public Flux<UserResponseDto> getSpaceMembers(Long spaceId) {
return spaceService.getSpaceMembers(spaceId)
.flatMap(spaceMember -> userService.findById(spaceMember.getUserId())
.map(UserResponseDto::new));
}
}
그리고, object 부분을 dto로 바꿔 줬다. Controller 부분.
@DeleteMapping("/{spaceId}")
public Mono<ResponseEntity<String>> deleteSpace(@PathVariable Long spaceId) {
return spaceFacade.deleteSpace(spaceId)
.then(Mono.just(ResponseEntity.ok(SpaceSuccessCode.SPACE_DELETE.getMsg())));
}
@PostMapping("/join/{uuid}")
public Mono<ResponseEntity<SpaceResponseDto>> joinSpace(
@AuthenticationPrincipal UserPrincipal userPrincipal,
@PathVariable String uuid) {
return spaceFacade.joinSpace(uuid, userPrincipal.getUser().getId())
.map(ResponseEntity::ok);
}
ChannelFacade에서도 다른 Repository를 주입받아줬다.
@RequiredArgsConstructor
@Component
public class ChannelFacade {
private final ChannelService channelService;
private final SpaceRepository spaceRepository;
public Mono<ChannelResponseDto> createChannel(Long spaceId, ChannelRequestDto requestDto) {
return findSpaceById(spaceId)
.flatMap(space -> channelService.createChannel(spaceId, requestDto));
}
private Mono<Space> findSpaceById(Long spaceId) {
return spaceRepository.findById(spaceId)
.switchIfEmpty(Mono.error(new CustomException(SpaceErrorCode.SPACE_NOT_FOUND)));
}
}
Service 부분은 이렇게 바뀌었다! Service 부분에서 다른 Repository 받던걸, Facade로 옮겨줬으니!
@RequiredArgsConstructor
@Service
public class ChannelService {
private final ChannelRepository channelRepository;
public Mono<ChannelResponseDto> createChannel(Long spaceId, ChannelRequestDto requestDto) {
Channel channel = buildChannel(null, spaceId, requestDto);
return channelRepository.save(channel)
.map(this::toChannelResponseDto);
}
private Mono<Channel> findChannelById(Long channelId) {
return channelRepository.findById(channelId)
.switchIfEmpty(Mono.error(new CustomException(ChannelErrorCode.CHANNEL_NOT_FOUND)));
}
private Channel buildChannel(Long channelId, Long spaceId, ChannelRequestDto requestDto) {
return Channel.builder()
.id(channelId)
.spaceId(spaceId)
.channelName(requestDto.getChannelName())
.channelType(Channel.Type.valueOf(requestDto.getChannelType()).name())
.build();
}
private ChannelResponseDto toChannelResponseDto(Channel channel) {
return ChannelResponseDto.builder()
.id(channel.getId())
.channelName(channel.getChannelName())
.channelType(channel.getChannelType())
.build();
}
}
'TIL' 카테고리의 다른 글
TIL - 2024/08/09 (0) | 2024.08.16 |
---|---|
TIL - 2024/08/08 (0) | 2024.08.15 |
TIL - 2024/08/06 (0) | 2024.08.15 |
TIL - 2024/08/05 (0) | 2024.08.12 |
TIL - 2024/08/02 (0) | 2024.08.10 |