Skip to content

Commit

Permalink
fix: Update ticketing alert reservation time response (#164)
Browse files Browse the repository at this point in the history
  • Loading branch information
devmizz authored Sep 14, 2024
1 parent 604a8cc commit 9e11acc
Show file tree
Hide file tree
Showing 10 changed files with 133 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,4 @@ public static TicketingTimeServiceMessage from(
.time(TicketingAlertTimeApiType.getTicketingAlertTime(response.time()))
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -131,9 +132,10 @@ public ResponseEntity<TicketingAlertReservationApiResponse> getAlertsReservation
@PathVariable("showId") UUID showId,
@RequestParam("ticketingApiType") TicketingApiType type
) {
var now = LocalDateTime.now();
return ResponseEntity.ok(
TicketingAlertReservationApiResponse.from(
showService.findAlertsReservations(user.userId(), showId, type)
showService.findAlertsReservations(user.userId(), showId, type, now)
)
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.show.controller.dto.param;

import com.example.show.service.dto.param.TicketingAlertReservationTimeServiceParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

@Builder
public record TicketingAlertReservationTimeApiParam(
@Schema(description = "예약 시간(기준: 분)")
int beforeMinutes,
@Schema(description = "예약 여부")
boolean isReserved,
@Schema(description = "예약 가능 여부")
boolean canReserve
) {

public static TicketingAlertReservationTimeApiParam from(
TicketingAlertReservationTimeServiceParam param
) {
return TicketingAlertReservationTimeApiParam.builder()
.beforeMinutes(param.time().getMinutes())
.isReserved(param.isReserved())
.canReserve(param.canReserve())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,24 @@
package com.example.show.controller.dto.response;

import com.example.show.controller.dto.param.TicketingAlertReservationTimeApiParam;
import com.example.show.service.dto.response.TicketingAlertReservationServiceResponse;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Builder;

@Builder
public record TicketingAlertReservationApiResponse(
@Schema(description = "공연 알림 예약 상태")
TicketingAlertReservationStatusApiResponse alertReservationStatus,

@Schema(description = "공연 알림 예약 가능 여부")
TicketingAlertReservationAvailabilityApiResponse alertReservationAvailability
@Schema(description = "공연 알림 예약 시간 목록")
List<TicketingAlertReservationTimeApiParam> times
) {

public static TicketingAlertReservationApiResponse from(
TicketingAlertReservationServiceResponse response
) {
var alertReservationStatus = TicketingAlertReservationStatusApiResponse.from(
response.alertReservationStatus()
);
var alertReservationAvailability = TicketingAlertReservationAvailabilityApiResponse.from(
response.alertReservationAvailability()
return new TicketingAlertReservationApiResponse(
response.times().stream()
.map(TicketingAlertReservationTimeApiParam::from)
.toList()
);

return TicketingAlertReservationApiResponse.builder()
.alertReservationStatus(alertReservationStatus)
.alertReservationAvailability(alertReservationAvailability)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,55 @@

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import lombok.Getter;
import org.example.vo.TicketingAlertTime;

@Getter
public enum TicketingAlertTimeApiType {
BEFORE_24(24),
BEFORE_6(6),
BEFORE_1(1);
BEFORE_A_DAY(1440),
BEFORE_SIX_HOURS(360),
BEFORE_A_HOUR(60);

private final int time;
private final int minutes;

TicketingAlertTimeApiType(int time) {
this.time = time;
TicketingAlertTimeApiType(int minutes) {
this.minutes = minutes;
}

public TicketingAlertTime toDomainType() {
return switch (this) {
case BEFORE_24 -> TicketingAlertTime.BEFORE_24;
case BEFORE_6 -> TicketingAlertTime.BEFORE_6;
case BEFORE_1 -> TicketingAlertTime.BEFORE_1;
case BEFORE_A_DAY -> TicketingAlertTime.BEFORE_A_DAY;
case BEFORE_SIX_HOURS -> TicketingAlertTime.BEFORE_SIX_HOURS;
case BEFORE_A_HOUR -> TicketingAlertTime.BEFORE_A_HOUR;
};
}

public static TicketingAlertTimeApiType getTicketingAlertTime(TicketingAlertTime alertTime) {
return switch (alertTime) {
case BEFORE_24 -> TicketingAlertTimeApiType.BEFORE_24;
case BEFORE_6 -> TicketingAlertTimeApiType.BEFORE_6;
case BEFORE_1 -> TicketingAlertTimeApiType.BEFORE_1;
case BEFORE_A_DAY -> TicketingAlertTimeApiType.BEFORE_A_DAY;
case BEFORE_SIX_HOURS -> TicketingAlertTimeApiType.BEFORE_SIX_HOURS;
case BEFORE_A_HOUR -> TicketingAlertTimeApiType.BEFORE_A_HOUR;
};
}

public static TicketingAlertTimeApiType getTicketingAlertTimeByMinutesGap(int minutes) {
return Arrays.stream(TicketingAlertTimeApiType.values())
.filter(alertTime -> alertTime.minutes == minutes)
.findFirst()
.orElse(null);
}

public static List<TicketingAlertTime> availableReserveTimeToDomainType(
LocalDateTime ticketingAt,
List<TicketingAlertTimeApiType> alertTimes
) {
long hoursDifference = Duration.between(LocalDateTime.now(), ticketingAt).toHours();

return alertTimes.stream()
.filter(alertTime -> {
return switch (alertTime) {
case BEFORE_24, BEFORE_6, BEFORE_1 -> hoursDifference >= alertTime.time;
};
.filter(alertTime -> switch (alertTime) {
case BEFORE_A_DAY, BEFORE_SIX_HOURS, BEFORE_A_HOUR -> hoursDifference >= alertTime.minutes;
})
.map(TicketingAlertTimeApiType::toDomainType)
.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@
import com.example.show.service.dto.response.ShowInterestServiceResponse;
import com.example.show.service.dto.response.ShowPaginationServiceResponse;
import com.example.show.service.dto.response.TerminatedTicketingShowCountServiceResponse;
import com.example.show.service.dto.response.TicketingAlertReservationAvailabilityServiceResponse;
import com.example.show.service.dto.response.TicketingAlertReservationServiceResponse;
import com.example.show.service.dto.response.TicketingAlertReservationStatusServiceResponse;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -123,24 +121,17 @@ public ShowInterestServiceResponse interest(ShowInterestServiceRequest request)
public TicketingAlertReservationServiceResponse findAlertsReservations(
UUID userId,
UUID showId,
TicketingApiType type
TicketingApiType type,
LocalDateTime now
) {
var ticketingAt = showUseCase
.findTicketingAlertReservation(showId, type.toDomainType())
.getTicketingAt();
ShowTicketingTime ticketingTime = showUseCase.findTicketingAlertReservation(showId, type.toDomainType());
List<TicketingAlert> ticketingAlerts = ticketingAlertUseCase.findTicketingAlerts(userId, showId);

var reservedAlerts = ticketingAlertUseCase.findTicketingAlerts(userId, showId)
.stream()
.map(TicketingAlert::getAlertTime)
.toList();

var status = TicketingAlertReservationStatusServiceResponse.as(
reservedAlerts,
ticketingAt
return TicketingAlertReservationServiceResponse.as(
ticketingTime.getTicketingAt(),
ticketingAlerts,
now
);
var availability = TicketingAlertReservationAvailabilityServiceResponse.as(ticketingAt);

return TicketingAlertReservationServiceResponse.as(status, availability);
}

public void alertReservation(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.show.service.dto.param;

import com.example.show.controller.vo.TicketingAlertTimeApiType;
import lombok.Builder;

@Builder
public record TicketingAlertReservationTimeServiceParam(
TicketingAlertTimeApiType time,
boolean isReserved,
boolean canReserve
) {

}
Original file line number Diff line number Diff line change
@@ -1,21 +1,52 @@
package com.example.show.service.dto.response;

import com.example.show.controller.vo.TicketingAlertTimeApiType;
import com.example.show.service.dto.param.TicketingAlertReservationTimeServiceParam;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.Builder;
import org.example.entity.TicketingAlert;

@Builder
public record TicketingAlertReservationServiceResponse(
TicketingAlertReservationStatusServiceResponse alertReservationStatus,
TicketingAlertReservationAvailabilityServiceResponse alertReservationAvailability
List<TicketingAlertReservationTimeServiceParam> times
) {

public static TicketingAlertReservationServiceResponse as(
TicketingAlertReservationStatusServiceResponse alertReservationStatus,
TicketingAlertReservationAvailabilityServiceResponse alertReservationAvailability
LocalDateTime ticketingAt,
List<TicketingAlert> reservedAlerts,
LocalDateTime now
) {
return TicketingAlertReservationServiceResponse.builder()
.alertReservationStatus(alertReservationStatus)
.alertReservationAvailability(alertReservationAvailability)
.build();
}
Set<TicketingAlertTimeApiType> distinctAlertTimes = reservedAlerts.stream()
.map(alert -> {
int minutesGap = (int) Duration.between(alert.getAlertTime(), ticketingAt).toMinutes();
return TicketingAlertTimeApiType.getTicketingAlertTimeByMinutesGap(minutesGap);
}).collect(Collectors.toSet());

return new TicketingAlertReservationServiceResponse(
Arrays.stream(TicketingAlertTimeApiType.values())
.map(alertTimeType -> {
LocalDateTime alertTime = ticketingAt.minusMinutes(alertTimeType.getMinutes());

if (alertTime.isBefore(now)) {
return TicketingAlertReservationTimeServiceParam.builder()
.time(alertTimeType)
.isReserved(false)
.canReserve(false)
.build();
}

return TicketingAlertReservationTimeServiceParam.builder()
.time(alertTimeType)
.isReserved(distinctAlertTimes.contains(alertTimeType))
.canReserve(true)
.build();
}
).toList()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ private List<TicketingTimeDomainResponse> deleteAlerts(

private LocalDateTime calculateAlertTime(LocalDateTime showTime, TicketingAlertTime alertTime) {
return switch (alertTime) {
case BEFORE_24 -> showTime.minusHours(24);
case BEFORE_6 -> showTime.minusHours(6);
case BEFORE_1 -> showTime.minusHours(1);
case BEFORE_A_DAY -> showTime.minusHours(24);
case BEFORE_SIX_HOURS -> showTime.minusHours(6);
case BEFORE_A_HOUR -> showTime.minusHours(1);
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@
import java.util.Arrays;

public enum TicketingAlertTime {
BEFORE_24(24),
BEFORE_6(6),
BEFORE_1(1);
BEFORE_A_DAY(1440),
BEFORE_SIX_HOURS(360),
BEFORE_A_HOUR(60);

private final long time;
private final long minutes;

TicketingAlertTime(long time) {
this.time = time;
TicketingAlertTime(long minutes) {
this.minutes = minutes;
}

public static TicketingAlertTime getAlertTime(LocalDateTime ticketingAt, LocalDateTime alertAt) {
long hoursDifference = Duration.between(alertAt, ticketingAt).toHours();

return Arrays.stream(TicketingAlertTime.values())
.filter(alertTime -> alertTime.time == hoursDifference)
.filter(alertTime -> alertTime.minutes == hoursDifference)
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("일치하지 않은 시간입니다.: " + hoursDifference));
}
Expand Down

0 comments on commit 9e11acc

Please sign in to comment.