From ebbdaab418e575b5db46574543ad16257af6c873 Mon Sep 17 00:00:00 2001 From: waterricecake <91263263+waterricecake@users.noreply.github.com> Date: Mon, 11 Sep 2023 16:42:56 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B9=84=EA=B3=B5=EC=9C=A0=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EC=9D=BC=20=EC=8B=9C=20code=20null=EA=B0=92=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=20=EB=B0=8F=20sharedTrip=20soft=20delete=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#530)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: soft delete 추가 * refactor: 메서드 반환 타입 변경 * style : 코드 컨밴션 적용 --- .../java/hanglog/share/domain/SharedTrip.java | 7 +- .../main/java/hanglog/trip/domain/Trip.java | 11 +++ .../trip/dto/response/TripDetailResponse.java | 5 +- .../SharedTripIntegrationTest.java | 72 +++++++++++++++++++ 4 files changed, 90 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/hanglog/share/domain/SharedTrip.java b/backend/src/main/java/hanglog/share/domain/SharedTrip.java index 1972f89a4..5e044b8fd 100644 --- a/backend/src/main/java/hanglog/share/domain/SharedTrip.java +++ b/backend/src/main/java/hanglog/share/domain/SharedTrip.java @@ -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; @@ -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) diff --git a/backend/src/main/java/hanglog/trip/domain/Trip.java b/backend/src/main/java/hanglog/trip/domain/Trip.java index 3fcdd1195..118ee6e7a 100644 --- a/backend/src/main/java/hanglog/trip/domain/Trip.java +++ b/backend/src/main/java/hanglog/trip/domain/Trip.java @@ -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; @@ -120,4 +121,14 @@ private String updateImageUrl(final String imageUrl) { } return convertUrlToName(imageUrl); } + + public Optional getSharedCode(){ + if(Optional.ofNullable(sharedTrip).isEmpty()){ + return Optional.empty(); + } + if(sharedTrip.isUnShared()){ + return Optional.empty(); + } + return Optional.of(sharedTrip.getSharedCode()); + } } diff --git a/backend/src/main/java/hanglog/trip/dto/response/TripDetailResponse.java b/backend/src/main/java/hanglog/trip/dto/response/TripDetailResponse.java index 59c211a48..70cebbc53 100644 --- a/backend/src/main/java/hanglog/trip/dto/response/TripDetailResponse.java +++ b/backend/src/main/java/hanglog/trip/dto/response/TripDetailResponse.java @@ -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; @@ -36,8 +34,7 @@ public static TripDetailResponse of(final Trip trip, final List cities) { .map(CityWithPositionResponse::of) .toList(); - final Optional 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(), diff --git a/backend/src/test/java/hanglog/share/integration/SharedTripIntegrationTest.java b/backend/src/test/java/hanglog/share/integration/SharedTripIntegrationTest.java index b028ae8cc..abf6cf4b5 100644 --- a/backend/src/test/java/hanglog/share/integration/SharedTripIntegrationTest.java +++ b/backend/src/test/java/hanglog/share/integration/SharedTripIntegrationTest.java @@ -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; @@ -77,6 +80,54 @@ void getSharedTrip() { assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()); } + @DisplayName("처음 생성된 여행은 비공유 상태이다") + @Test + void updateSharedStatus_InitialTripStatus(){ + // when + final ExtractableResponse 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 = 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 = 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() { @@ -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( @@ -99,4 +151,24 @@ void getSharedTrip_UnsharedFail() { } ); } + + private static ExtractableResponse 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(); + } }