Skip to content

Commit

Permalink
RI-217: rejoint un groupe (#210)
Browse files Browse the repository at this point in the history
  • Loading branch information
mathusha-sdv committed Dec 11, 2021
1 parent 77883d2 commit 065ad7c
Show file tree
Hide file tree
Showing 22 changed files with 203 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

@Component
@AllArgsConstructor
public class SubredditAdapter {
public class GroupAdapter {

protected static final String DEFAULT_GROUP_IMAGE_URI = "assets/img/avatar-ia-group.png";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,10 @@ public ResponseEntity<List<GroupDto>> getAllByTopPosting(@RequestParam int limit
List<GroupDto> groupDtos = groupService.getAllByTopPosting(limit);
return ResponseEntity.ok(groupDtos);
}

@PostMapping(SUBSCRIBE_GROUP)
public ResponseEntity<List<GroupDto>> subscribeGroup(@PathVariable final String groupName) {
final List<GroupDto> groupDtos = groupService.addGroup(groupName);
return ResponseEntity.ok(groupDtos);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.dynonuggets.refonteimplicaction.controller;

import com.dynonuggets.refonteimplicaction.dto.GroupDto;
import com.dynonuggets.refonteimplicaction.dto.UserDto;
import com.dynonuggets.refonteimplicaction.service.AuthService;
import com.dynonuggets.refonteimplicaction.service.GroupService;
import com.dynonuggets.refonteimplicaction.service.RelationService;
import com.dynonuggets.refonteimplicaction.service.UserService;
import lombok.AllArgsConstructor;
Expand All @@ -12,6 +14,8 @@
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

import static com.dynonuggets.refonteimplicaction.utils.ApiUrls.*;

@RestController
Expand All @@ -22,6 +26,7 @@ public class UserController {
private final UserService userService;
private final RelationService relationService;
private final AuthService authService;
private final GroupService groupService;

@GetMapping
public ResponseEntity<Page<UserDto>> getAll(
Expand Down Expand Up @@ -103,4 +108,11 @@ public ResponseEntity<UserDto> updateImageProfile(@RequestParam("file") Multipar
final UserDto userDto = userService.updateImageProfile(file);
return ResponseEntity.ok(userDto);
}

@GetMapping(GET_USER_GROUPS_URI)
public ResponseEntity<List<GroupDto>> getUserGroups(@PathVariable("userId") Long userId) {
final List<GroupDto> groupsDto = userService.getUserGroups(userId);
return ResponseEntity.ok(groupsDto);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import lombok.*;

import java.time.Instant;
import java.util.List;

@Data
@Builder
Expand All @@ -17,4 +18,5 @@ public class GroupDto {
private Integer numberOfPosts;
private String imageUrl;
private Instant createdAt;
private List<UserDto> users;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import java.util.List;
import java.util.Optional;

public interface SubredditRepository extends JpaRepository<Group, Long> {
public interface GroupRepository extends JpaRepository<Group, Long> {
@Query("select s from Group s order by s.posts.size desc")
List<Group> findAllByTopPosting(Pageable pageable);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.dynonuggets.refonteimplicaction.service;

import com.dynonuggets.refonteimplicaction.adapter.SubredditAdapter;
import com.dynonuggets.refonteimplicaction.adapter.GroupAdapter;
import com.dynonuggets.refonteimplicaction.dto.GroupDto;
import com.dynonuggets.refonteimplicaction.exception.NotFoundException;
import com.dynonuggets.refonteimplicaction.model.FileModel;
import com.dynonuggets.refonteimplicaction.model.Group;
import com.dynonuggets.refonteimplicaction.model.User;
import com.dynonuggets.refonteimplicaction.repository.FileRepository;
import com.dynonuggets.refonteimplicaction.repository.SubredditRepository;
import com.dynonuggets.refonteimplicaction.repository.GroupRepository;
import com.dynonuggets.refonteimplicaction.repository.UserRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
Expand All @@ -17,54 +19,67 @@
import java.time.Instant;
import java.util.List;

import static com.dynonuggets.refonteimplicaction.utils.Message.GROUP_NOT_FOUND_MESSAGE;
import static java.util.stream.Collectors.toList;

@Service
@AllArgsConstructor
@Slf4j
public class GroupService {

private final SubredditAdapter subredditAdapter;
private final SubredditRepository subredditRepository;
private final GroupAdapter groupAdapter;
private final GroupRepository groupRepository;
private final AuthService authService;
private final CloudService cloudService;
private final FileRepository fileRepository;
private final UserRepository userRepository;

@Transactional
public GroupDto save(MultipartFile image, GroupDto groupDto) {
final FileModel fileModel = cloudService.uploadImage(image);
final FileModel fileSave = fileRepository.save(fileModel);

Group group = subredditAdapter.toModel(groupDto);
Group group = groupAdapter.toModel(groupDto);
group.setImage(fileSave);
group.setCreatedAt(Instant.now());
group.setUser(authService.getCurrentUser());

final Group save = subredditRepository.save(group);
final Group save = groupRepository.save(group);

return subredditAdapter.toDto(save);
return groupAdapter.toDto(save);
}

@Transactional
public GroupDto save(GroupDto groupDto) {
Group group = subredditAdapter.toModel(groupDto);
Group group = groupAdapter.toModel(groupDto);
group.setCreatedAt(Instant.now());
group.setUser(authService.getCurrentUser());
final Group save = subredditRepository.save(group);
return subredditAdapter.toDto(save);
final Group save = groupRepository.save(group);
return groupAdapter.toDto(save);
}

@Transactional(readOnly = true)
public Page<GroupDto> getAll(Pageable pageable) {
final Page<Group> subreddits = subredditRepository.findAll(pageable);
return subreddits.map(subredditAdapter::toDto);
final Page<Group> subreddits = groupRepository.findAll(pageable);
return subreddits.map(groupAdapter::toDto);
}

@Transactional(readOnly = true)
public List<GroupDto> getAllByTopPosting(int limit) {
final List<Group> topPostings = subredditRepository.findAllByTopPosting(Pageable.ofSize(limit));
final List<Group> topPostings = groupRepository.findAllByTopPosting(Pageable.ofSize(limit));
return topPostings.stream()
.map(subredditAdapter::toDto)
.map(groupAdapter::toDto)
.collect(toList());
}

@Transactional
public List<GroupDto> addGroup(String groupName) {
User user = authService.getCurrentUser();
Group group = groupRepository.findByName(groupName)
.orElseThrow(() -> new NotFoundException(String.format(GROUP_NOT_FOUND_MESSAGE, groupName)));
user.getGroups().add(group);
final User save = userRepository.save(user);
return user.getGroups().stream()
.map(groupAdapter::toDto)
.collect(toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import com.dynonuggets.refonteimplicaction.exception.NotFoundException;
import com.dynonuggets.refonteimplicaction.model.Group;
import com.dynonuggets.refonteimplicaction.model.Post;
import com.dynonuggets.refonteimplicaction.repository.GroupRepository;
import com.dynonuggets.refonteimplicaction.repository.PostRepository;
import com.dynonuggets.refonteimplicaction.repository.SubredditRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
Expand All @@ -26,7 +26,7 @@
public class PostService {

private final PostRepository postRepository;
private final SubredditRepository subredditRepository;
private final GroupRepository groupRepository;
private final AuthService authService;
private final PostAdapter postAdapter;
private final CommentService commentService;
Expand All @@ -38,7 +38,7 @@ public PostResponse saveOrUpdate(PostRequest postRequest) {
throw new IllegalArgumentException(POST_SHOULD_HAVE_A_NAME);
}

Group group = subredditRepository.findById(postRequest.getGroupId())
Group group = groupRepository.findById(postRequest.getGroupId())
.orElseThrow(() -> new NotFoundException(String.format(SUBREDDIT_NOT_FOUND_MESSAGE, postRequest.getGroupId())));

Post post = postAdapter.toPost(postRequest, group, authService.getCurrentUser());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
package com.dynonuggets.refonteimplicaction.service;

import com.dynonuggets.refonteimplicaction.adapter.GroupAdapter;
import com.dynonuggets.refonteimplicaction.adapter.UserAdapter;
import com.dynonuggets.refonteimplicaction.dto.GroupDto;
import com.dynonuggets.refonteimplicaction.dto.RelationTypeEnum;
import com.dynonuggets.refonteimplicaction.dto.UserDto;
import com.dynonuggets.refonteimplicaction.exception.UserNotFoundException;
import com.dynonuggets.refonteimplicaction.model.FileModel;
import com.dynonuggets.refonteimplicaction.model.JobSeeker;
import com.dynonuggets.refonteimplicaction.model.Relation;
import com.dynonuggets.refonteimplicaction.model.User;
import com.dynonuggets.refonteimplicaction.repository.FileRepository;
import com.dynonuggets.refonteimplicaction.repository.JobSeekerRepository;
import com.dynonuggets.refonteimplicaction.repository.RelationRepository;
import com.dynonuggets.refonteimplicaction.repository.UserRepository;
import com.dynonuggets.refonteimplicaction.model.*;
import com.dynonuggets.refonteimplicaction.repository.*;
import com.dynonuggets.refonteimplicaction.utils.Message;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand All @@ -34,6 +31,8 @@ public class UserService {
private final JobSeekerRepository jobSeekerRepository;
private final CloudService cloudService;
private final FileRepository fileRepository;
private final GroupRepository groupRepository;
private GroupAdapter groupAdapter;

/**
* @return la liste paginée de tous les utilisateurs
Expand Down Expand Up @@ -123,4 +122,15 @@ public UserDto updateImageProfile(MultipartFile file) {
final User save = userRepository.save(currentUser);
return userAdapter.toDto(save);
}

@Transactional(readOnly = true)
public List<GroupDto> getUserGroups(Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new UserNotFoundException(Message.USER_NOT_FOUND_MESSAGE));
;
final List<Group> groups = user.getGroups();
return groups.stream()
.map(groupAdapter::toDto)
.collect(toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public class ApiUrls {
public static final String GROUPS_BASE_URI = "/api/groups";
public static final String GET_ALL_BY_TOP_POSTING_URI = "/top-posting";
public static final String CREATE_NO_IMAGE = "/no-image";
public static final String SUBSCRIBE_GROUP = "/{groupName}/subscribe";

// COMMENTS
public static final String COMMENTS_BASE_URI = "/api/comments";
Expand All @@ -46,6 +47,7 @@ public class ApiUrls {
public static final String GET_PENDING_USER_URI = "/pending";
public static final String GET_COMMUNITY_URI = "/community";
public static final String SET_USER_IMAGE = "/image";
public static final String GET_USER_GROUPS_URI = "/{userId}/groups";

// FILES
public static final String FILE_BASE_URI = "/api/files";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ public class Message {
// Jobs messages
public static final String JOB_NOT_FOUND_MESSAGE = "No job found with id [%d]";

// Groups messages
public static final String GROUP_NOT_FOUND_MESSAGE = "No group found with id [%d]";

// Subreddit messages
public static final String SUBREDDIT_NOT_FOUND_MESSAGE = "No subreddit found with id [%s]";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class GroupAdapterTest {
FileService fileService;

@InjectMocks
SubredditAdapter subredditAdapter;
GroupAdapter groupAdapter;

@Test
void should_map_to_model() {
Expand All @@ -37,7 +37,7 @@ void should_map_to_model() {
.build();

// when
final Group actual = subredditAdapter.toModel(expected);
final Group actual = groupAdapter.toModel(expected);

// then
assertThat(actual.getId()).isEqualTo(expected.getId());
Expand All @@ -58,15 +58,15 @@ void should_map_to_dto_with_count_when_model_has_posts() {
.build();

// when
final GroupDto actualDto = subredditAdapter.toDto(expectedModel);
final GroupDto actualDto = groupAdapter.toDto(expectedModel);

// then
assertThat(actualDto).usingRecursiveComparison()
.ignoringFields("user", "posts", "numberOfPosts", "imageUrl")
.isEqualTo(expectedModel);

assertThat(actualDto.getNumberOfPosts()).isEqualTo(expectedModel.getPosts().size());
assertThat(actualDto.getImageUrl()).isEqualTo(SubredditAdapter.DEFAULT_GROUP_IMAGE_URI);
assertThat(actualDto.getImageUrl()).isEqualTo(GroupAdapter.DEFAULT_GROUP_IMAGE_URI);
}

@Test
Expand All @@ -85,7 +85,7 @@ void should_map_to_dto_with_image_url_when_model_has_image() {
given(fileService.buildFileUri(anyString())).willReturn(expectedUrl);

// when
final GroupDto actualDto = subredditAdapter.toDto(expectedModel);
final GroupDto actualDto = groupAdapter.toDto(expectedModel);

// then
assertThat(actualDto).usingRecursiveComparison()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.dynonuggets.refonteimplicaction.controller;

import com.dynonuggets.refonteimplicaction.dto.GroupDto;
import com.dynonuggets.refonteimplicaction.dto.RelationTypeEnum;
import com.dynonuggets.refonteimplicaction.dto.UserDto;
import com.dynonuggets.refonteimplicaction.model.RoleEnum;
import com.dynonuggets.refonteimplicaction.model.User;
import com.dynonuggets.refonteimplicaction.repository.RelationRepository;
import com.dynonuggets.refonteimplicaction.service.AuthService;
import com.dynonuggets.refonteimplicaction.service.GroupService;
import com.dynonuggets.refonteimplicaction.service.RelationService;
import com.dynonuggets.refonteimplicaction.service.UserService;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -40,6 +42,7 @@
class UserControllerTest extends ControllerIntegrationTestBase {

List<UserDto> userDtos;
List<GroupDto> groupDtos;
ArrayList<String> roles = new ArrayList<>();

@MockBean
Expand All @@ -51,6 +54,9 @@ class UserControllerTest extends ControllerIntegrationTestBase {
@MockBean
AuthService authService;

@MockBean
GroupService groupService;

@MockBean
RelationRepository relationRepository;

Expand Down Expand Up @@ -615,4 +621,34 @@ void should_return_forbidden_when_save_user_image_with_no_authentication() throw

verify(userService, never()).updateImageProfile(any());
}

@Test
@WithMockUser
void getAllGroupsByUser() throws Exception {
UserDto user = UserDto.builder().id(1L).build();
ArrayList<UserDto> userList = new ArrayList<>();
userList.add(user);

GroupDto group = GroupDto.builder().id(1L).name("ile-de-france").description("communauté ile de france").numberOfPosts(0).imageUrl("").users(userList).build();

ArrayList<GroupDto> groupList = new ArrayList<>();
groupList.add(group);
given(userService.getUserGroups(anyLong())).willReturn(groupList);

final ResultActions resultActions = mvc.perform(get(USER_BASE_URI + GET_USER_GROUPS_URI, user.getId()).contentType(APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk());

for (int i = 0; i < groupList.size(); i++) {
final String contentPath = String.format("$[%d]", i);

resultActions
.andExpect(jsonPath(contentPath + ".id", is(groupList.get(i).getId().intValue())))
.andExpect(jsonPath(contentPath + ".description", is(groupList.get(i).getDescription())))
.andExpect(jsonPath(contentPath + ".numberOfPosts", is(groupList.get(i).getNumberOfPosts())))
.andExpect(jsonPath(contentPath + ".imageUrl", is(groupList.get(i).getImageUrl())))
.andExpect(jsonPath(contentPath + ".name", is(groupList.get(i).getName())));
}
verify(userService, times(1)).getUserGroups(anyLong());
}
}
Loading

0 comments on commit 065ad7c

Please sign in to comment.