diff --git a/layer-api/src/main/java/org/layer/config/SecurityConfig.java b/layer-api/src/main/java/org/layer/config/SecurityConfig.java index 3eeafc82..9e784157 100644 --- a/layer-api/src/main/java/org/layer/config/SecurityConfig.java +++ b/layer-api/src/main/java/org/layer/config/SecurityConfig.java @@ -52,7 +52,7 @@ private void setHttp(HttpSecurity http) throws Exception { .requestMatchers(new AntPathRequestMatcher("/api/auth/sign-up")).permitAll() .requestMatchers(new AntPathRequestMatcher("/api/auth/oauth2/google")).permitAll() .requestMatchers(new AntPathRequestMatcher("/api/auth/oauth2/kakao")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/api/test")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/api/space/public/*")).permitAll() .requestMatchers(new AntPathRequestMatcher("/api/auth/test")).permitAll() .requestMatchers(new AntPathRequestMatcher("/h2-console/**")).permitAll() .requestMatchers(new AntPathRequestMatcher("/external/image/presigned")).permitAll() diff --git a/layer-api/src/main/java/org/layer/domain/space/controller/SpaceApi.java b/layer-api/src/main/java/org/layer/domain/space/controller/SpaceApi.java index 3061222a..9e957c77 100644 --- a/layer-api/src/main/java/org/layer/domain/space/controller/SpaceApi.java +++ b/layer-api/src/main/java/org/layer/domain/space/controller/SpaceApi.java @@ -85,6 +85,17 @@ public interface SpaceApi { }) ResponseEntity getSpaceById(@MemberId Long memberId, @PathVariable Long spaceId); + @Operation(summary = "PUBLIC/ 스페이스 단건 조회하기", method = "GET", description = """ + 스페이스 아이디를 통해 하나의 스페이스를 조회합니다. + 내가 속하지 않은 공간만 조회할 수 있습니다. + """) + @ApiResponses({ + @ApiResponse(responseCode = "200", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = SpaceResponse.SpaceWithMemberCountInfo.class)) + }) + }) + ResponseEntity getPublicSpaceById(@PathVariable Long spaceId); + @Operation(summary = "스페이스 입장하기", method = "POST", description = """ 공유받은 링크를 통해 스페이스에 입장합니다. diff --git a/layer-api/src/main/java/org/layer/domain/space/controller/SpaceController.java b/layer-api/src/main/java/org/layer/domain/space/controller/SpaceController.java index 91ea9766..cde7793e 100644 --- a/layer-api/src/main/java/org/layer/domain/space/controller/SpaceController.java +++ b/layer-api/src/main/java/org/layer/domain/space/controller/SpaceController.java @@ -51,6 +51,13 @@ public ResponseEntity getSpaceById(@Memb return ResponseEntity.ok((foundSpace)); } + + @GetMapping("/public/{spaceId}") + public ResponseEntity getPublicSpaceById(@PathVariable Long spaceId) { + var foundSpace = spaceService.getPublicSpaceById(spaceId); + return ResponseEntity.ok((foundSpace)); + } + @Override @PostMapping("/join") @ResponseStatus(HttpStatus.ACCEPTED) diff --git a/layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java b/layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java index 444ff730..9f7e9934 100644 --- a/layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java +++ b/layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java @@ -80,6 +80,12 @@ public SpaceResponse.SpaceWithMemberCountInfo getSpaceById(Long memberId, Long s return SpaceResponse.SpaceWithMemberCountInfo.toResponse(foundSpace); } + public SpaceResponse.SpaceWithMemberCountInfo getPublicSpaceById(Long spaceId) { + var foundSpace = spaceRepository.findByIdAndJoinedMemberId(spaceId).orElseThrow(() -> new SpaceException(NOT_FOUND_SPACE)); + + return SpaceResponse.SpaceWithMemberCountInfo.toResponse(foundSpace); + } + @Transactional public void createMemberSpace(Long memberId, Long spaceId) { diff --git a/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceCustomRepository.java b/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceCustomRepository.java index 18f26406..05fef7f8 100644 --- a/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceCustomRepository.java +++ b/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceCustomRepository.java @@ -20,6 +20,8 @@ public interface SpaceCustomRepository { Optional findByIdAndJoinedMemberId(Long spaceId, Long memberId); + Optional findByIdAndJoinedMemberId(Long spaceId); + Long updateSpace(Long spaceId, SpaceCategory category, List fieldList, String name, String introduction, String bannerUrl); List findAllSpaceMemberBySpaceIdWithIsLeader(Long spaceId); diff --git a/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceRepositoryImpl.java b/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceRepositoryImpl.java index 95c75594..2064951e 100644 --- a/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceRepositoryImpl.java +++ b/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceRepositoryImpl.java @@ -60,6 +60,19 @@ public Optional findByIdAndJoinedMemberId(Long spaceId, Lo return Optional.of(foundSpace); } + @Override + public Optional findByIdAndJoinedMemberId(Long spaceId) { + + var foundSpace = getSpaceWithMemberCountQuery().where(space.id.eq(spaceId)).fetchOne(); + + + if (foundSpace == null || isSpaceWithMemberCountEmpty(foundSpace)) { + return Optional.empty(); + } + // TODO: 커스텀 에러로 변경 + return Optional.of(foundSpace); + } + @Override public Long updateSpace(Long spaceId, SpaceCategory category, List fieldList, String name, String introduction, String bannerUrl) { var query = queryFactory.update(space); @@ -116,8 +129,8 @@ private JPAQuery getSpaceWithMemberCountQuery() { .leftJoin(memberCountRelationTable).on(space.id.eq(memberCountRelationTable.space.id)) .leftJoin(member).on(space.leaderId.eq(member.id)) .leftJoin(form).on(space.formId.eq(form.id)) - .orderBy(form.id.desc()) - .limit(1); + .orderBy(form.id.desc()) + .limit(1); }