RentalJpaMapper.java

package com.github.jenkaby.bikerental.rental.infrastructure.persistence.mapper;

import com.github.jenkaby.bikerental.rental.domain.model.Rental;
import com.github.jenkaby.bikerental.rental.infrastructure.persistence.entity.RentalJpaEntity;
import com.github.jenkaby.bikerental.shared.mapper.DiscountMapper;
import com.github.jenkaby.bikerental.shared.mapper.DurationMapper;
import com.github.jenkaby.bikerental.shared.mapper.InstantMapper;
import com.github.jenkaby.bikerental.shared.mapper.MoneyMapper;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;

@Mapper(uses = {MoneyMapper.class, InstantMapper.class, DurationMapper.class, RentalEquipmentJpaMapper.class, DiscountMapper.class})
public interface RentalJpaMapper {

    @Mapping(target = "plannedDuration", source = "entity.plannedDurationMinutes")
    @Mapping(target = "actualDuration", source = "entity.actualDurationMinutes")
    @Mapping(target = "equipments", source = "entity.rentalEquipments")
    Rental toDomain(RentalJpaEntity entity);


    @Mapping(target = "actualDurationMinutes", source = "rental.actualDuration")
    @Mapping(target = "plannedDurationMinutes", source = "rental.plannedDuration")
    @Mapping(target = "rentalEquipments", source = "rental.equipments")
    RentalJpaEntity toEntity(Rental rental);

    @AfterMapping
    default void setRelationships(@MappingTarget RentalJpaEntity result) {
        if (result.getRentalEquipments() != null) {
            result.getRentalEquipments().forEach(equipment -> equipment.setRental(result));
        }
    }
}