From 3f233aab6c93056375a17255c824e049dfd6ec7d Mon Sep 17 00:00:00 2001 From: ydvorzhetskiy Date: Sat, 12 Oct 2019 09:59:37 +0300 Subject: [PATCH] 2019-08 -13 --- 2019-08/spring-13/pom.xml | 17 +++++ .../spring-13/spring-13-exercise/.gitignore | 4 + 2019-08/spring-13/spring-13-exercise/pom.xml | 50 +++++++++++++ .../src/main/java/ru/otus/spring/Main.java | 28 +++++++ .../java/ru/otus/spring/domain/Email.java | 20 +++++ .../java/ru/otus/spring/domain/Person.java | 37 +++++++++ .../spring/repostory/PersonRepository.java | 11 +++ .../otus/spring/rest/NotFoundException.java | 7 ++ .../ru/otus/spring/rest/PersonController.java | 20 +++++ .../java/ru/otus/spring/rest/PersonDto.java | 54 +++++++++++++ .../spring-13/spring-13-solution/.gitignore | 4 + 2019-08/spring-13/spring-13-solution/pom.xml | 50 +++++++++++++ .../src/main/java/ru/otus/spring/Main.java | 28 +++++++ .../java/ru/otus/spring/domain/Email.java | 20 +++++ .../java/ru/otus/spring/domain/Person.java | 37 +++++++++ .../spring/repostory/PersonRepository.java | 11 +++ .../otus/spring/rest/NotFoundException.java | 7 ++ .../ru/otus/spring/rest/PersonController.java | 75 +++++++++++++++++++ .../java/ru/otus/spring/rest/PersonDto.java | 54 +++++++++++++ 19 files changed, 534 insertions(+) create mode 100644 2019-08/spring-13/pom.xml create mode 100644 2019-08/spring-13/spring-13-exercise/.gitignore create mode 100644 2019-08/spring-13/spring-13-exercise/pom.xml create mode 100644 2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/Main.java create mode 100644 2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/domain/Email.java create mode 100644 2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java create mode 100644 2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java create mode 100644 2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/PersonController.java create mode 100644 2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java create mode 100644 2019-08/spring-13/spring-13-solution/.gitignore create mode 100644 2019-08/spring-13/spring-13-solution/pom.xml create mode 100644 2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/Main.java create mode 100644 2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/domain/Email.java create mode 100644 2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java create mode 100644 2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java create mode 100644 2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/PersonController.java create mode 100644 2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/PersonDto.java diff --git a/2019-08/spring-13/pom.xml b/2019-08/spring-13/pom.xml new file mode 100644 index 00000000..863658e3 --- /dev/null +++ b/2019-08/spring-13/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + ru.otus + spring-13 + 1.0 + + pom + + + spring-13-exercise + spring-13-solution + + diff --git a/2019-08/spring-13/spring-13-exercise/.gitignore b/2019-08/spring-13/spring-13-exercise/.gitignore new file mode 100644 index 00000000..e62c33c2 --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/.gitignore @@ -0,0 +1,4 @@ +.idea/ +*.iml + +target/ diff --git a/2019-08/spring-13/spring-13-exercise/pom.xml b/2019-08/spring-13/spring-13-exercise/pom.xml new file mode 100644 index 00000000..b5faff5e --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + ru.otus + spring-13-exercise + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + + 1.8 + 1.8 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.data + spring-data-keyvalue + 2.0.9.RELEASE + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/Main.java b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..f38e5ae4 --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,28 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@EnableMapRepositories +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @PostConstruct + public void init() { + repository.save(new Person("Pushkin")); + } +} diff --git a/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/domain/Email.java b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/domain/Email.java new file mode 100644 index 00000000..77b6ca94 --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/domain/Email.java @@ -0,0 +1,20 @@ +package ru.otus.spring.domain; + +public class Email { + + private int id; + + private String email; + + public Email(String email) { + this.email = email; + } + + public int getId() { + return id; + } + + public String getEmail() { + return email; + } +} diff --git a/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/domain/Person.java b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..d11ee7bb --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,37 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("person") +public class Person { + + @Id + private int id; + private String name; + + public Person(String name) { + this.name = name; + } + + public Person(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..e81aa243 --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.PagingAndSortingRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends PagingAndSortingRepository { + + List findAll(); +} diff --git a/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java new file mode 100644 index 00000000..3d98ee4a --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.otus.spring.rest; + +public class NotFoundException extends RuntimeException{ + + public NotFoundException() { + } +} diff --git a/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/PersonController.java b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..11720c35 --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,20 @@ +package ru.otus.spring.rest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.stream.Collectors; + +public class PersonController { + + private final PersonRepository repository; + + @Autowired + public PersonController(PersonRepository repository) { + this.repository = repository; + } +} diff --git a/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java new file mode 100644 index 00000000..972de4dc --- /dev/null +++ b/2019-08/spring-13/spring-13-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java @@ -0,0 +1,54 @@ +/* + * Copyright 2016 Russian Post + * + * This source code is Russian Post Confidential Proprietary. + * This software is protected by copyright. All rights and titles are reserved. + * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software. + * Otherwise this violation would be treated by law and would be subject to legal prosecution. + * Legal use of the software provides receipt of a license from the right name only. + */ +package ru.otus.spring.rest; + +import ru.otus.spring.domain.Person; + +/** + * DTO that represents Account + */ +@SuppressWarnings("all") +public class PersonDto { + + private int id = -1; + private String name; + + public PersonDto() { + } + + public PersonDto(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static Person toDomainObject(PersonDto dto) { + return new Person(dto.getId(), dto.getName()); + } + + public static PersonDto toDto(Person account) { + return new PersonDto(account.getId(), account.getName()); + } +} diff --git a/2019-08/spring-13/spring-13-solution/.gitignore b/2019-08/spring-13/spring-13-solution/.gitignore new file mode 100644 index 00000000..e62c33c2 --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/.gitignore @@ -0,0 +1,4 @@ +.idea/ +*.iml + +target/ diff --git a/2019-08/spring-13/spring-13-solution/pom.xml b/2019-08/spring-13/spring-13-solution/pom.xml new file mode 100644 index 00000000..ec011cdf --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + ru.otus + spring-13-solution + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + + 1.8 + 1.8 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.data + spring-data-keyvalue + 2.0.9.RELEASE + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/Main.java b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..f38e5ae4 --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,28 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@EnableMapRepositories +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @PostConstruct + public void init() { + repository.save(new Person("Pushkin")); + } +} diff --git a/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/domain/Email.java b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/domain/Email.java new file mode 100644 index 00000000..77b6ca94 --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/domain/Email.java @@ -0,0 +1,20 @@ +package ru.otus.spring.domain; + +public class Email { + + private int id; + + private String email; + + public Email(String email) { + this.email = email; + } + + public int getId() { + return id; + } + + public String getEmail() { + return email; + } +} diff --git a/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/domain/Person.java b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..d11ee7bb --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,37 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("person") +public class Person { + + @Id + private int id; + private String name; + + public Person(String name) { + this.name = name; + } + + public Person(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..e81aa243 --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.PagingAndSortingRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends PagingAndSortingRepository { + + List findAll(); +} diff --git a/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java new file mode 100644 index 00000000..3d98ee4a --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.otus.spring.rest; + +public class NotFoundException extends RuntimeException{ + + public NotFoundException() { + } +} diff --git a/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/PersonController.java b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..0a7ec47c --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,75 @@ +package ru.otus.spring.rest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +public class PersonController { + + private final PersonRepository repository; + + @Autowired + public PersonController(PersonRepository repository) { + this.repository = repository; + } + + @RequestMapping( + value = "/person", + method = RequestMethod.GET + ) + public List get() { + return repository.findAll().stream() + .map(PersonDto::toDto) + .collect(Collectors.toList()); + } + + @RequestMapping( + value = "/person/{id}", + method = RequestMethod.GET + ) + public PersonDto get( + @PathVariable("id") int id + ) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + return PersonDto.toDto(person); + } + + @RequestMapping( + value = "/person/", + method = RequestMethod.POST + ) + public @ResponseBody + PersonDto create( + @RequestBody PersonDto dto + ) { + Person account = PersonDto.toDomainObject(dto); + Person accountWithId = repository.save(account); + return PersonDto.toDto(accountWithId); + } + + @DeleteMapping("/person/{id}") + public void delete(@PathVariable("id") int id) { + repository.deleteById(id); + } + + @PutMapping("/person/{id}/holder") + public void changeName( + @PathVariable("id") int id, + @RequestParam("name") String name + ) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + person.setName(name); + repository.save(person); + } + + @ExceptionHandler(NotFoundException.class) + public ResponseEntity handleNotEnoughFunds(NotFoundException ex) { + return ResponseEntity.badRequest().body("Not found"); + } +} diff --git a/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/PersonDto.java b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/PersonDto.java new file mode 100644 index 00000000..972de4dc --- /dev/null +++ b/2019-08/spring-13/spring-13-solution/src/main/java/ru/otus/spring/rest/PersonDto.java @@ -0,0 +1,54 @@ +/* + * Copyright 2016 Russian Post + * + * This source code is Russian Post Confidential Proprietary. + * This software is protected by copyright. All rights and titles are reserved. + * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software. + * Otherwise this violation would be treated by law and would be subject to legal prosecution. + * Legal use of the software provides receipt of a license from the right name only. + */ +package ru.otus.spring.rest; + +import ru.otus.spring.domain.Person; + +/** + * DTO that represents Account + */ +@SuppressWarnings("all") +public class PersonDto { + + private int id = -1; + private String name; + + public PersonDto() { + } + + public PersonDto(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static Person toDomainObject(PersonDto dto) { + return new Person(dto.getId(), dto.getName()); + } + + public static PersonDto toDto(Person account) { + return new PersonDto(account.getId(), account.getName()); + } +}