Skip to content

Commit

Permalink
add Undercover 80/110mm wheels to the catalog
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmitriusan committed Dec 10, 2023
1 parent 5d71e16 commit 94459fe
Show file tree
Hide file tree
Showing 10 changed files with 161 additions and 59 deletions.
4 changes: 4 additions & 0 deletions hawk/docs/hawk/ebay_api.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# To generate classes from OpenAPI specification
* call gradle task `generateEbayApiClient` to generate classes from OpenAPI specification

# Categories and their IDs
* See https://pages.ebay.com/sellerinformation/news/categorychanges.html
* for 2023, https://ir.ebaystatic.com/pictures/aw/pics/categorychanges/2023/US_Category_Changes_May2023.pdf

# Limits
* https://developer.ebay.com/develop/apis/api-call-limits

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.irw.hawk.dto.merchandise;

import static io.irw.hawk.dto.merchandise.ProductVariantEnum.LABEDA_80_MM_WHEELS;
import static io.irw.hawk.dto.merchandise.ProductVariantEnum.*;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
Expand All @@ -14,7 +14,11 @@
public enum ProductQualifierEnum {

NEW_LABEDA_80_MM_WHEELS(LABEDA_80_MM_WHEELS, "New"),
USED_LABEDA_80_MM_WHEELS(LABEDA_80_MM_WHEELS, "Used");
USED_LABEDA_80_MM_WHEELS(LABEDA_80_MM_WHEELS, "Used"),
NEW_UNDERCOVER_80_MM_WHEELS(UNDERCOVER_80_MM_WHEELS, "New"),
USED_UNDERCOVER_80_MM_WHEELS(UNDERCOVER_80_MM_WHEELS, "Used"),
NEW_UNDERCOVER_110_MM_WHEELS(UNDERCOVER_110_MM_WHEELS, "New"),
USED_UNDERCOVER_110_MM_WHEELS(UNDERCOVER_110_MM_WHEELS, "Used");

String name;
ProductVariantEnum productVariant;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public enum ProductVariantEnum {

LABEDA_80_MM_WHEELS(GroupEnum.WHEELS, "Labeda 80mm wheels");
LABEDA_80_MM_WHEELS(GroupEnum.WHEELS, "Labeda 80mm wheels"),
UNDERCOVER_80_MM_WHEELS(GroupEnum.WHEELS, "Undercover 80mm wheels"),
UNDERCOVER_110_MM_WHEELS(GroupEnum.WHEELS, "Undercover 100mm wheels");

String name;
GroupEnum group;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,24 @@ public ProductVariantPreferencesDto resolveProductVariantPreferences(EbayHighlig
.targetMarketPricePerPieceUsd(BigDecimal.valueOf(7.5))
.weightOfPieceKg(BigDecimal.valueOf(0.15))
.build();
case UNDERCOVER_80_MM_WHEELS:
return ProductVariantPreferencesDto.builder()
.productVariant(productVariant)
.desiredCostPerPieceUsd(BigDecimal.valueOf(7))
.typicalPricePerPieceUsd(BigDecimal.valueOf(15))
.meestHandlingPerPieceUsd(BigDecimal.valueOf(2))
.targetMarketPricePerPieceUsd(BigDecimal.valueOf(15))
.weightOfPieceKg(BigDecimal.valueOf(0.15))
.build();
case UNDERCOVER_110_MM_WHEELS:
return ProductVariantPreferencesDto.builder()
.productVariant(productVariant)
.desiredCostPerPieceUsd(BigDecimal.valueOf(8))
.typicalPricePerPieceUsd(BigDecimal.valueOf(15))
.meestHandlingPerPieceUsd(BigDecimal.valueOf(2))
.targetMarketPricePerPieceUsd(BigDecimal.valueOf(17.3))
.weightOfPieceKg(BigDecimal.valueOf(0.15))
.build();
default:
throw new IllegalArgumentException("Unsupported product variant: " + productVariant);
}
Expand Down

This file was deleted.

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

import com.ebay.buy.browse.model.ItemSummary;
import io.irw.hawk.dto.ebay.EbayFindingDto;
import io.irw.hawk.dto.merchandise.GroupEnum;
import io.irw.hawk.dto.merchandise.MerchandiseVerdictType;
import io.irw.hawk.dto.merchandise.ProductVariantEnum;
import io.irw.hawk.dto.ebay.EbayHighlightDto;
Expand All @@ -31,7 +32,7 @@
@Service
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
@Slf4j
public class LabedaWheelsInterestMatcher implements ItemSummaryMatcher {
public class InlineSkateWheelsInterestMatcher implements ItemSummaryMatcher {

ShippingAndHandlingCostService shippingAndHandlingCostService;
static int DESIRED_MIN_WHEEL_COUNT = 4;
Expand Down Expand Up @@ -98,6 +99,8 @@ private List<MerchandiseReasoningLog> checkPricePerPiece(EbayHighlightDto highli

@Override
public boolean isApplicableTo(ProductVariantEnum productVariant) {
return productVariant.equals(ProductVariantEnum.LABEDA_80_MM_WHEELS);
return productVariant.getGroup().equals(
GroupEnum.WHEELS
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static io.irw.hawk.dto.merchandise.MerchandiseVerdictType.UNPROCESSABLE;

import com.ebay.buy.browse.model.ItemSummary;
import io.irw.hawk.dto.merchandise.GroupEnum;
import io.irw.hawk.dto.merchandise.ProductVariantEnum;
import io.irw.hawk.dto.ebay.EbayHighlightDto;
import io.irw.hawk.scraper.model.ProcessingPipelineStep;
Expand Down Expand Up @@ -43,6 +44,8 @@ public void match(ItemSummary itemSummary, EbayHighlightDto highlightDto) {

@Override
public boolean isApplicableTo(ProductVariantEnum productVariant) {
return productVariant.equals(ProductVariantEnum.LABEDA_80_MM_WHEELS);
return productVariant.getGroup().equals(
GroupEnum.WHEELS
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,19 @@
import static io.irw.hawk.dto.merchandise.MerchandiseVerdictType.REJECT;
import static org.apache.commons.lang3.StringUtils.lowerCase;

import com.ebay.buy.browse.model.Category;
import com.ebay.buy.browse.model.ItemSummary;
import io.irw.hawk.dto.ebay.EbayHighlightDto;
import io.irw.hawk.dto.merchandise.GroupEnum;
import io.irw.hawk.dto.merchandise.ProductVariantEnum;
import io.irw.hawk.scraper.model.ProcessingPipelineStep;
import io.irw.hawk.scraper.service.matchers.BaselineItemDataMatcher;
import io.irw.hawk.scraper.service.matchers.ItemSummaryMatcher;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
Expand All @@ -36,7 +40,9 @@ public List<Class<? extends ProcessingPipelineStep>> dependencyFor() {

@Override
public boolean isApplicableTo(ProductVariantEnum productVariant) {
return productVariant.equals(ProductVariantEnum.LABEDA_80_MM_WHEELS);
return productVariant.getGroup().equals(
GroupEnum.WHEELS
);
}

@Override
Expand All @@ -52,6 +58,12 @@ public void match(ItemSummary itemSummary, EbayHighlightDto highlightDto) {
addNewReasoning(highlightDto, "Microbearing wheels detected at '%s'".formatted(mergedTitleAndDescription),
REJECT);
}

boolean blacklistedCategory = itemSummary.getCategories() != null && itemSummary.getCategories().stream()
.anyMatch(this::categoryIsBlacklisted);
if (blacklistedCategory) {
addNewReasoning(highlightDto, "Some categories are blacklisted %s".formatted(itemSummary.getCategories()), REJECT);
}
}

protected static boolean checkForMicrobearings(String mergedTitleAndDescription) {
Expand All @@ -71,4 +83,31 @@ protected static boolean checkForMicrobearings(String mergedTitleAndDescription)
return false;
}


private boolean categoryIsBlacklisted(Category categoryFromListing) {
return Stream.of(BLACKLISTED_CATEGORIES)
.filter(blacklistedCategory -> blacklistedCategory.getCategoryId().equals(categoryFromListing.getCategoryId())
|| blacklistedCategory.getCategoryName().equals(categoryFromListing.getCategoryName()))
.findAny()
.map(matchedCategory -> {
if (!matchedCategory.getCategoryId().equals(categoryFromListing.getCategoryId())
|| !matchedCategory.getCategoryName().equals(categoryFromListing.getCategoryName())) {
log.warn("Wrong category definition for blacklisted category: {}, partially matches the actual category {}",
matchedCategory, categoryFromListing);
}
return matchedCategory;
})
.isPresent();
}

private static Category[] BLACKLISTED_CATEGORIES = {
new Category("95112", "Diecast & Toys"),
new Category("165776", "Diecast & Models"),
new Category("222", "Diecast & Toy Vehicles"),
new Category("7315", "Other Diecast Vehicle Accs"),
new Category("51023", "Diecast Toy Vehicles"),
new Category("152939", "Diecast"),
new Category("95112", "Diecast & Toys"),
};

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package io.irw.hawk.scraper.service.processors.skates.parts.processor;

import static io.irw.hawk.integration.ebay.buy.browse.ItemSummarySearchParameterDto.FIELD_GROUPS_EXTENDED_AND_MATCHING_ITEMS;
import static io.irw.hawk.integration.ebay.model.EbayFilters.AUCTION_OR_BUY_NOW_OR_FIXED_PRICE;
import static io.irw.hawk.integration.ebay.model.EbayFilters.priceMax;

import io.irw.hawk.dto.ebay.SearchTermDto;
import io.irw.hawk.dto.merchandise.ProductQualifierEnum;
import io.irw.hawk.dto.merchandise.ProductVariantEnum;
import io.irw.hawk.integration.ebay.buy.browse.ItemSummarySearchParameterDto;
import io.irw.hawk.integration.ebay.buy.browse.ItemSummarySearchParameterDto.ItemSummarySearchParameterDtoBuilder;
import io.irw.hawk.scraper.service.processors.ProductScrapeProcessor;
import java.util.Arrays;
import java.util.List;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;

@RequiredArgsConstructor
@Service
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
@Slf4j
public class InlineSkateWheelsScrapeProcessor implements ProductScrapeProcessor {

static ProductVariantEnum[] SUPPORTED_PVS = new ProductVariantEnum[]{
ProductVariantEnum.LABEDA_80_MM_WHEELS,
ProductVariantEnum.UNDERCOVER_80_MM_WHEELS,
ProductVariantEnum.UNDERCOVER_110_MM_WHEELS};

static ProductQualifierEnum[] SUPPORTED_PQS = new ProductQualifierEnum[]{
ProductQualifierEnum.NEW_LABEDA_80_MM_WHEELS,
ProductQualifierEnum.USED_LABEDA_80_MM_WHEELS,
ProductQualifierEnum.NEW_UNDERCOVER_80_MM_WHEELS,
ProductQualifierEnum.USED_UNDERCOVER_80_MM_WHEELS,
ProductQualifierEnum.NEW_UNDERCOVER_110_MM_WHEELS,
ProductQualifierEnum.USED_UNDERCOVER_110_MM_WHEELS,
};

@Override
public boolean supports(ProductVariantEnum productVariant) {
return Arrays.stream(SUPPORTED_PVS)
.anyMatch(pv -> pv.equals(productVariant));
}

@Override
public List<SearchTermDto> generateSearchTerms(ProductVariantEnum productVariant) {
return switch (productVariant) {
case LABEDA_80_MM_WHEELS -> List.of(SearchTermDto.builder()
.searchParams(getDefaultSearchParamsBuilder(50)
.q("labeda wheels 80 mm")
.build())
.build());
case UNDERCOVER_80_MM_WHEELS -> List.of(SearchTermDto.builder()
.searchParams(getDefaultSearchParamsBuilder(70)
.q("undercover wheels 80 mm")
.build())
.build());
case UNDERCOVER_110_MM_WHEELS -> List.of(SearchTermDto.builder()
.searchParams(getDefaultSearchParamsBuilder(70)
.q("undercover wheels 110 mm")
.build())
.build());
default -> throw new IllegalStateException("Unexpected value: " + productVariant);
};
}

private static ItemSummarySearchParameterDtoBuilder getDefaultSearchParamsBuilder(double maxPrice) {
return ItemSummarySearchParameterDto.builder()
.filter(StringUtils.joinWith(",", AUCTION_OR_BUY_NOW_OR_FIXED_PRICE, priceMax(maxPrice)))
.fieldgroups(FIELD_GROUPS_EXTENDED_AND_MATCHING_ITEMS)
.sort("price");
}

}
4 changes: 3 additions & 1 deletion hawk/src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ hawk:
enabled: true
products:
variants:
- LABEDA_80_MM_WHEELS
# - LABEDA_80_MM_WHEELS
- UNDERCOVER_80_MM_WHEELS
- UNDERCOVER_110_MM_WHEELS

spring:
banner:
Expand Down

0 comments on commit 94459fe

Please sign in to comment.