Skip to content

Commit

Permalink
Merge pull request #31 from depromeet/feat/LS-25
Browse files Browse the repository at this point in the history
Feat/lS-25 : 스페이스 초대하기/떠나기 API
  • Loading branch information
raymondanythings authored Jul 14, 2024
2 parents 41435c8 + 53c7782 commit f389ec4
Show file tree
Hide file tree
Showing 5 changed files with 201 additions and 9 deletions.
94 changes: 92 additions & 2 deletions layer-api/src/main/java/org/layer/domain/space/api/SpaceApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
Expand Down Expand Up @@ -49,7 +50,7 @@ public interface SpaceApi {
)
}
)
void createSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRequest.CreateSpaceRequest createSpaceRequest);
ResponseEntity<Void> createSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRequest.CreateSpaceRequest createSpaceRequest);

@Operation(summary = "스페이스 수정하기", method = "POST", description = """
스페이스를 수정합니다. <br />
Expand All @@ -66,7 +67,7 @@ public interface SpaceApi {
)
}
)
void updateSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRequest.UpdateSpaceRequest updateSpaceRequest);
ResponseEntity<Void> updateSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRequest.UpdateSpaceRequest updateSpaceRequest);

@Operation(summary = "스페이스 단건 조회하기", method = "GET", description = """
스페이스 아이디를 통해 하나의 스페이스를 조회합니다.
Expand All @@ -78,4 +79,93 @@ public interface SpaceApi {
})
})
ResponseEntity<SpaceResponse.SpaceWithMemberCountInfo> getSpaceById(@MemberId Long memberId, @PathVariable Long spaceId);


@Operation(summary = "스페이스 입장하기", method = "POST", description = """
공유받은 링크를 통해 스페이스에 입장합니다.
category가 TEAM인 경우만 가능합니다.
회원이 아닐 경우 입장할 수 없습니다.
""")
@ApiResponses({
@ApiResponse(responseCode = "202", content = {
@Content(mediaType = "application/json", schema = @Schema)
}),
@ApiResponse(
responseCode = "400",
content = @Content(
mediaType = "application/json",
schema = @Schema(),
examples = {
@ExampleObject(
name = "SPACE_ALREADY_JOINED",
description = "이미 참여중인 스페이스",
value = """
{
"name": "SPACE_ALREADY_JOINED",
"message": "이미 가입한 스페이스에요."
}
"""
),
@ExampleObject(
name = "SPACE_NOT_FOUND",
description = "존재하지 않는 스페이스",
value = """
{
"name": "SPACE_NOT_FOUND",
"message": "스페이스를 찾을 수 없어요."
}
"""
)


}
)

)
})
ResponseEntity<Void> createMemberSpace(@MemberId Long memberId, @PathVariable Long spaceId);

@Operation(summary = "스페이스 탈퇴하기", method = "POST", description = """
내가 속한 스페이스를 탈퇴합니다.
category가 TEAM인 경우만 가능합니다.
회원이 아닐 경우 입장할 수 없습니다.
""")
@ApiResponses({
@ApiResponse(responseCode = "202", content = {
@Content(mediaType = "application/json", schema = @Schema)
}),
@ApiResponse(
responseCode = "400",
content = @Content(
mediaType = "application/json",
schema = @Schema(),
examples = {
@ExampleObject(
name = "SPACE_NOT_JOINED",
description = "참여중인 스페이스가 아닐경우.",
value = """
{
"name": "SPACE_NOT_JOINED",
"message": "참여중인 스페이스가 아니에요."
}
"""
),
@ExampleObject(
name = "SPACE_NOT_FOUND",
description = "존재하지 않는 스페이스",
value = """
{
"name": "SPACE_NOT_FOUND",
"message": "스페이스를 찾을 수 없어요."
}
"""
)


}
)

)
})
ResponseEntity<Void> removeMemberSpace(@MemberId Long memberId, @PathVariable Long spaceId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,39 @@ public ResponseEntity<SpaceResponse.SpacePage> getMySpaceList(@MemberId Long mem

@Override
@PutMapping("")
public void createSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRequest.CreateSpaceRequest createSpaceRequest) {
public ResponseEntity<Void> createSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRequest.CreateSpaceRequest createSpaceRequest) {
spaceService.createSpace(memberId, createSpaceRequest);
return ResponseEntity.ok().build();
}

@Override
@PostMapping("")
@ResponseStatus(HttpStatus.ACCEPTED)
public void updateSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRequest.UpdateSpaceRequest updateSpaceRequest) {
public ResponseEntity<Void> updateSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRequest.UpdateSpaceRequest updateSpaceRequest) {
spaceService.updateSpace(memberId, updateSpaceRequest);
return ResponseEntity.ok().build();
}

@GetMapping("/{spaceId}")
public ResponseEntity<SpaceResponse.SpaceWithMemberCountInfo> getSpaceById(@MemberId Long memberId, @PathVariable Long spaceId) {
var foundSpace = spaceService.getSpaceById(memberId, spaceId);
return ResponseEntity.ok((foundSpace));
}

@Override
@PostMapping("/join")
@ResponseStatus(HttpStatus.ACCEPTED)
public ResponseEntity<Void> createMemberSpace(@MemberId Long memberId, @RequestParam Long spaceId) {
spaceService.createMemberSpace(memberId, spaceId);
return ResponseEntity.ok().build();
}

@Override
@PostMapping("/leave")
@ResponseStatus(HttpStatus.ACCEPTED)
public ResponseEntity<Void> removeMemberSpace(@MemberId Long memberId, @RequestParam Long spaceId) {
spaceService.removeMemberSpace(memberId, spaceId);
return ResponseEntity.ok().build();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
@RequiredArgsConstructor
public enum SpaceExceptionType implements ExceptionType {

/**
*
*/

SPACE_NOT_FOUND(BAD_REQUEST, "스페이스를 찾을 수 없어요.");
SPACE_NOT_FOUND(BAD_REQUEST, "스페이스를 찾을 수 없어요."),

SPACE_NOT_JOINED(BAD_REQUEST, "참여중인 스페이스가 아니에요."),
SPACE_LEADER_CANNOT_LEAVE(BAD_REQUEST, "스페이스를 팀장은 떠날 수 없어요."),
SPACE_ALREADY_JOINED(BAD_REQUEST, "이미 가입한 스페이스에요.");


private final HttpStatus status;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.layer.domain.space.dto.SpaceRequest;
import org.layer.domain.space.dto.SpaceResponse;
import org.layer.domain.space.entity.MemberSpaceRelation;
import org.layer.domain.space.entity.SpaceCategory;
import org.layer.domain.space.exception.SpaceException;
import org.layer.domain.space.repository.MemberSpaceRelationRepository;
import org.layer.domain.space.repository.SpaceRepository;
Expand All @@ -15,7 +16,7 @@

import java.util.stream.Collectors;

import static org.layer.domain.space.exception.SpaceExceptionType.SPACE_NOT_FOUND;
import static org.layer.domain.space.exception.SpaceExceptionType.*;

@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -62,4 +63,76 @@ public SpaceResponse.SpaceWithMemberCountInfo getSpaceById(Long memberId, Long s
return SpaceResponse.SpaceWithMemberCountInfo.toResponse(foundSpace);
}

@Transactional
public void createMemberSpace(Long memberId, Long spaceId) {

/*
존재하는 스페이스 여부 확인
*/
var foundSpace = spaceRepository.findById(spaceId)
.orElseThrow(() -> new SpaceException(SPACE_NOT_FOUND)
);

if (foundSpace.getCategory() == SpaceCategory.INDIVIDUAL) {
throw new SpaceException(SPACE_NOT_FOUND);
}


/*
이미 참여중인 스페이스 여부 확인
*/
memberSpaceRelationRepository.findBySpaceIdAndMemberId(spaceId, memberId).ifPresent(it -> {
throw new SpaceException(SPACE_ALREADY_JOINED);
});

/*
스페이스 참여여부 저장
*/
var joinedSpace = MemberSpaceRelation.builder()
.space(foundSpace)
.memberId(memberId)
.build();
memberSpaceRelationRepository.save(joinedSpace);
}

@Transactional
public void removeMemberSpace(Long memberId, Long spaceId) {
/*
존재하는 스페이스 여부 확인
*/
var foundSpace = spaceRepository.findById(spaceId)
.orElseThrow(() -> new SpaceException(SPACE_NOT_FOUND)
);

/*
스페이스 팀장 여부 확인
*/
foundSpace.isLeaderSpace(memberId)
.orElseThrow(() -> new SpaceException(SPACE_LEADER_CANNOT_LEAVE));

/*
개인 스페이스의 경우, 이탈 시 Space 엔티티의 로직이 된다.
따라서 INDIVIDUAL인 Space인 경우 가능한 케이스는 2가지로
1. Space 삭제
2. 속한 스페이스 떠나기, 스페이스 삭제하기 분리
현재는 2번 케이스를 기준으로 구현되어 있음
*/
if (foundSpace.getCategory() == SpaceCategory.INDIVIDUAL) {
throw new SpaceException(SPACE_NOT_FOUND);
}

/*
이미 참여중인 스페이스 여부 확인
*/
var foundMemberSpaceRelation = memberSpaceRelationRepository.findBySpaceIdAndMemberId(spaceId, memberId)
.orElseThrow(
() -> new SpaceException(SPACE_ALREADY_JOINED)
);

/*
스페이스 참여여부 삭제 ( 스페이스 떠나기 )
*/
memberSpaceRelationRepository.deleteById(foundMemberSpaceRelation.getId());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import lombok.experimental.SuperBuilder;
import org.layer.domain.BaseEntity;

import java.util.Optional;

@Getter
@Entity
@AllArgsConstructor
Expand Down Expand Up @@ -36,4 +38,11 @@ public class Space extends BaseEntity {
* Form Relationid
*/
private Long formId;

public Optional<Boolean> isLeaderSpace(Long memberId) {
if (leaderId.equals(memberId)) {
return Optional.empty();
}
return Optional.of(true);
}
}

0 comments on commit f389ec4

Please sign in to comment.