Skip to content

Commit

Permalink
비공유 상태일 시 code null값 반영 및 sharedTrip soft delete 추가 (#530)
Browse files Browse the repository at this point in the history
* feat: soft delete 추가

* refactor: 메서드 반환 타입 변경

* style : 코드 컨밴션 적용
  • Loading branch information
waterricecake authored Sep 11, 2023
1 parent 294c455 commit ebbdaab
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 5 deletions.
7 changes: 6 additions & 1 deletion backend/src/main/java/hanglog/share/domain/SharedTrip.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import static jakarta.persistence.GenerationType.IDENTITY;
import static lombok.AccessLevel.PROTECTED;

import hanglog.global.BaseEntity;
import hanglog.global.exception.InvalidDomainException;
import hanglog.share.domain.type.SharedStatusType;
import hanglog.trip.domain.Trip;
Expand All @@ -27,12 +28,16 @@
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;

@Entity
@Getter
@AllArgsConstructor
@SQLDelete(sql = "UPDATE shared_trip SET status = 'DELETED' WHERE id = ?")
@NoArgsConstructor(access = PROTECTED)
public class SharedTrip {
@Where(clause = "status = 'USABLE'")
public class SharedTrip extends BaseEntity {

@Id
@GeneratedValue(strategy = IDENTITY)
Expand Down
11 changes: 11 additions & 0 deletions backend/src/main/java/hanglog/trip/domain/Trip.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
Expand Down Expand Up @@ -120,4 +121,14 @@ private String updateImageUrl(final String imageUrl) {
}
return convertUrlToName(imageUrl);
}

public Optional<String> getSharedCode(){
if(Optional.ofNullable(sharedTrip).isEmpty()){
return Optional.empty();
}
if(sharedTrip.isUnShared()){
return Optional.empty();
}
return Optional.of(sharedTrip.getSharedCode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
import static lombok.AccessLevel.PRIVATE;

import hanglog.city.dto.response.CityWithPositionResponse;
import hanglog.share.domain.SharedTrip;
import hanglog.city.domain.City;
import hanglog.trip.domain.Trip;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

Expand All @@ -36,8 +34,7 @@ public static TripDetailResponse of(final Trip trip, final List<City> cities) {
.map(CityWithPositionResponse::of)
.toList();

final Optional<SharedTrip> sharedTrip = Optional.ofNullable(trip.getSharedTrip());
final String sharedCode = sharedTrip.map(SharedTrip::getSharedCode).orElse(null);
final String sharedCode = trip.getSharedCode().orElse(null);

return new TripDetailResponse(
trip.getId(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
import static hanglog.global.IntegrationFixture.END_DATE;
import static hanglog.global.IntegrationFixture.START_DATE;
import static hanglog.global.exception.ExceptionCode.INVALID_SHARE_CODE;
import static hanglog.global.exception.ExceptionCode.NOT_FOUND_SHARED_CODE;
import static io.restassured.http.ContentType.JSON;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.SoftAssertions.assertSoftly;
import static org.springframework.http.HttpHeaders.AUTHORIZATION;

import hanglog.auth.domain.MemberTokens;
import hanglog.global.IntegrationTest;
import hanglog.share.dto.request.SharedTripStatusRequest;
import hanglog.trip.dto.request.TripCreateRequest;
Expand Down Expand Up @@ -77,6 +80,54 @@ void getSharedTrip() {
assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value());
}

@DisplayName("처음 생성된 여행은 비공유 상태이다")
@Test
void updateSharedStatus_InitialTripStatus(){
// when
final ExtractableResponse<Response> response = requestGetTrip(memberTokens,tripId);

// then
assertThat(response.body().jsonPath().getString("sharedTrip")).isNull();
}

@DisplayName("비공유 여행에서는 공유 코드를 볼 수 없다")
@Test
void updateSharedStatus_UnSharedTrip(){
// given
requestUpdateSharedTripStatus(true);
requestUpdateSharedTripStatus(false);

// when
final ExtractableResponse<Response> response = requestGetTrip(memberTokens,tripId);

// then
assertThat(response.body().jsonPath().getString("sharedTrip")).isNull();
}

@DisplayName("삭제된 여행은 공유 할 수 없다")
@Test
void getSharedTrip_deleteTripFail(){
// given
final String sharedCode = requestUpdateSharedTripStatus(true).body().jsonPath().get("sharedCode");
requestDeleteTrip(memberTokens,tripId);

// when
final ExtractableResponse<Response> response = RestAssured.given()
.when().get("/shared-trips/{sharedCode}", sharedCode)
.then().log().all()
.extract();
final Integer errorCode = Integer.parseInt(response.body().jsonPath().get("code").toString());

// then
assertThat(response.statusCode()).isEqualTo(HttpStatus.BAD_REQUEST.value());
assertSoftly(
softly -> {
softly.assertThat(response.statusCode()).isEqualTo(HttpStatus.BAD_REQUEST.value());
softly.assertThat(errorCode).isEqualTo(NOT_FOUND_SHARED_CODE.getCode());
}
);
}

@DisplayName("비공유된 여행은 조회할 수 없다")
@Test
void getSharedTrip_UnsharedFail() {
Expand All @@ -90,6 +141,7 @@ void getSharedTrip_UnsharedFail() {
.then().log().all()
.extract();
final Integer errorCode = Integer.parseInt(response.body().jsonPath().get("code").toString());

// then
assertThat(response.statusCode()).isEqualTo(HttpStatus.BAD_REQUEST.value());
assertSoftly(
Expand All @@ -99,4 +151,24 @@ void getSharedTrip_UnsharedFail() {
}
);
}

private static ExtractableResponse<Response> requestGetTrip(final MemberTokens memberTokens, final Long tripId) {
return RestAssured
.given().log().all()
.header(AUTHORIZATION, "Bearer " + memberTokens.getAccessToken())
.cookies("refresh-token", memberTokens.getRefreshToken())
.when().get("/trips/{tripId}", tripId)
.then().log().all()
.extract();
}

private void requestDeleteTrip(final MemberTokens memberTokens, final Long tripId) {
RestAssured
.given().log().all()
.header(AUTHORIZATION, "Bearer " + memberTokens.getAccessToken())
.cookies("refresh-token", memberTokens.getRefreshToken())
.when().delete("/trips/{tripId}", tripId)
.then().log().all()
.extract();
}
}

0 comments on commit ebbdaab

Please sign in to comment.