Blacklist
This commit is contained in:
parent
0d2cc185ed
commit
3041ea9aa7
@ -1,5 +1,7 @@
|
|||||||
package de.ph87.kleinanzeigen.kleinanzeigen;
|
package de.ph87.kleinanzeigen.kleinanzeigen;
|
||||||
|
|
||||||
|
import de.ph87.kleinanzeigen.kleinanzeigen.blacklist.BlacklistDto;
|
||||||
|
import de.ph87.kleinanzeigen.kleinanzeigen.blacklist.BlacklistService;
|
||||||
import de.ph87.kleinanzeigen.kleinanzeigen.offer.LocationNotFound;
|
import de.ph87.kleinanzeigen.kleinanzeigen.offer.LocationNotFound;
|
||||||
import de.ph87.kleinanzeigen.kleinanzeigen.offer.OfferCreate;
|
import de.ph87.kleinanzeigen.kleinanzeigen.offer.OfferCreate;
|
||||||
import de.ph87.kleinanzeigen.kleinanzeigen.offer.OfferService;
|
import de.ph87.kleinanzeigen.kleinanzeigen.offer.OfferService;
|
||||||
@ -17,6 +19,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.time.DateTimeException;
|
import java.time.DateTimeException;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -35,6 +38,8 @@ public class KleinanzeigenApi {
|
|||||||
|
|
||||||
private final KleinanzeigenConfig config;
|
private final KleinanzeigenConfig config;
|
||||||
|
|
||||||
|
private final BlacklistService blacklistService;
|
||||||
|
|
||||||
@Scheduled(initialDelay = 0, fixedRate = 1, timeUnit = TimeUnit.MINUTES)
|
@Scheduled(initialDelay = 0, fixedRate = 1, timeUnit = TimeUnit.MINUTES)
|
||||||
public void fetch() {
|
public void fetch() {
|
||||||
fetch(VERSCHENKEN_EPPELBORN_RADIUS.formatted(config.getRadiusKm()), config.getRadiusKm());
|
fetch(VERSCHENKEN_EPPELBORN_RADIUS.formatted(config.getRadiusKm()), config.getRadiusKm());
|
||||||
@ -65,9 +70,15 @@ public class KleinanzeigenApi {
|
|||||||
private void tryParse(final Element article, final URI uri, final int radius) {
|
private void tryParse(final Element article, final URI uri, final int radius) {
|
||||||
try {
|
try {
|
||||||
final OfferCreate create = new OfferCreate(article, uri);
|
final OfferCreate create = new OfferCreate(article, uri);
|
||||||
if (create.getDistance() <= radius) {
|
if (create.getDistance() > radius) {
|
||||||
offerService.updateOrCreate(create);
|
return;
|
||||||
}
|
}
|
||||||
|
final List<BlacklistDto> blacklist = blacklistService.findAllBlacklisted(create.getTitle());
|
||||||
|
if (!blacklist.isEmpty()) {
|
||||||
|
log.info("Offer is blacklisted due to: blacklists={}, offer={}", blacklist.stream().map(BlacklistDto::getQuery).toList(), create);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
offerService.updateOrCreate(create);
|
||||||
} catch (NumberFormatException | DateTimeException | LocationNotFound e) {
|
} catch (NumberFormatException | DateTimeException | LocationNotFound e) {
|
||||||
log.error("Failed to parse Offer:\n{}\n", article.outerHtml(), e);
|
log.error("Failed to parse Offer:\n{}\n", article.outerHtml(), e);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,52 @@
|
|||||||
|
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.GeneratedValue;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Getter
|
||||||
|
@ToString
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class Blacklist {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private long id;
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
private boolean enabled;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Column(nullable = false)
|
||||||
|
private String query;
|
||||||
|
|
||||||
|
public Blacklist(final BlacklistCreate create) {
|
||||||
|
enabled = create.isEnabled();
|
||||||
|
query = create.getQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void edit(final BlacklistDto edit) {
|
||||||
|
enabled = edit.isEnabled();
|
||||||
|
query = edit.getQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean matches(@NonNull final String title) {
|
||||||
|
final String[] words = query.replaceAll("([0-9])([a-zA-Z])", "$1 $2")
|
||||||
|
.replaceAll("([a-zA-Z])([0-9])", "$1 $2")
|
||||||
|
.replaceAll("([a-z])([A-Z])", "$1 $2")
|
||||||
|
.replaceAll("^\\W+|\\W+$", "")
|
||||||
|
.toLowerCase(Locale.ROOT)
|
||||||
|
.split("\\W+");
|
||||||
|
return Arrays.stream(words).map(".*%s.*"::formatted).allMatch(title::matches);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RequestMapping("Kleinanzeigen/Blacklist")
|
||||||
|
public class BlacklistController {
|
||||||
|
|
||||||
|
private final BlacklistService blacklistService;
|
||||||
|
|
||||||
|
@PostMapping("create")
|
||||||
|
public BlacklistDto create(@RequestBody BlacklistCreate create) {
|
||||||
|
return blacklistService.create(create);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("edit")
|
||||||
|
public BlacklistDto edit(@RequestBody BlacklistDto edit) {
|
||||||
|
return blacklistService.edit(edit);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NonNull;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BlacklistCreate {
|
||||||
|
|
||||||
|
private final boolean enabled;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final String query;
|
||||||
|
|
||||||
|
public BlacklistCreate(final boolean enabled, @NonNull final String query) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
this.query = query;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NonNull;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BlacklistDto {
|
||||||
|
|
||||||
|
private final long id;
|
||||||
|
|
||||||
|
private final boolean enabled;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final String query;
|
||||||
|
|
||||||
|
public BlacklistDto(final Blacklist blacklist) {
|
||||||
|
this.id = blacklist.getId();
|
||||||
|
this.enabled = blacklist.isEnabled();
|
||||||
|
this.query = blacklist.getQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
||||||
|
|
||||||
|
import org.springframework.data.repository.ListCrudRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface BlacklistRepository extends ListCrudRepository<Blacklist, Long> {
|
||||||
|
|
||||||
|
List<Blacklist> findAllByEnabledTrue();
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
||||||
|
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@Transactional
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class BlacklistService {
|
||||||
|
|
||||||
|
private final BlacklistRepository blacklistRepository;
|
||||||
|
|
||||||
|
private BlacklistDto toDto(Blacklist blacklist) {
|
||||||
|
return new BlacklistDto(blacklist);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlacklistDto create(final BlacklistCreate create) {
|
||||||
|
final BlacklistDto dto = toDto(blacklistRepository.save(new Blacklist(create)));
|
||||||
|
log.info("Blacklist CREATED: {}", dto);
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlacklistDto edit(final BlacklistDto edit) {
|
||||||
|
final Blacklist blacklist = blacklistRepository.findById(edit.getId()).orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST));
|
||||||
|
blacklist.edit(edit);
|
||||||
|
final BlacklistDto dto = toDto(blacklist);
|
||||||
|
log.info("Blacklist EDITED: {}", dto);
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<BlacklistDto> findAllBlacklisted(@NonNull final String title) {
|
||||||
|
return blacklistRepository.findAllByEnabledTrue().stream().filter(blacklist -> blacklist.matches(title)).map(BlacklistDto::new).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,7 +1,5 @@
|
|||||||
package de.ph87.kleinanzeigen.kleinanzeigen.search;
|
package de.ph87.kleinanzeigen.kleinanzeigen.search;
|
||||||
|
|
||||||
import de.ph87.kleinanzeigen.kleinanzeigen.KleinanzeigenConfig;
|
|
||||||
import jakarta.annotation.PostConstruct;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
@ -19,22 +17,6 @@ public class SearchService {
|
|||||||
|
|
||||||
private final SearchRepository searchRepository;
|
private final SearchRepository searchRepository;
|
||||||
|
|
||||||
private final KleinanzeigenConfig kleinanzeigenConfig;
|
|
||||||
|
|
||||||
@PostConstruct
|
|
||||||
public void init() {
|
|
||||||
if (kleinanzeigenConfig.isDemo()) {
|
|
||||||
if (searchRepository.count() == 0) {
|
|
||||||
demoCreate("Garten Bank");
|
|
||||||
demoCreate("Teich Pumpe");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void demoCreate(final String Garten_Bank) {
|
|
||||||
searchRepository.save(new Search(new SearchCreate(true, Garten_Bank, 15, 0, 30)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<SearchDto> findAllEnabledDto() {
|
public List<SearchDto> findAllEnabledDto() {
|
||||||
return searchRepository.findAllByEnabledTrue().stream().map(this::toDto).toList();
|
return searchRepository.findAllByEnabledTrue().stream().map(this::toDto).toList();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user