Skip to content

Commit

Permalink
refactor: isPlaceUpdated에 따른 item 수정 로직 변경
Browse files Browse the repository at this point in the history
  • Loading branch information
jjongwa committed Jul 27, 2023
1 parent 6790ad9 commit c190ca0
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package hanglog.trip.dto.request;

import static hanglog.global.exception.ExceptionCode.INVALID_RATING;

import hanglog.global.exception.BadRequestException;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.util.List;
import lombok.Getter;

@Getter
public class ItemUpdateRequest {

@NotNull(message = "여행 아이템의 타입을 입력해주세요.")
private final Boolean itemType;

@NotBlank(message = "여행 아이템의 제목을 입력해주세요.")
@Size(max = 50, message = "여행 아이템의 제목은 50자를 초과할 수 없습니다.")
private final String title;

@DecimalMax(value = "5.0", message = "여행 별점은 5점을 초과할 수 없습니다.")
private final Double rating;

@Size(max = 255, message = "여행 아이템의 메모는 255자를 초과할 수 없습니다.")
private final String memo;

@NotNull(message = "여행 아이템이 속한 데이 로그를 입력해주세요.")
private final Long dayLogId;

@Size(max = 10, message = "여행 아이템의 이미지는 최대 10개까지 첨부할 수 있습니다.")
private final List<String> imageUrls;

private final Boolean isPlaceUpdated;

private final PlaceRequest place;

private final ExpenseRequest expense;

public ItemUpdateRequest(
final Boolean itemType,
final String title,
final Double rating,
final String memo,
final Long dayLogId,
final List<String> imageUrls,
final Boolean isPlaceUpdated,
final PlaceRequest place,
final ExpenseRequest expense
) {
validateRatingFormat(rating);
this.itemType = itemType;
this.title = title;
this.rating = rating;
this.memo = memo;
this.dayLogId = dayLogId;
this.imageUrls = imageUrls;
this.isPlaceUpdated = isPlaceUpdated;
this.place = place;
this.expense = expense;
}

private void validateRatingFormat(final Double value) {
if (value % 0.5 != 0) {
throw new BadRequestException(INVALID_RATING);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package hanglog.trip.presentation;

import hanglog.trip.dto.request.ItemRequest;
import hanglog.trip.dto.request.ItemUpdateRequest;
import hanglog.trip.service.ItemService;
import jakarta.validation.Valid;
import java.net.URI;
Expand All @@ -24,7 +25,8 @@ public class ItemController {
@PostMapping
public ResponseEntity<Void> createItem(
@PathVariable final Long tripId,
@RequestBody @Valid final ItemRequest itemRequest) {
@RequestBody @Valid final ItemRequest itemRequest
) {
final Long itemId = itemService.save(tripId, itemRequest);
return ResponseEntity.created(URI.create("/trips/" + tripId + "/items/" + itemId)).build();
}
Expand All @@ -33,8 +35,9 @@ public ResponseEntity<Void> createItem(
public ResponseEntity<Void> updateItem(
@PathVariable final Long tripId,
@PathVariable final Long itemId,
@RequestBody final ItemRequest itemRequest) {
itemService.update(tripId, itemId, itemRequest);
@RequestBody final ItemUpdateRequest itemUpdateRequest
) {
itemService.update(tripId, itemId, itemUpdateRequest);
return ResponseEntity.noContent().build();
}

Expand Down
43 changes: 25 additions & 18 deletions backend/src/main/java/hanglog/trip/service/ItemService.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import hanglog.trip.domain.type.ItemType;
import hanglog.trip.dto.request.ExpenseRequest;
import hanglog.trip.dto.request.ItemRequest;
import hanglog.trip.dto.request.ItemUpdateRequest;
import hanglog.trip.dto.request.PlaceRequest;
import hanglog.trip.dto.response.ItemResponse;
import java.util.List;
Expand Down Expand Up @@ -49,9 +50,9 @@ public Long save(final Long tripId, final ItemRequest itemRequest) {
getNewItemOrdinal(tripId),
itemRequest.getRating(),
itemRequest.getMemo(),
getPlaceByItemRequest(itemRequest),
getPlaceByItemRequest(itemRequest.getPlace()),
dayLog,
getExpenseByItemRequest(itemRequest),
getExpenseByItemRequest(itemRequest.getExpense()),
getImagesByItemRequest(itemRequest)
);
validateAlreadyDeleted(item);
Expand All @@ -66,32 +67,38 @@ private List<Image> getImagesByItemRequest(final ItemRequest itemRequest) {
.toList();
}

public void update(final Long tripId, final Long itemId, final ItemRequest itemRequest) {
final DayLog dayLog = dayLogRepository.findById(itemRequest.getDayLogId())
public void update(final Long tripId, final Long itemId, final ItemUpdateRequest itemUpdateRequest) {
final DayLog dayLog = dayLogRepository.findById(itemUpdateRequest.getDayLogId())
.orElseThrow(() -> new BadRequestException(NOT_FOUND_DAY_LOG_ID));
final Item item = itemRepository.findById(itemId)
.orElseThrow(() -> new BadRequestException(NOT_FOUND_TRIP_ITEM_ID));
validateAlreadyDeleted(item);

final Item updateditem = new Item(
Place updatedPlace = item.getPlace();
if (itemUpdateRequest.getIsPlaceUpdated()) {
updatedPlace = getPlaceByItemRequest(itemUpdateRequest.getPlace());
}

final Item updatedItem = new Item(
itemId,
ItemType.getItemTypeByIsSpot(itemRequest.getItemType()),
itemRequest.getTitle(),
ItemType.getItemTypeByIsSpot(itemUpdateRequest.getItemType()),
itemUpdateRequest.getTitle(),
item.getOrdinal(),
itemRequest.getRating(),
itemRequest.getMemo(),
getPlaceByItemRequest(itemRequest),
itemUpdateRequest.getRating(),
itemUpdateRequest.getMemo(),
updatedPlace,
dayLog,
getExpenseByItemRequest(itemRequest)
getExpenseByItemRequest(itemUpdateRequest.getExpense())
);
itemRepository.save(updateditem);

itemRepository.save(updatedItem);
}

private Place getPlaceByItemRequest(final ItemRequest itemRequest) {
if (itemRequest.getPlace() == null) {
private Place getPlaceByItemRequest(final PlaceRequest placeRequest) {
if (placeRequest == null) {
return null;
}
return createPlaceByPlaceRequest(itemRequest.getPlace());
return createPlaceByPlaceRequest(placeRequest);
}

private Place createPlaceByPlaceRequest(final PlaceRequest placeRequest) {
Expand All @@ -106,11 +113,11 @@ private Place createPlaceByPlaceRequest(final PlaceRequest placeRequest) {
);
}

private Expense getExpenseByItemRequest(final ItemRequest itemRequest) {
if (itemRequest.getExpense() == null) {
private Expense getExpenseByItemRequest(final ExpenseRequest expenseRequest) {
if (expenseRequest == null) {
return null;
}
return createExpenseByExpenseRequest(itemRequest.getExpense());
return createExpenseByExpenseRequest(expenseRequest);
}

private Expense createExpenseByExpenseRequest(final ExpenseRequest expenseRequest) {
Expand Down
43 changes: 39 additions & 4 deletions backend/src/test/java/hanglog/trip/service/ItemServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import hanglog.trip.domain.type.ItemType;
import hanglog.trip.dto.request.ExpenseRequest;
import hanglog.trip.dto.request.ItemRequest;
import hanglog.trip.dto.request.ItemUpdateRequest;
import hanglog.trip.dto.request.PlaceRequest;
import hanglog.trip.dto.response.ItemResponse;
import hanglog.trip.fixture.ExpenseFixture;
Expand Down Expand Up @@ -88,9 +89,42 @@ void save() {
assertThat(actualId).isEqualTo(1L);
}

@DisplayName("여행 아이템의 정보를 수정한다.")
@DisplayName("여행 아이템의 정보를 수정한다. - 장소가 바뀌지 않은 경우")
@Test
void update() {
void update_PlaceNotChange() {
// given
final ExpenseRequest expenseRequest = new ExpenseRequest("EURO", 10000.0, 1L);
final ItemUpdateRequest itemUpdateRequest = new ItemUpdateRequest(
true,
"에펠탑",
4.5,
"에펠탑을 방문",
1L,
List.of("imageUrl"),
false,
null,
expenseRequest
);

given(itemRepository.save(any()))
.willReturn(ItemFixture.LONDON_EYE_ITEM);
given(itemRepository.findById(any()))
.willReturn(Optional.of(ItemFixture.LONDON_EYE_ITEM));
given(categoryRepository.findById(any()))
.willReturn(Optional.of(new Category(1L, "문화", "culture")));
given(dayLogRepository.findById(any()))
.willReturn(Optional.of(new DayLog("첫날", 1, TripFixture.LONDON_TRIP)));

// when
itemService.update(1L, 1L, itemUpdateRequest);

// then
verify(itemRepository).save(any());
}

@DisplayName("여행 아이템의 정보를 수정한다. - 장소가 바뀐 경우")
@Test
void update_PlaceChange() {
// given
final PlaceRequest placeRequest = new PlaceRequest(
"에펠탑",
Expand All @@ -99,13 +133,14 @@ void update() {
List.of("culture")
);
final ExpenseRequest expenseRequest = new ExpenseRequest("EURO", 10000.0, 1L);
final ItemRequest itemRequest = new ItemRequest(
final ItemUpdateRequest itemUpdateRequest = new ItemUpdateRequest(
true,
"에펠탑",
4.5,
"에펠탑을 방문",
1L,
List.of("imageUrl"),
false,
placeRequest,
expenseRequest
);
Expand All @@ -120,7 +155,7 @@ void update() {
.willReturn(Optional.of(new DayLog("첫날", 1, TripFixture.LONDON_TRIP)));

// when
itemService.update(1L, 1L, itemRequest);
itemService.update(1L, 1L, itemUpdateRequest);

// then
verify(itemRepository).save(any());
Expand Down

0 comments on commit c190ca0

Please sign in to comment.