Search + Blacklist Controllers
This commit is contained in:
parent
25804e0680
commit
d7a635649a
5
src/main/java/de/ph87/kleinanzeigen/crud/CrudAction.java
Normal file
5
src/main/java/de/ph87/kleinanzeigen/crud/CrudAction.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package de.ph87.kleinanzeigen.crud;
|
||||||
|
|
||||||
|
public enum CrudAction {
|
||||||
|
CREATED, CHANGED, REMOVED
|
||||||
|
}
|
||||||
@ -4,22 +4,21 @@ import jakarta.persistence.Column;
|
|||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.GeneratedValue;
|
import jakarta.persistence.GeneratedValue;
|
||||||
import jakarta.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import lombok.Getter;
|
import lombok.*;
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.ToString;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
|
@Setter
|
||||||
@ToString
|
@ToString
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class Blacklist {
|
public class Blacklist {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue
|
@GeneratedValue
|
||||||
|
@Setter(AccessLevel.NONE)
|
||||||
private long id;
|
private long id;
|
||||||
|
|
||||||
@Column(nullable = false)
|
@Column(nullable = false)
|
||||||
@ -34,11 +33,6 @@ public class Blacklist {
|
|||||||
query = create.getQuery();
|
query = create.getQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void edit(final BlacklistDto edit) {
|
|
||||||
enabled = edit.isEnabled();
|
|
||||||
query = edit.getQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean matches(@NonNull final String title) {
|
public boolean matches(@NonNull final String title) {
|
||||||
final String[] words = query.replaceAll("([0-9])([a-zA-Z])", "$1 $2")
|
final String[] words = query.replaceAll("([0-9])([a-zA-Z])", "$1 $2")
|
||||||
.replaceAll("([a-zA-Z])([0-9])", "$1 $2")
|
.replaceAll("([a-zA-Z])([0-9])", "$1 $2")
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
||||||
|
|
||||||
|
import lombok.NonNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import java.util.List;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -13,14 +13,29 @@ public class BlacklistController {
|
|||||||
|
|
||||||
private final BlacklistService blacklistService;
|
private final BlacklistService blacklistService;
|
||||||
|
|
||||||
|
@PostMapping("all")
|
||||||
|
public List<BlacklistDto> all() {
|
||||||
|
return blacklistService.all();
|
||||||
|
}
|
||||||
|
|
||||||
@PostMapping("create")
|
@PostMapping("create")
|
||||||
public BlacklistDto create(@RequestBody BlacklistCreate create) {
|
public BlacklistDto create(@RequestBody BlacklistCreate create) {
|
||||||
return blacklistService.create(create);
|
return blacklistService.create(create);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("edit")
|
@PostMapping("{id}/delete")
|
||||||
public BlacklistDto edit(@RequestBody BlacklistDto edit) {
|
public BlacklistDto delete(@PathVariable final long id) {
|
||||||
return blacklistService.edit(edit);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,17 @@
|
|||||||
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
package de.ph87.kleinanzeigen.kleinanzeigen.blacklist;
|
||||||
|
|
||||||
|
import de.ph87.kleinanzeigen.crud.CrudAction;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
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.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@ -18,26 +21,51 @@ public class BlacklistService {
|
|||||||
|
|
||||||
private final BlacklistRepository blacklistRepository;
|
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) {
|
public List<BlacklistDto> findAllBlacklisted(@NonNull final String title) {
|
||||||
return blacklistRepository.findAllByEnabledTrue().stream().filter(blacklist -> blacklist.matches(title)).map(BlacklistDto::new).toList();
|
return blacklistRepository.findAllByEnabledTrue().stream().filter(blacklist -> blacklist.matches(title)).map(BlacklistDto::new).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<BlacklistDto> 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<Blacklist> 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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,19 +5,18 @@ import jakarta.persistence.Column;
|
|||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.GeneratedValue;
|
import jakarta.persistence.GeneratedValue;
|
||||||
import jakarta.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import lombok.Getter;
|
import lombok.*;
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.ToString;
|
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
|
@Setter
|
||||||
@ToString
|
@ToString
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class Search {
|
public class Search {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue
|
@GeneratedValue
|
||||||
|
@Setter(AccessLevel.NONE)
|
||||||
private long id;
|
private long id;
|
||||||
|
|
||||||
@Column(nullable = false)
|
@Column(nullable = false)
|
||||||
@ -49,12 +48,4 @@ public class Search {
|
|||||||
priceMax = create.getPriceMax();
|
priceMax = create.getPriceMax();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void edit(final SearchDto edit) {
|
|
||||||
enabled = edit.isEnabled();
|
|
||||||
query = edit.getQuery();
|
|
||||||
radius = edit.getRadius();
|
|
||||||
priceMin = edit.getPriceMin();
|
|
||||||
priceMax = edit.getPriceMax();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,11 @@
|
|||||||
package de.ph87.kleinanzeigen.kleinanzeigen.search;
|
package de.ph87.kleinanzeigen.kleinanzeigen.search;
|
||||||
|
|
||||||
|
import jakarta.annotation.Nullable;
|
||||||
|
import lombok.NonNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import java.util.List;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -13,14 +14,49 @@ public class SearchController {
|
|||||||
|
|
||||||
private final SearchService searchService;
|
private final SearchService searchService;
|
||||||
|
|
||||||
|
@PostMapping("all")
|
||||||
|
public List<SearchDto> all() {
|
||||||
|
return searchService.all();
|
||||||
|
}
|
||||||
|
|
||||||
@PostMapping("create")
|
@PostMapping("create")
|
||||||
public SearchDto create(@RequestBody SearchCreate create) {
|
public SearchDto create(@RequestBody SearchCreate create) {
|
||||||
return searchService.create(create);
|
return searchService.create(create);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("edit")
|
@PostMapping("{id}/delete")
|
||||||
public SearchDto edit(@RequestBody SearchDto edit) {
|
public SearchDto delete(@PathVariable final long id) {
|
||||||
return searchService.edit(edit);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,18 @@
|
|||||||
package de.ph87.kleinanzeigen.kleinanzeigen.search;
|
package de.ph87.kleinanzeigen.kleinanzeigen.search;
|
||||||
|
|
||||||
|
import de.ph87.kleinanzeigen.crud.CrudAction;
|
||||||
|
import jakarta.annotation.Nullable;
|
||||||
|
import lombok.NonNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
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.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@ -18,24 +23,69 @@ public class SearchService {
|
|||||||
private final SearchRepository searchRepository;
|
private final SearchRepository searchRepository;
|
||||||
|
|
||||||
public List<SearchDto> findAllEnabledDto() {
|
public List<SearchDto> findAllEnabledDto() {
|
||||||
return searchRepository.findAllByEnabledTrue().stream().map(this::toDto).toList();
|
return searchRepository.findAllByEnabledTrue().stream().map(SearchDto::new).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private SearchDto toDto(Search search) {
|
public List<SearchDto> all() {
|
||||||
return new SearchDto(search);
|
return searchRepository.findAll().stream().map(SearchDto::new).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SearchDto create(final SearchCreate create) {
|
public SearchDto create(final SearchCreate create) {
|
||||||
final SearchDto dto = toDto(searchRepository.save(new Search(create)));
|
final Search search = searchRepository.save(new Search(create));
|
||||||
log.info("Search CREATED: {}", dto);
|
return publish(search, CrudAction.CREATED);
|
||||||
return dto;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SearchDto edit(final SearchDto edit) {
|
@NonNull
|
||||||
final Search search = searchRepository.findById(edit.getId()).orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST));
|
public SearchDto delete(final long id) {
|
||||||
search.edit(edit);
|
final Search search = getById(id);
|
||||||
final SearchDto dto = toDto(search);
|
return publish(search, CrudAction.REMOVED);
|
||||||
log.info("Search EDITED: {}", dto);
|
}
|
||||||
|
|
||||||
|
@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<Search> 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;
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user