From d7a635649a23e63c11ae4bc172d4ee1f112bcc67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Mon, 29 Jul 2024 11:26:42 +0200 Subject: [PATCH] Search + Blacklist Controllers --- .../ph87/kleinanzeigen/crud/CrudAction.java | 5 ++ .../kleinanzeigen/blacklist/Blacklist.java | 12 +-- .../blacklist/BlacklistController.java | 29 +++++-- .../blacklist/BlacklistService.java | 68 ++++++++++++----- .../kleinanzeigen/search/Search.java | 15 +--- .../search/SearchController.java | 50 ++++++++++-- .../kleinanzeigen/search/SearchService.java | 76 +++++++++++++++---- 7 files changed, 187 insertions(+), 68 deletions(-) create mode 100644 src/main/java/de/ph87/kleinanzeigen/crud/CrudAction.java diff --git a/src/main/java/de/ph87/kleinanzeigen/crud/CrudAction.java b/src/main/java/de/ph87/kleinanzeigen/crud/CrudAction.java new file mode 100644 index 0000000..adb4f8f --- /dev/null +++ b/src/main/java/de/ph87/kleinanzeigen/crud/CrudAction.java @@ -0,0 +1,5 @@ +package de.ph87.kleinanzeigen.crud; + +public enum CrudAction { + CREATED, CHANGED, REMOVED +} diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/Blacklist.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/Blacklist.java index a1d84f9..52af55f 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/Blacklist.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/Blacklist.java @@ -4,22 +4,21 @@ 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 lombok.*; import java.util.Arrays; import java.util.Locale; @Entity @Getter +@Setter @ToString @NoArgsConstructor public class Blacklist { @Id @GeneratedValue + @Setter(AccessLevel.NONE) private long id; @Column(nullable = false) @@ -34,11 +33,6 @@ public class Blacklist { 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") diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/BlacklistController.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/BlacklistController.java index 5102bd7..da60870 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/BlacklistController.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/BlacklistController.java @@ -1,10 +1,10 @@ package de.ph87.kleinanzeigen.kleinanzeigen.blacklist; +import lombok.NonNull; 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; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequiredArgsConstructor @@ -13,14 +13,29 @@ public class BlacklistController { private final BlacklistService blacklistService; + @PostMapping("all") + public List all() { + return blacklistService.all(); + } + @PostMapping("create") public BlacklistDto create(@RequestBody BlacklistCreate create) { return blacklistService.create(create); } - @PostMapping("edit") - public BlacklistDto edit(@RequestBody BlacklistDto edit) { - return blacklistService.edit(edit); + @PostMapping("{id}/delete") + public BlacklistDto delete(@PathVariable final long id) { + return blacklistService.delete(id); + } + + @PostMapping("{id}/enabled") + public BlacklistDto enabled(@PathVariable final long id, @RequestBody final boolean enabled) { + return blacklistService.enabled(id, enabled); + } + + @PostMapping("{id}/query") + public BlacklistDto query(@PathVariable final long id, @NonNull @RequestBody final String query) { + return blacklistService.query(id, query); } } diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/BlacklistService.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/BlacklistService.java index c50d304..4f8c2ca 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/BlacklistService.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/blacklist/BlacklistService.java @@ -1,14 +1,17 @@ package de.ph87.kleinanzeigen.kleinanzeigen.blacklist; +import de.ph87.kleinanzeigen.crud.CrudAction; 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 org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; +import java.util.function.Consumer; @Slf4j @Service @@ -18,26 +21,51 @@ 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 findAllBlacklisted(@NonNull final String title) { return blacklistRepository.findAllByEnabledTrue().stream().filter(blacklist -> blacklist.matches(title)).map(BlacklistDto::new).toList(); } + public List all() { + return blacklistRepository.findAll().stream().map(BlacklistDto::new).toList(); + } + + public BlacklistDto create(final BlacklistCreate create) { + final Blacklist blacklist = blacklistRepository.save(new Blacklist(create)); + return publish(blacklist, CrudAction.CREATED); + } + + @NonNull + public BlacklistDto delete(final long id) { + final Blacklist blacklist = getById(id); + return publish(blacklist, CrudAction.REMOVED); + } + + @PostMapping("{id}/enabled") + public BlacklistDto enabled(@PathVariable final long id, @RequestBody final boolean enabled) { + return set(id, blacklist -> blacklist.setEnabled(enabled)); + } + + @PostMapping("{id}/query") + public BlacklistDto query(@PathVariable final long id, @NonNull @RequestBody final String query) { + return set(id, blacklist -> blacklist.setQuery(query)); + } + + @NonNull + public BlacklistDto set(final long id, @NonNull final Consumer setter) { + final Blacklist blacklist = getById(id); + setter.accept(blacklist); + return publish(blacklist, CrudAction.CHANGED); + } + + @NonNull + private Blacklist getById(final long id) { + return blacklistRepository.findById(id).orElseThrow(); + } + + private BlacklistDto publish(@NonNull final Blacklist blacklist, @NonNull final CrudAction action) { + final BlacklistDto dto = new BlacklistDto(blacklist); + log.info("Blacklist {}: {}", action, dto); + return dto; + } + } diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/Search.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/Search.java index 4d92783..1372553 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/Search.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/Search.java @@ -5,19 +5,18 @@ 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 lombok.*; @Entity @Getter +@Setter @ToString @NoArgsConstructor public class Search { @Id @GeneratedValue + @Setter(AccessLevel.NONE) private long id; @Column(nullable = false) @@ -49,12 +48,4 @@ public class Search { priceMax = create.getPriceMax(); } - public void edit(final SearchDto edit) { - enabled = edit.isEnabled(); - query = edit.getQuery(); - radius = edit.getRadius(); - priceMin = edit.getPriceMin(); - priceMax = edit.getPriceMax(); - } - } diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/SearchController.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/SearchController.java index 2f9b692..9056a9c 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/SearchController.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/SearchController.java @@ -1,10 +1,11 @@ package de.ph87.kleinanzeigen.kleinanzeigen.search; +import jakarta.annotation.Nullable; +import lombok.NonNull; 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; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequiredArgsConstructor @@ -13,14 +14,49 @@ public class SearchController { private final SearchService searchService; + @PostMapping("all") + public List all() { + return searchService.all(); + } + @PostMapping("create") public SearchDto create(@RequestBody SearchCreate create) { return searchService.create(create); } - @PostMapping("edit") - public SearchDto edit(@RequestBody SearchDto edit) { - return searchService.edit(edit); + @PostMapping("{id}/delete") + public SearchDto delete(@PathVariable final long id) { + return searchService.delete(id); + } + + @PostMapping("{id}/enabled") + public SearchDto enabled(@PathVariable final long id, @RequestBody final boolean enabled) { + return searchService.enabled(id, enabled); + } + + @PostMapping("{id}/query") + public SearchDto query(@PathVariable final long id, @NonNull @RequestBody final String query) { + return searchService.query(id, query); + } + + @PostMapping("{id}/radius") + public SearchDto radius(@PathVariable final long id, @RequestBody final int radius) { + return searchService.radius(id, radius); + } + + @PostMapping("{id}/priceMin") + public SearchDto priceMin(@PathVariable final long id, @Nullable @RequestBody(required = false) final Integer priceMin) { + return searchService.priceMin(id, priceMin); + } + + @PostMapping("{id}/priceMax") + public SearchDto priceMax(@PathVariable final long id, @Nullable @RequestBody(required = false) final Integer priceMax) { + return searchService.priceMax(id, priceMax); + } + + @PostMapping("{id}/resendOnPriceChange") + public SearchDto resendOnPriceChange(@PathVariable final long id, @RequestBody final boolean resendOnPriceChange) { + return searchService.resendOnPriceChange(id, resendOnPriceChange); } } diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/SearchService.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/SearchService.java index cd50dcc..5253503 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/SearchService.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/search/SearchService.java @@ -1,13 +1,18 @@ package de.ph87.kleinanzeigen.kleinanzeigen.search; +import de.ph87.kleinanzeigen.crud.CrudAction; +import jakarta.annotation.Nullable; +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 org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; +import java.util.function.Consumer; @Slf4j @Service @@ -18,24 +23,69 @@ public class SearchService { private final SearchRepository searchRepository; public List findAllEnabledDto() { - return searchRepository.findAllByEnabledTrue().stream().map(this::toDto).toList(); + return searchRepository.findAllByEnabledTrue().stream().map(SearchDto::new).toList(); } - private SearchDto toDto(Search search) { - return new SearchDto(search); + public List all() { + return searchRepository.findAll().stream().map(SearchDto::new).toList(); } public SearchDto create(final SearchCreate create) { - final SearchDto dto = toDto(searchRepository.save(new Search(create))); - log.info("Search CREATED: {}", dto); - return dto; + final Search search = searchRepository.save(new Search(create)); + return publish(search, CrudAction.CREATED); } - public SearchDto edit(final SearchDto edit) { - final Search search = searchRepository.findById(edit.getId()).orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST)); - search.edit(edit); - final SearchDto dto = toDto(search); - log.info("Search EDITED: {}", dto); + @NonNull + public SearchDto delete(final long id) { + final Search search = getById(id); + return publish(search, CrudAction.REMOVED); + } + + @PostMapping("{id}/enabled") + public SearchDto enabled(@PathVariable final long id, @RequestBody final boolean enabled) { + return set(id, search -> search.setEnabled(enabled)); + } + + @PostMapping("{id}/query") + public SearchDto query(@PathVariable final long id, @NonNull @RequestBody final String query) { + return set(id, search -> search.setQuery(query)); + } + + @PostMapping("{id}/radius") + public SearchDto radius(@PathVariable final long id, @RequestBody final int radius) { + return set(id, search -> search.setRadius(radius)); + } + + @PostMapping("{id}/priceMin") + public SearchDto priceMin(@PathVariable final long id, @Nullable @RequestBody(required = false) final Integer priceMin) { + return set(id, search -> search.setPriceMin(priceMin)); + } + + @PostMapping("{id}/priceMax") + public SearchDto priceMax(@PathVariable final long id, @Nullable @RequestBody(required = false) final Integer priceMax) { + return set(id, search -> search.setPriceMax(priceMax)); + } + + @PostMapping("{id}/resendOnPriceChange") + public SearchDto resendOnPriceChange(@PathVariable final long id, @RequestBody final boolean resendOnPriceChange) { + return set(id, search -> search.setResendOnPriceChange(resendOnPriceChange)); + } + + @NonNull + public SearchDto set(final long id, @NonNull final Consumer setter) { + final Search search = getById(id); + setter.accept(search); + return publish(search, CrudAction.CHANGED); + } + + @NonNull + private Search getById(final long id) { + return searchRepository.findById(id).orElseThrow(); + } + + private SearchDto publish(@NonNull final Search search, @NonNull final CrudAction action) { + final SearchDto dto = new SearchDto(search); + log.info("Search {}: {}", action, dto); return dto; }