TIL

TIL - 2024/08/07

기석김 2024. 8. 15. 02:13

특정 스페이스 멤버 조회 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);

 

스페이스 멤버 조회 api (ex 1번 스페이스의 멤버)
예외처리, 스페이스 id가 없을 때

 

 

그리고 저번에 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();
    }
}