ReservationResourceDto.java

package io.extact.rms.external.webapi.dto;

import java.time.LocalDateTime;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.eclipse.microprofile.openapi.annotations.media.Schema;

import lombok.Getter;
import lombok.Setter;

import io.extact.rms.application.domain.Reservation;
import io.extact.rms.application.domain.constraint.BeforeAfterDateTime;
import io.extact.rms.application.domain.constraint.Note;
import io.extact.rms.application.domain.constraint.ReserveEndDateTime;
import io.extact.rms.application.domain.constraint.ReserveStartDateTime;
import io.extact.rms.application.domain.constraint.RmsId;
import io.extact.rms.application.domain.constraint.BeforeAfterDateTime.BeforeAfterDateTimeValidatable;

@Schema(description = "予約DTO")
@Getter
@Setter
@BeforeAfterDateTime(from = "利用開始日時", to = "利用終了日時")
public class ReservationResourceDto implements BeforeAfterDateTimeValidatable {

    @RmsId
    @Schema(required = true)
    private Integer id;

    @Schema(required = true, ref = "#/components/schemas/localDateTime")
    @ReserveStartDateTime
    private LocalDateTime startDateTime;

    @Schema(required = true, ref = "#/components/schemas/localDateTime")
    @ReserveEndDateTime
    private LocalDateTime endDateTime;

    @Note
    @Schema(required = false)
    private String note;

    @RmsId
    @Schema(required = true)
    private int rentalItemId;

    @RmsId
    @Schema(required = true)
    private int userAccountId;

    @Schema(required = false)
    private UserAccountResourceDto userAccountDto;

    @Schema(required = false)
    private RentalItemResourceDto rentalItemDto;

    public static ReservationResourceDto toDto(Reservation entity) {
        if (entity == null) {
            return null;
        }
        var dto = new ReservationResourceDto();
        dto.setId(entity.getId());
        dto.setStartDateTime(entity.getStartDateTime());
        dto.setEndDateTime(entity.getEndDateTime());
        dto.setNote(entity.getNote());
        dto.setRentalItemId(entity.getRentalItemId());
        dto.setUserAccountId(entity.getUserAccountId());
        if (entity.getRentalItem() != null) {
            dto.setRentalItemDto(entity.getRentalItem().transform(RentalItemResourceDto::toDto));
        }
        if (entity.getUserAccount() != null) {
            dto.setUserAccountDto(entity.getUserAccount().transform(UserAccountResourceDto::toDto));
        }
        return dto;
    }

    public Reservation toEntity() {
        var reservation = Reservation.of(id, startDateTime, endDateTime, note, rentalItemId, userAccountId);
        if (rentalItemDto != null) {
            reservation.setRentalItem(rentalItemDto.toEntity());
        }
        if (userAccountDto != null) {
            reservation.setUserAccount(userAccountDto.toEntity());
        }
        return reservation;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

}