Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/main/java/codes/yam/contacts/ContactController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.validation.Valid;
import java.net.URI;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand Down Expand Up @@ -70,6 +71,12 @@ public ResponseEntity<Void> deleteContact(@PathVariable String slug) {
return ResponseEntity.status(HttpStatus.SEE_OTHER).location(URI.create("/contacts")).build();
}

@DeleteMapping
public ResponseEntity<Void> deleteManyContacts(@RequestParam List<String> slugs) {
contactService.deleteMany(slugs);
return ResponseEntity.status(HttpStatus.SEE_OTHER).location(URI.create("/contacts")).build();
}

@GetMapping("/{slug}/email")
@ResponseBody
public String validateEmail(@PathVariable String slug, @RequestParam String email) {
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/codes/yam/contacts/ContactRepository.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package codes.yam.contacts;

import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface ContactRepository extends JpaRepository<Contact, UUID> {
Optional<Contact> findBySlug(String slug);

Optional<Contact> findByEmail(String email);

List<Contact>
findByFirstContainingIgnoreCaseOrLastContainingIgnoreCaseOrEmailContainingIgnoreCase(
String first, String last, String email);
List<Contact> findAllBySlugIn(Collection<String> slugs);

@Query("SELECT c FROM Contact c WHERE " +
"LOWER(c.first) LIKE LOWER(CONCAT('%', :q, '%')) OR " +
"LOWER(c.last) LIKE LOWER(CONCAT('%', :q, '%')) OR " +
"LOWER(c.email) LIKE LOWER(CONCAT('%', :q, '%'))")
List<Contact> search(@Param("q") String q);
}
19 changes: 6 additions & 13 deletions src/main/java/codes/yam/contacts/ContactService.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ public List<Contact> findAll() {
}

public List<Contact> search(String q) {
return contactRepository
.findByFirstContainingIgnoreCaseOrLastContainingIgnoreCaseOrEmailContainingIgnoreCase(
q, q, q);
return contactRepository.search(q);
}

public Contact findBySlug(String slug) {
Expand All @@ -33,6 +31,11 @@ public void delete(String slug) {
contactRepository.delete(contact);
}

public void deleteMany(List<String> slugs) {
var contacts = contactRepository.findAllBySlugIn(slugs);
contactRepository.deleteAll(contacts);
}

public Contact update(String slug, Contact updated) {
var contact = findBySlug(slug);
contact.setFirst(updated.getFirst());
Expand All @@ -48,16 +51,6 @@ private String generateSlug(Contact contact) {
return contact.getFirst().toLowerCase() + "-" + contact.getLast().toLowerCase();
}

/**
* Check if an email exists.
*
* @param email - the email to check
* @return true or false
*/
public boolean isEmailTaken(String email) {
return contactRepository.findByEmail(email).isPresent();
}

/**
* Check if an email exists (for other slugs than the supplied slug).
*
Expand Down