From 541688a726c4961d7b982ea6b106439ef2f4ee52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Tue, 18 Jun 2024 10:22:35 +0200 Subject: [PATCH] Offer: zipcode,distance not nullable --- .../kleinanzeigen/KleinanzeigenApi.java | 6 ++++-- .../kleinanzeigen/offer/LocationNotFound.java | 5 +++++ .../kleinanzeigen/offer/Offer.java | 10 ++++------ .../kleinanzeigen/offer/OfferCreate.java | 18 +++++++----------- .../kleinanzeigen/offer/OfferDto.java | 17 ++--------------- .../telegram/TelegramService.java | 4 +++- 6 files changed, 25 insertions(+), 35 deletions(-) create mode 100644 src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/LocationNotFound.java diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/KleinanzeigenApi.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/KleinanzeigenApi.java index 993e8a9..7843dd6 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/KleinanzeigenApi.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/KleinanzeigenApi.java @@ -42,8 +42,10 @@ public class KleinanzeigenApi { private void tryParse(final Element article, final URI uri) { try { final OfferCreate create = new OfferCreate(article, uri); - offerService.updateOrCreate(create); - } catch (NumberFormatException e) { + if (create.getDistance() <= radius) { + offerService.updateOrCreate(create); + } + } catch (NumberFormatException | DateTimeException | LocationNotFound e) { log.error("Failed to parse Offer:\n{}\n", article.outerHtml(), e); } } diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/LocationNotFound.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/LocationNotFound.java new file mode 100644 index 0000000..6e27adc --- /dev/null +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/LocationNotFound.java @@ -0,0 +1,5 @@ +package de.ph87.kleinanzeigen.kleinanzeigen.offer; + +public class LocationNotFound extends Exception { + +} diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/Offer.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/Offer.java index 4809037..fc51727 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/Offer.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/Offer.java @@ -50,13 +50,11 @@ public class Offer { @Column(nullable = false) private String location; - @Column - @Nullable - private String zipcode = null; + @Column(nullable = false) + private String zipcode; - @Column - @Nullable - private Integer distance = null; + @Column(nullable = false) + private int distance; @NonNull @Column(nullable = false) diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferCreate.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferCreate.java index 9bcbc11..f7382ff 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferCreate.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferCreate.java @@ -38,11 +38,10 @@ public class OfferCreate { @ToString.Include private final String location; - @Nullable + @NonNull private final String zipcode; - @Nullable - private final Integer distance; + private final int distance; @NonNull private final String description; @@ -60,16 +59,13 @@ public class OfferCreate { articleDate = parseDate(article.select(".aditem-main--top--right").text()); articleURL = uri.resolve(article.select(".aditem-image a").attr("href")).toString(); final String locationString = article.select(".aditem-main--top--left").text(); - final Matcher locationMatcher = Pattern.compile("^(?\\d+) (?.+) \\((:?ca.)?\\s*(?\\d+)\\s*km\\s*\\)$").matcher(locationString); + final Matcher locationMatcher = Pattern.compile("^(?\\d+) (?.+) \\((:?ca.)?\\s*(?\\d+(?:[,.]\\d+)?)\\s*km\\s*\\)$").matcher(locationString); if (!locationMatcher.find()) { - zipcode = ""; - location = locationString; - distance = null; - } else { - zipcode = locationMatcher.group("zipcode"); - location = locationMatcher.group("location"); - distance = Integer.parseInt(locationMatcher.group("distance")); + throw new LocationNotFound(); } + zipcode = locationMatcher.group("zipcode"); + location = locationMatcher.group("location"); + distance = Integer.parseInt(locationMatcher.group("distance")); imageURL = getImageURL(articleURL); } diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferDto.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferDto.java index f05acb9..f2b456d 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferDto.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/OfferDto.java @@ -6,8 +6,6 @@ import lombok.NonNull; import lombok.ToString; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; @Getter @ToString(onlyExplicitlyIncluded = true) @@ -39,11 +37,10 @@ public class OfferDto { @NonNull private final String location; - @Nullable + @NonNull private final String zipcode; - @Nullable - private final Integer distance; + private final int distance; @NonNull private final String description; @@ -71,16 +68,6 @@ public class OfferDto { imageURL = offer.getImageURL(); } - public String combineLocation() { - final List list = new ArrayList<>(); - if (zipcode != null) { - list.add(zipcode); - } - list.add(location); - if (distance != null) { - list.add("(" + distance + " km)"); - } - return String.join(" ", list); } } diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java index 71fdfd1..4a162d1 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java @@ -188,7 +188,9 @@ public class TelegramService { private String createText(final OfferDto offer) { return "%s\n%s\n%s\n%s\n".formatted( offer.getTitle().replaceAll("\\[", "(").replaceAll("]", ")"), - offer.combineLocation(), + offer.getZipcode(), + offer.getLocation(), + offer.getDistance(), offer.getDescription(), offer.getArticleURL() );