Skip to content

Commit

Permalink
improvements for persistence layer and mappers
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmitriusan committed Nov 17, 2023
1 parent e287458 commit 76fbaf7
Show file tree
Hide file tree
Showing 14 changed files with 221 additions and 86 deletions.
43 changes: 30 additions & 13 deletions hawk/src/main/java/io/irw/hawk/dto/ebay/EbayFindingDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,30 +30,47 @@
public class EbayFindingDto {

Long id;
Instant capturedAt;
String ebayIdStr;
String legacyEbayIdStr;
String itemTitle;
String title;
String webUrl;

Instant listingCreatedAt;
Instant listingEndsAt; // Not implemented yet

Instant capturedAt;
Instant endsOn;
@Default
List<EbayListingTypeEnum> listingTypes = new ArrayList<>();
EbayListingStatusEnum listingStatusEnum;
EbayListingStatusEnum listingStatus;
EbaySellerDto seller;

Optional<String> itemDescription;
Optional<Integer> numberOfPieces;
Optional<Integer> bidCount;
@Default
List<String> imageUrls = new ArrayList<>();

Boolean topRatedBuyingExperience;

@Default
Optional<String> itemDescription = Optional.empty();
@Default
Optional<Integer> numberOfPieces = Optional.empty();
@Default
Optional<Integer> bidCount = Optional.empty();

// Prices
Optional<BigDecimal> currentAuctionPriceUsd;
Optional<BigDecimal> buyItNowPriceUsd;
Optional<BigDecimal> minShippingCostUsd;
Optional<BigDecimal> buyNowPricePerPieceWithShippingUsd;
Optional<BigDecimal> currentAucPricePerPieceWithShippingUsd;
@Default
Optional<BigDecimal> currentAuctionPriceUsd = Optional.empty();
@Default
Optional<BigDecimal> buyItNowPriceUsd = Optional.empty();
@Default
Optional<BigDecimal> minShippingCostUsd = Optional.empty();
@Default
Optional<BigDecimal> buyNowPricePerPieceWithShippingUsd = Optional.empty();
@Default
Optional<BigDecimal> currentAucPricePerPieceWithShippingUsd = Optional.empty();
/**
* Price when auction ends
*/
Optional<BigDecimal> finalAuctionPriceWithoutShippingUsd;
@Default
Optional<BigDecimal> finalAuctionPriceWithoutShippingUsd = Optional.empty();

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

public enum EbayListingTypeEnum {

AUCTION,
FIXED_PRICE
AUCTION, BEST_OFFER, FIXED_PRICE

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,9 @@ private ProductVariantEnum(GroupEnum group, String descriptor) {
this.name = StringUtils.joinWith("/", group.getName(), descriptor);
}

@Override
public String toString() {
return name;
}

}
48 changes: 27 additions & 21 deletions hawk/src/main/java/io/irw/hawk/entity/EbayFinding.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.irw.hawk.entity;

import io.hypersistence.utils.hibernate.type.array.EnumArrayType;
import io.hypersistence.utils.hibernate.type.array.ListArrayType;
import io.hypersistence.utils.hibernate.type.array.StringArrayType;
import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayType;
import io.hypersistence.utils.hibernate.type.basic.PostgreSQLEnumType;
import io.irw.hawk.dto.ebay.EbayListingStatusEnum;
Expand All @@ -19,8 +19,6 @@
import jakarta.persistence.Table;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
Expand All @@ -35,10 +33,6 @@
@Setter
@Entity
@Table(name = "ebay_finding", schema = "merchandise_db")
@TypeDef(
name = "list-array",
typeClass = ListArrayType.class
)
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class EbayFinding {

Expand All @@ -51,6 +45,9 @@ public class EbayFinding {
generator = "ebay_finding_seq")
Long id;

@Column(name = "captured_at", nullable = false)
private Instant capturedAt;

@Column(name = "ebay_id_str", nullable = false, unique = true)
@EqualsAndHashCode.Include
private String ebayIdStr;
Expand All @@ -59,43 +56,52 @@ public class EbayFinding {
@EqualsAndHashCode.Include
private String legacyEbayIdStr;

@Column(name = "item_title", nullable = false)
private String itemTitle;
@Column(name = "title", nullable = false)
private String title;

@Column(name = "captured_at", nullable = false)
private Instant capturedAt;
@Column(name = "web_url", nullable = false)
private String webUrl;

@Column(name = "listing_created_at", nullable = false)
private Instant listingCreatedAt;

@Column(name = "ends_on", nullable = false)
private Instant endsOn;
@Column(name = "listing_ends_at")
private Instant listingEndsAt;

@Enumerated(EnumType.STRING)
@Column(name = "listing_type", nullable = false, columnDefinition = "ebay_listing_type[]")
@Column(name = "listing_types", nullable = false, columnDefinition = "ebay_listing_type[]")
@Type(value=EnumArrayType.class,
parameters = @Parameter(
name = AbstractArrayType.SQL_ARRAY_TYPE,
value = "ebay_listing_type"
))
private List<EbayListingTypeEnum> listingTypes;
private EbayListingTypeEnum[] listingTypes;

@Enumerated(EnumType.STRING)
@Column(name = "listing_status", nullable = false, columnDefinition = "ebay_listing_status")
@Type(PostgreSQLEnumType.class)
private EbayListingStatusEnum listingStatusEnum;
private EbayListingStatusEnum listingStatus;

@ManyToOne
@JoinColumn(name = "seller_id", nullable = false)
private EbaySeller seller;

// Add the following fields with nullable annotations to match EbayFindingDto
@Column(name = "number_of_pieces")
private Integer numberOfPieces;
@Column(name = "images", columnDefinition = "varchar[]")
@Type(value = StringArrayType.class)
private String[] imageUrls;

@Column(name = "bid_count")
private int bidCount;
@Column(name = "top_rated_buying_experience", nullable = false)
private Boolean topRatedBuyingExperience;

@Column(name = "item_description")
private String itemDescription;

@Column(name = "number_of_pieces")
private Integer numberOfPieces;

@Column(name = "bid_count")
private Integer bidCount;

// Prices

@Column(name = "current_auction_price_usd")
Expand Down
25 changes: 19 additions & 6 deletions hawk/src/main/java/io/irw/hawk/mapper/EbayFindingMapper.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
package io.irw.hawk.mapper;

import com.ebay.buy.browse.model.ItemSummary;
import com.ebay.buy.browse.model.Seller;
import io.irw.hawk.dto.ebay.EbayFindingDto;
import io.irw.hawk.dto.ebay.EbaySellerDto;
import io.irw.hawk.entity.EbayFinding;
import io.irw.hawk.entity.EbaySeller;
import java.math.BigDecimal;
import java.util.Optional;
import org.mapstruct.BeanMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Named;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.ReportingPolicy;

Expand All @@ -29,6 +26,10 @@ public interface EbayFindingMapper {
@Mapping(target = "ebayIdStr", source = "itemSummary.itemId")
@Mapping(target = "legacyEbayIdStr", source = "itemSummary.legacyItemId")
@Mapping(target = "seller", source = "ebaySellerDto")
@Mapping(target = "title", source = "itemSummary.title")
@Mapping(target = "listingCreatedAt", source = "itemSummary.itemCreationDate")
@Mapping(target = "webUrl", source = "itemSummary.itemWebUrl")
@Mapping(target = "topRatedBuyingExperience", source = "itemSummary.topRatedBuyingExperience")
EbayFindingDto itemSummaryToEbayFindingDto(ItemSummary itemSummary, EbaySellerDto ebaySellerDto);


Expand Down Expand Up @@ -59,15 +60,27 @@ public interface EbayFindingMapper {

// Handle mapping Optional fields to nullable columns in the entity
default Integer mapOptionalInteger(Optional<Integer> value) {
return value.orElse(null);
if (value != null) {
return value.orElse(null);
} else {
return null;
}
}

default BigDecimal mapOptionalBigDecimal(Optional<BigDecimal> value) {
return value.orElse(null);
if (value != null) {
return value.orElse(null);
} else {
return null;
}
}

default String mapOptionalString(Optional<String> value) {
return value.orElse(null);
if (value != null) {
return value.orElse(null);
} else {
return null;
}
}

// Helper methods to map null values to Optional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,37 @@
import io.irw.hawk.dto.merchandise.ProductVariantEnum;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import java.util.HashMap;
import java.util.Map;

@Converter(autoApply = true)
public class ProductVariantEnumConverter implements AttributeConverter<ProductVariantEnum, String> {

private static final Map<String, ProductVariantEnum> TO_STRING_MAP = new HashMap<>();

static {
for (ProductVariantEnum enumValue : ProductVariantEnum.values()) {
String key = enumValue.toString();
if (TO_STRING_MAP.containsKey(key)) {
throw new IllegalStateException("Duplicate toString representation: " + key);
}
TO_STRING_MAP.put(key, enumValue);
}
}

@Override
public String convertToDatabaseColumn(ProductVariantEnum attribute) {
if (attribute == null) {
return null;
}
return attribute.toString();
}

@Override
public ProductVariantEnum convertToEntityAttribute(String dbData) {
// Iterate over enum values to find the matching one based on toString()
for (ProductVariantEnum enumValue : ProductVariantEnum.values()) {
if (enumValue.toString().equals(dbData)) {
return enumValue;
}
ProductVariantEnum enumValue = TO_STRING_MAP.get(dbData);
if (enumValue != null) {
return enumValue;
}
throw new IllegalArgumentException("Unknown enum value: " + dbData);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,28 @@
package io.irw.hawk.scraper.service.extractors;

import static io.irw.hawk.dto.ebay.EbayListingStatusEnum.ACTIVE;

import com.ebay.buy.browse.model.ItemSummary;
import io.irw.hawk.dto.ebay.EbayFindingDto;
import io.irw.hawk.dto.ebay.EbayListingStatusEnum;
import io.irw.hawk.dto.ebay.EbayListingTypeEnum;
import io.irw.hawk.dto.merchandise.ProductVariantEnum;
import io.irw.hawk.scraper.model.MerchandiseMetadataDto;
import io.irw.hawk.scraper.model.MerchandiseVerdictType;
import io.irw.hawk.scraper.model.ProcessingPipelineStep;
import io.irw.hawk.scraper.service.matchers.ShippingPossibilitiesMatcher;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;

@RequiredArgsConstructor
@Service
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
@Slf4j
public class ListingTypeExtractor implements ItemSummaryDataExtractor {
public class BasicFieldExtractor implements ItemSummaryDataExtractor {

@Override
public boolean isApplicableTo(ProductVariantEnum productVariant) {
Expand All @@ -33,10 +32,32 @@ public boolean isApplicableTo(ProductVariantEnum productVariant) {
@Override
public void extractDataFromItemSummary(ItemSummary itemSummary, MerchandiseMetadataDto metadata) {
EbayFindingDto ebayFindingDto = metadata.getEbayFindingDto();
ebayFindingDto.setListingStatus(ACTIVE);
extractListingType(itemSummary, ebayFindingDto);
extractAllImages(itemSummary, ebayFindingDto);
if (ebayFindingDto.getListingTypes().contains(EbayListingTypeEnum.AUCTION)) {
ebayFindingDto.setBidCount(Optional.of(itemSummary.getBidCount()));
}
}

private static void extractAllImages(ItemSummary itemSummary, EbayFindingDto ebayFindingDto) {
List<String> allImageUrls = Stream.concat(
Stream.of(itemSummary.getImage()),
itemSummary.getAdditionalImages().stream())
.map(image -> image.getImageUrl())
.toList();
ebayFindingDto.setImageUrls(allImageUrls);
}

private static void extractListingType(ItemSummary itemSummary, EbayFindingDto ebayFindingDto) {
if (itemSummary.getBuyingOptions().contains("AUCTION")) {
ebayFindingDto.getListingTypes().add(EbayListingTypeEnum.AUCTION);
}

if (itemSummary.getBuyingOptions().contains("BEST_OFFER")) {
ebayFindingDto.getListingTypes().add(EbayListingTypeEnum.BEST_OFFER);
}

if(itemSummary.getBuyingOptions().contains("FIXED_PRICE")) {
ebayFindingDto.getListingTypes().add(EbayListingTypeEnum.FIXED_PRICE);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import com.ebay.buy.browse.model.ItemSummary;
import io.irw.hawk.dto.ebay.EbayFindingDto;
import io.irw.hawk.dto.ebay.EbayListingTypeEnum;
import io.irw.hawk.dto.merchandise.ProductVariantEnum;
import io.irw.hawk.scraper.model.MerchandiseMetadataDto;
import io.irw.hawk.scraper.model.ProcessingPipelineStep;
Expand All @@ -29,7 +28,7 @@ public class PriceExtractor implements ItemSummaryDataExtractor {

@Override
public List<Class<? extends ProcessingPipelineStep>> dependsOn() {
return List.of(ListingTypeExtractor.class, PieceCountExtractor.class, ShippingCostExtractor.class,
return List.of(BasicFieldExtractor.class, PieceCountExtractor.class, ShippingCostExtractor.class,
ShippingPossibilitiesMatcher.class);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import io.irw.hawk.scraper.model.MerchandiseMetadataDto;
import io.irw.hawk.scraper.model.MerchandiseReasoningDto;
import io.irw.hawk.scraper.model.ProcessingPipelineStep;
import io.irw.hawk.scraper.service.extractors.ListingTypeExtractor;
import io.irw.hawk.scraper.service.extractors.BasicFieldExtractor;
import io.irw.hawk.scraper.service.extractors.PieceCountExtractor;
import io.irw.hawk.scraper.service.extractors.PriceExtractor;
import io.irw.hawk.scraper.service.extractors.ShippingCostExtractor;
Expand All @@ -28,7 +28,7 @@ public class BaselineItemDataMatcher implements ItemSummaryMatcher {

@Override
public List<Class<? extends ProcessingPipelineStep>> dependsOn() {
return List.of(ListingTypeExtractor.class, ReputationMatcher.class, PriceExtractor.class, PieceCountExtractor.class,
return List.of(BasicFieldExtractor.class, ReputationMatcher.class, PriceExtractor.class, PieceCountExtractor.class,
ShippingCostExtractor.class, ShippingPossibilitiesMatcher.class);
}

Expand Down
Loading

0 comments on commit 76fbaf7

Please sign in to comment.