From 4e10256fe5ac4baaca0b01ec276e279b00be7bcf Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Fri, 22 Dec 2023 11:19:05 +0100 Subject: [PATCH] get chat --- .../y/server/controller/ChatController.java | 5 +- .../com/usatiuk/tjv/y/server/dto/ChatTo.java | 5 +- .../y/server/dto/converters/ChatMapper.java | 6 +-- .../com/usatiuk/tjv/y/server/entity/Chat.java | 5 +- .../usatiuk/tjv/y/server/entity/Person.java | 5 +- .../server/controller/ChatControllerTest.java | 53 ++++++++++++++++++- .../y/server/controller/DemoDataDbTest.java | 2 +- 7 files changed, 66 insertions(+), 15 deletions(-) diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/controller/ChatController.java b/server/src/main/java/com/usatiuk/tjv/y/server/controller/ChatController.java index 117275c..b105348 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/controller/ChatController.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/controller/ChatController.java @@ -46,10 +46,11 @@ public class ChatController { return chatMapper.makeDto(chat); } - @PostMapping(path = "/by-id/:id") + @GetMapping(path = "/by-id/{id}") public ChatTo get(Principal principal, @PathVariable Long id) { var chat = chatService.readById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Chat not found")); - if (!chat.getMembers().contains(entityManager.getReference(Person.class, principal.getName()))) + var userRef = entityManager.getReference(Person.class, principal.getName()); + if (!chat.getMembers().contains(userRef)) throw new ResponseStatusException(HttpStatus.FORBIDDEN, "User isn't member of the chat"); return chatMapper.makeDto(chat); } diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/dto/ChatTo.java b/server/src/main/java/com/usatiuk/tjv/y/server/dto/ChatTo.java index 6bb2a1b..6567141 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/dto/ChatTo.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/dto/ChatTo.java @@ -1,5 +1,8 @@ package com.usatiuk.tjv.y.server.dto; -public record ChatTo(Long id, String name, String creatorUuid, PersonTo[] memberUuids, MessageTo[] messages) { +import java.util.Collection; + +public record ChatTo(Long id, String name, String creatorUuid, Collection members, + Collection messages) { } diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/dto/converters/ChatMapper.java b/server/src/main/java/com/usatiuk/tjv/y/server/dto/converters/ChatMapper.java index 7b55865..2422028 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/dto/converters/ChatMapper.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/dto/converters/ChatMapper.java @@ -1,8 +1,6 @@ package com.usatiuk.tjv.y.server.dto.converters; import com.usatiuk.tjv.y.server.dto.ChatTo; -import com.usatiuk.tjv.y.server.dto.MessageTo; -import com.usatiuk.tjv.y.server.dto.PersonTo; import com.usatiuk.tjv.y.server.entity.Chat; import org.springframework.stereotype.Component; @@ -19,7 +17,7 @@ public class ChatMapper { public ChatTo makeDto(Chat chat) { return new ChatTo(chat.getId(), chat.getName(), chat.getCreator().getUuid(), - chat.getMembers().stream().map(personMapper::makeDto).toArray(PersonTo[]::new), - chat.getMessages().stream().map(messageMapper::makeDto).toArray(MessageTo[]::new)); + chat.getMembers().stream().map(personMapper::makeDto).toList(), + chat.getMessages().stream().map(messageMapper::makeDto).toList()); } } diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/entity/Chat.java b/server/src/main/java/com/usatiuk/tjv/y/server/entity/Chat.java index e44ab61..d6b91f8 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/entity/Chat.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/entity/Chat.java @@ -28,7 +28,10 @@ public class Chat implements EntityWithId { @OneToMany(mappedBy = "chat") private Collection messages = new ArrayList<>(); - @ManyToMany(mappedBy = "chats") + @ManyToMany + @JoinTable(name = "chat_person", + joinColumns = @JoinColumn(name = "chat"), + inverseJoinColumns = @JoinColumn(name = "person")) private Collection members = new ArrayList<>(); @ManyToOne diff --git a/server/src/main/java/com/usatiuk/tjv/y/server/entity/Person.java b/server/src/main/java/com/usatiuk/tjv/y/server/entity/Person.java index 363f1af..bffe62a 100644 --- a/server/src/main/java/com/usatiuk/tjv/y/server/entity/Person.java +++ b/server/src/main/java/com/usatiuk/tjv/y/server/entity/Person.java @@ -52,10 +52,7 @@ public class Person implements EntityWithId { @ManyToMany(mappedBy = "following") private Collection followers; - @ManyToMany - @JoinTable(name = "person_chat", - joinColumns = @JoinColumn(name = "person"), - inverseJoinColumns = @JoinColumn(name = "chat")) + @ManyToMany(mappedBy = "members") private Collection chats; @Override diff --git a/server/src/test/java/com/usatiuk/tjv/y/server/controller/ChatControllerTest.java b/server/src/test/java/com/usatiuk/tjv/y/server/controller/ChatControllerTest.java index 0e17d2d..198a2b0 100644 --- a/server/src/test/java/com/usatiuk/tjv/y/server/controller/ChatControllerTest.java +++ b/server/src/test/java/com/usatiuk/tjv/y/server/controller/ChatControllerTest.java @@ -2,6 +2,9 @@ package com.usatiuk.tjv.y.server.controller; import com.usatiuk.tjv.y.server.dto.ChatCreateTo; import com.usatiuk.tjv.y.server.dto.ChatTo; +import com.usatiuk.tjv.y.server.dto.ErrorTo; +import com.usatiuk.tjv.y.server.dto.TokenResponseTo; +import com.usatiuk.tjv.y.server.dto.converters.ChatMapper; import com.usatiuk.tjv.y.server.dto.converters.PersonMapper; import com.usatiuk.tjv.y.server.repository.ChatRepository; import org.junit.jupiter.api.Assertions; @@ -11,7 +14,6 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; -import java.util.Arrays; import java.util.stream.Stream; public class ChatControllerTest extends DemoDataDbTest { @@ -19,6 +21,8 @@ public class ChatControllerTest extends DemoDataDbTest { @Autowired private PersonMapper personMapper; @Autowired + private ChatMapper chatMapper; + @Autowired private ChatRepository chatRepository; @Test @@ -35,7 +39,52 @@ public class ChatControllerTest extends DemoDataDbTest { Assertions.assertEquals("chatnew", toResponse.name()); Assertions.assertEquals(person1.getUuid(), toResponse.creatorUuid()); - Assertions.assertIterableEquals(Stream.of(person1, person2).map(personMapper::makeDto).toList(), Arrays.asList(toResponse.memberUuids())); + Assertions.assertIterableEquals(Stream.of(person1, person2).map(personMapper::makeDto).toList(), toResponse.members()); Assertions.assertTrue(chatRepository.findByName("chatnew").isPresent()); } + + @Test + void shouldGetChat() { + for (TokenResponseTo t : new TokenResponseTo[]{person1Auth, person2Auth}) { + var response = restTemplate.exchange(addr + "/chat/by-id/" + chat1.getId(), HttpMethod.GET, + new HttpEntity<>(createAuthHeaders(t)), + ChatTo.class); + + Assertions.assertNotNull(response); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + + var toResponse = response.getBody(); + Assertions.assertNotNull(toResponse); + + Assertions.assertEquals(chatMapper.makeDto(chat1), toResponse); + } + } + + @Test + void shouldNotChatUnauthorized() { + var response = restTemplate.exchange(addr + "/chat/by-id/" + chat1.getId(), HttpMethod.GET, + new HttpEntity<>(createAuthHeaders(person3Auth)), + ErrorTo.class); + + Assertions.assertNotNull(response); + Assertions.assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode()); + + var toResponse = response.getBody(); + Assertions.assertNotNull(toResponse); + + Assertions.assertEquals(HttpStatus.FORBIDDEN.value(), toResponse.code()); + + response = restTemplate.exchange(addr + "/chat/by-id/" + chat1.getId(), HttpMethod.GET, + HttpEntity.EMPTY, + ErrorTo.class); + + Assertions.assertNotNull(response); + Assertions.assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode()); + + toResponse = response.getBody(); + Assertions.assertNotNull(toResponse); + + Assertions.assertEquals(HttpStatus.UNAUTHORIZED.value(), toResponse.code()); + } + } 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 408e061..3483f93 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 @@ -107,7 +107,7 @@ public abstract class DemoDataDbTest { @AfterEach void erase() { assert !TestTransaction.isActive(); - JdbcTestUtils.deleteFromTables(jdbcTemplate, "person_follows", "person_chat", "post", "chat", "message", "person"); + JdbcTestUtils.deleteFromTables(jdbcTemplate, "person_follows", "chat_person", "post", "chat", "message", "person"); } }