diff --git a/pom.xml b/pom.xml index 5e0cab1..48637fc 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,24 @@ picocli 4.7.6 + + + com.fasterxml.jackson.core + jackson-core + 2.18.1 + + + + com.fasterxml.jackson.core + jackson-databind + 2.18.1 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.18.1 + diff --git a/src/main/java/ua/com/javarush/gnew/m2/repository/ContactDtoRepository.java b/src/main/java/ua/com/javarush/gnew/m2/repository/ContactDtoRepository.java index 0381963..b81e94d 100644 --- a/src/main/java/ua/com/javarush/gnew/m2/repository/ContactDtoRepository.java +++ b/src/main/java/ua/com/javarush/gnew/m2/repository/ContactDtoRepository.java @@ -1,17 +1,66 @@ package ua.com.javarush.gnew.m2.repository; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; +import lombok.SneakyThrows; import ua.com.javarush.gnew.m2.dto.ContactDto; public interface ContactDtoRepository { - List findAll(); + ObjectMapper objectMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT); - Optional findById(long id); + @SneakyThrows + default List findAll() throws IOException { + File file = new File("demo.st"); + if (!file.exists()) { + return new ArrayList<>(); + } - void deleteById(long id); + return objectMapper.readValue( + file, objectMapper.getTypeFactory().constructCollectionType(List.class, ContactDto.class)); + } - void saveAll(List contacts); + @SneakyThrows + default Optional findById(long id) throws IOException { + return findAll().stream().filter(contact -> contact.getId() == id).findFirst(); + } - void save(ContactDto contactDto); + default void deleteById(long id) throws IOException { + Optional contactToDelete = findById(id); + if (contactToDelete.isPresent()) { + List contacts = findAll(); + contacts.remove(contactToDelete.get()); + saveAll(contacts); + } else { + System.out.println("Контакт с id " + id + " не найден."); + } + } + + @SneakyThrows + default void saveAll(List contacts) throws IOException { + objectMapper.writeValue(new File("demo.st"), contacts); + } + ; + + default void save(ContactDto contactDto) throws IOException { + List contacts = findAll(); + contacts.add(contactDto); + saveAll(contacts); + } + + default List findByKeyword(String keyword) throws IOException { + List contacts = findAll(); + return contacts.stream() + .filter( + contact -> + contact.getFullName().contains(keyword) + || contact.getPhones().stream().anyMatch(phones -> phones.contains(keyword)) + || contact.getEmails().stream().anyMatch(emails -> emails.contains(keyword))) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/ua/com/javarush/gnew/m2/service/SimplePhoneBook.java b/src/main/java/ua/com/javarush/gnew/m2/service/SimplePhoneBook.java index eeda8d8..abfdcd4 100644 --- a/src/main/java/ua/com/javarush/gnew/m2/service/SimplePhoneBook.java +++ b/src/main/java/ua/com/javarush/gnew/m2/service/SimplePhoneBook.java @@ -3,17 +3,34 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; +import lombok.SneakyThrows; import ua.com.javarush.gnew.m2.dto.ContactDto; +import ua.com.javarush.gnew.m2.repository.ContactDtoRepository; -public class SimplePhoneBook implements PhoneBookInterface { +public class SimplePhoneBook implements PhoneBookInterface, ContactDtoRepository { @Override public ContactDto add(ContactDto contactDto) { - return contactDto; + + return ContactDto.builder() + .fullName(contactDto.getFullName()) + .phones(List.of(String.valueOf(contactDto.getPhones()))) + .emails(List.of(String.valueOf(contactDto.getEmails()))) + .build(); } + @SneakyThrows @Override public List search(String str) { - return Collections.emptyList(); + + List contacts = findAll(); + return contacts.stream() + .filter( + contact -> + contact.getFullName().contains(str) + || contact.getPhones().stream().anyMatch(phones -> phones.contains(str)) + || contact.getEmails().stream().anyMatch(emails -> emails.contains(str))) + .collect(Collectors.toList()); } @Override