From d18b7f2b3e3012eeea9dd9cf9595cce0a201e7df Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Fri, 15 Dec 2023 18:08:04 +0100 Subject: [PATCH] readbyfollowees --- .../y/server/controller/PersonController.java | 4 +-- .../y/server/controller/PostController.java | 5 +++ .../y/server/repository/PostRepository.java | 6 +++- .../tjv/y/server/service/PostService.java | 2 ++ .../tjv/y/server/service/PostServiceImpl.java | 5 +++ .../y/server/controller/DemoDataDbTest.java | 4 +-- .../controller/PersonControllerTest.java | 31 +++++++++++++++++-- .../server/controller/PostControllerTest.java | 13 ++++++++ 8 files changed, 62 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/controller/PersonController.java b/server/src/main/java/com/usatiuk/tjv/y/server/controller/PersonController.java index 4d8de4c..84f70ef 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/controller/PersonController.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/controller/PersonController.java @@ -7,10 +7,8 @@ import com.usatiuk.tjv.y.server.entity.Person; import com.usatiuk.tjv.y.server.service.PersonService; import com.usatiuk.tjv.y.server.service.exceptions.UserAlreadyExistsException; import com.usatiuk.tjv.y.server.service.exceptions.UserNotFoundException; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; -import org.springframework.web.server.ResponseStatusException; import java.security.Principal; import java.util.Optional; @@ -41,7 +39,7 @@ public class PersonController { public PersonTo get(@PathVariable String username) throws UserNotFoundException { Optional found = personService.readByUsername(username); - if (found.isEmpty()) throw new ResponseStatusException(HttpStatus.NOT_FOUND); + if (found.isEmpty()) throw new UserNotFoundException(); return PersonMapper.makeDto(found.get()); } diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/controller/PostController.java b/server/src/main/java/com/usatiuk/tjv/y/server/controller/PostController.java index 38d610b..c27a591 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/controller/PostController.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/controller/PostController.java @@ -43,6 +43,11 @@ public class PostController { throw new ResponseStatusException(HttpStatus.BAD_REQUEST); } + @GetMapping(path = "/following") + public Stream readAllByFollowees(Principal principal) { + return postService.readByPersonFollowees(principal.getName()).stream().map(PostMapper::makeDto); + } + @GetMapping(path = "/{id}") public PostTo get(@PathVariable long id) { var post = postService.readById(id); diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/repository/PostRepository.java b/server/src/main/java/com/usatiuk/tjv/y/server/repository/PostRepository.java index eb70d02..a6fa220 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/repository/PostRepository.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/repository/PostRepository.java @@ -3,6 +3,7 @@ package com.usatiuk.tjv.y.server.repository; import com.usatiuk.tjv.y.server.entity.Post; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; @@ -11,5 +12,8 @@ import java.util.Collection; public interface PostRepository extends PagingAndSortingRepository, CrudRepository { Collection findByAuthorUuid(String authorUuid); - Page findByAuthorUuid(String authorUuid, Pageable pageable); + @Query(value = "SELECT p FROM Post p " + + "WHERE EXISTS " + + "(SELECT u FROM Person u LEFT JOIN u.following f where u.uuid = :personUuid and f.uuid = p.author.uuid)") + Collection findByPersonFollowees(String personUuid); } diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/service/PostService.java b/server/src/main/java/com/usatiuk/tjv/y/server/service/PostService.java index 2e126c6..93d76db 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/service/PostService.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/service/PostService.java @@ -6,4 +6,6 @@ import java.util.Collection; public interface PostService extends CrudService { Collection readByAuthorId(String authorUuid); + + Collection readByPersonFollowees(String personUuid); } diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/service/PostServiceImpl.java b/server/src/main/java/com/usatiuk/tjv/y/server/service/PostServiceImpl.java index f75d4b5..cc89371 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/service/PostServiceImpl.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/service/PostServiceImpl.java @@ -24,4 +24,9 @@ public class PostServiceImpl extends CrudServiceImpl implements Post public Collection readByAuthorId(String authorId) { return postRepository.findByAuthorUuid(authorId); } + + @Override + public Collection readByPersonFollowees(String personUuid) { + return postRepository.findByPersonFollowees(personUuid); + } } diff --git a/server/src/test/java/com/usatiuk/tjv/y/server/controller/DemoDataDbTest.java b/server/src/test/java/com/usatiuk/tjv/y/server/controller/DemoDataDbTest.java index 22fd717..438cb2a 100644 --- a/server/src/test/java/com/usatiuk/tjv/y/server/controller/DemoDataDbTest.java +++ b/server/src/test/java/com/usatiuk/tjv/y/server/controller/DemoDataDbTest.java @@ -72,14 +72,14 @@ public abstract class DemoDataDbTest { new Person() .setUsername("person2") .setFullName("Person 2") - .setPassword(passwordEncoder.encode(person2Password))); + .setPassword(passwordEncoder.encode(person2Password)).setFollowing(List.of(person1))); person2Auth = new TokenResponse(tokenService.generateToken(person2.getUuid())); person3 = personRepository.save( new Person() .setUsername("person3") .setFullName("Person 3") .setPassword(passwordEncoder.encode(person3Password)) - .setFollowing(List.of(person2))); + .setFollowing(List.of(person2, person1))); person3Auth = new TokenResponse(tokenService.generateToken(person3.getUuid())); post1 = postRepository.save(new Post().setAuthor(person1).setText("post 1")); diff --git a/server/src/test/java/com/usatiuk/tjv/y/server/controller/PersonControllerTest.java b/server/src/test/java/com/usatiuk/tjv/y/server/controller/PersonControllerTest.java index 85bd54a..fc5a7f4 100644 --- a/server/src/test/java/com/usatiuk/tjv/y/server/controller/PersonControllerTest.java +++ b/server/src/test/java/com/usatiuk/tjv/y/server/controller/PersonControllerTest.java @@ -2,6 +2,7 @@ package com.usatiuk.tjv.y.server.controller; import com.usatiuk.tjv.y.server.dto.PersonSignupRequest; import com.usatiuk.tjv.y.server.dto.PersonTo; +import com.usatiuk.tjv.y.server.dto.converters.PersonMapper; import com.usatiuk.tjv.y.server.repository.PersonRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -10,6 +11,9 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import java.util.Arrays; +import java.util.List; + public class PersonControllerTest extends DemoDataDbTest { @Autowired private PersonRepository personRepository; @@ -59,12 +63,24 @@ public class PersonControllerTest extends DemoDataDbTest { Assertions.assertEquals(1, personToResponse.length); Assertions.assertEquals(personToResponse[0].fullName(), person3.getFullName()); + + response = restTemplate.exchange(addr + "/person/followers", + HttpMethod.GET, new HttpEntity<>(createAuthHeaders(person1Auth)), PersonTo[].class); + + Assertions.assertNotNull(response); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + + personToResponse = response.getBody(); + Assertions.assertNotNull(personToResponse); + + Assertions.assertEquals(2, personToResponse.length); + Assertions.assertIterableEquals(Arrays.asList(personToResponse), List.of(PersonMapper.makeDto(person2), PersonMapper.makeDto(person3))); } @Test void shouldGetFollowees() { var response = restTemplate.exchange(addr + "/person/following", - HttpMethod.GET, new HttpEntity<>(createAuthHeaders(person3Auth)), PersonTo[].class); + HttpMethod.GET, new HttpEntity<>(createAuthHeaders(person2Auth)), PersonTo[].class); Assertions.assertNotNull(response); Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); @@ -73,8 +89,19 @@ public class PersonControllerTest extends DemoDataDbTest { Assertions.assertNotNull(personToResponse); Assertions.assertEquals(1, personToResponse.length); - Assertions.assertEquals(personToResponse[0].fullName(), person2.getFullName()); + Assertions.assertEquals(personToResponse[0].fullName(), person1.getFullName()); + response = restTemplate.exchange(addr + "/person/following", + HttpMethod.GET, new HttpEntity<>(createAuthHeaders(person3Auth)), PersonTo[].class); + + Assertions.assertNotNull(response); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + + personToResponse = response.getBody(); + Assertions.assertNotNull(personToResponse); + + Assertions.assertEquals(2, personToResponse.length); + Assertions.assertIterableEquals(Arrays.asList(personToResponse), List.of(PersonMapper.makeDto(person2), PersonMapper.makeDto(person1))); } } diff --git a/server/src/test/java/com/usatiuk/tjv/y/server/controller/PostControllerTest.java b/server/src/test/java/com/usatiuk/tjv/y/server/controller/PostControllerTest.java index 86d961d..7eeae16 100644 --- a/server/src/test/java/com/usatiuk/tjv/y/server/controller/PostControllerTest.java +++ b/server/src/test/java/com/usatiuk/tjv/y/server/controller/PostControllerTest.java @@ -12,6 +12,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import java.util.Arrays; +import java.util.List; public class PostControllerTest extends DemoDataDbTest { @Autowired @@ -72,4 +73,16 @@ public class PostControllerTest extends DemoDataDbTest { Assertions.assertIterableEquals(Arrays.asList(parsedResponse), repoResponse.stream().map(PostMapper::makeDto).toList()); } + @Test + void shouldGetPostsByFollowees() { + var response = restTemplate.exchange(addr + "/post/following", + HttpMethod.GET, new HttpEntity<>(createAuthHeaders(person3Auth)), PostTo[].class); + + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + var parsedResponse = response.getBody(); + + Assertions.assertNotNull(parsedResponse); + Assertions.assertEquals(2, parsedResponse.length); + Assertions.assertIterableEquals(Arrays.asList(parsedResponse), List.of(PostMapper.makeDto(post1), PostMapper.makeDto(post2))); + } }