Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: implement feature to Get Members of an Organisation. #703

Open
wants to merge 2 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,18 @@ public ResponseEntity<CreateOrganisationResponseDto> createOrganisation(
);
}

@GetMapping("/{org_id}/users")
public ResponseEntity<?> getOrganisationUsers(@PathVariable(name = "org_id") String orgId,
@RequestParam(name = "page", defaultValue = "0") int page,
@RequestParam(name = "size", defaultValue = "10") int pageSize) {
try {
return ResponseEntity.ok(organisationService.getOrganisationUsers(orgId, page, pageSize));
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
}

@PostMapping("/{organisationId}/users")
public ResponseEntity<?> addUserToOrganisation(
@PathVariable("organisationId") String organisationId,
Expand All @@ -50,4 +62,4 @@ public ResponseEntity<?> getOrganisationById(@PathVariable String organisationId
Organisation organisation = organisationService.getOrganisationById(organisationId);
return ResponseEntity.ok(organisation);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package hng_java_boilerplate.organisation.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;
import lombok.Data;

@Builder
@Data
public class ApiResponseDTO {
@JsonProperty("status_code")
private int statusCode;
private String message;
private Object data;
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
package hng_java_boilerplate.organisation.service;

import hng_java_boilerplate.activitylog.service.ActivityLogService;
import hng_java_boilerplate.organisation.dto.ApiResponseDTO;
import hng_java_boilerplate.exception.NotFoundException;
import hng_java_boilerplate.organisation.dto.CreateOrganisationRequestDto;
import hng_java_boilerplate.organisation.dto.CreateOrganisationResponseDto;
import hng_java_boilerplate.organisation.dto.DataDto;
import hng_java_boilerplate.organisation.entity.Organisation;
import hng_java_boilerplate.organisation.exception.OrganisationNameAlreadyExistsException;
import hng_java_boilerplate.organisation.repository.OrganisationRepository;
import hng_java_boilerplate.user.dto.request.GetUserDto;
import hng_java_boilerplate.user.entity.User;
import hng_java_boilerplate.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;

import java.time.LocalDateTime;
import java.util.List;
Expand Down Expand Up @@ -82,8 +90,41 @@ public CreateOrganisationResponseDto create(
.build();
}

public ResponseEntity<ApiResponseDTO> getOrganisationUsers(String orgId, int page, int pageSize) {
organisationRepository.findById(orgId)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Organisation not found"));

Pageable pageable = PageRequest.of(page, pageSize);
Page<User> users = userRepository.findByOrganisations_Id(orgId, pageable);

if (users.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(ApiResponseDTO.builder()
.statusCode(400)
.message("No users found for organisation with ID: " + orgId)
.data(null)
.build());
}

List<GetUserDto> userDtoList = users.getContent().stream()
.map(user -> GetUserDto.builder()
.id(user.getId())
.name(user.getName())
.email(user.getEmail())
.build())
.toList();

return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponseDTO.builder()
.statusCode(200)
.message("Users retrieved successfully for organisation with ID: " + orgId)
.data(userDtoList)
.build());
}
}

public Organisation getOrganisationById(String organisationId) {
return organisationRepository.findById(organisationId)
.orElseThrow(() -> new NotFoundException("Organization not found"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import hng_java_boilerplate.user.entity.User;
import hng_java_boilerplate.user.enums.Role;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Optional;
Expand All @@ -17,4 +20,6 @@ public interface UserRepository extends JpaRepository<User, String> {
void deleteByEmail(String mail);

List<User> findUserByUserRole(Role role);

Page<User> findByOrganisations_Id( String orgId, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import hng_java_boilerplate.exception.NotFoundException;
import hng_java_boilerplate.activitylog.service.ActivityLogService;
import hng_java_boilerplate.organisation.dto.ApiResponseDTO;
import hng_java_boilerplate.organisation.dto.CreateOrganisationRequestDto;
import hng_java_boilerplate.organisation.dto.CreateOrganisationResponseDto;
import hng_java_boilerplate.organisation.entity.Organisation;
Expand All @@ -10,6 +11,7 @@
import hng_java_boilerplate.organisation.exception.OrganisationNameAlreadyExistsException;
import hng_java_boilerplate.organisation.exception.ValidationError;
import hng_java_boilerplate.organisation.repository.OrganisationRepository;
import hng_java_boilerplate.user.dto.request.GetUserDto;
import hng_java_boilerplate.user.entity.User;
import hng_java_boilerplate.user.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
Expand All @@ -18,6 +20,9 @@
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
Expand Down Expand Up @@ -53,6 +58,8 @@ class OrganisationServiceTest {
private User user;
private Organisation organisation;

private Organisation organisation;

@BeforeEach
void setUp() {
orgRequest = new CreateOrganisationRequestDto(
Expand All @@ -71,6 +78,11 @@ void setUp() {
organisation = new Organisation();
organisation.setId("org-123");
organisation.setName("Test Organisation");

user = new User();
user.setId("user-123");
user.setName("John Doe");
user.setEmail("[email protected]");
organisation.setDescription("A test org");
}

Expand Down Expand Up @@ -137,7 +149,58 @@ void create_shouldThrowValidationException_whenRequestIsInvalid() {
}

@Test
void getOrganisationById_shouldReturnOrganisation_whenOrganisationExists() {
void getOrganisationUsers_shouldReturnNotFound_whenOrganisationDoesNotExist() {
when(organisationRepository.findById("org-123")).thenReturn(Optional.empty());

Exception exception = assertThrows(Exception.class, () ->
organisationService.getOrganisationUsers("org-123", 0, 10)
);

assertEquals("404 NOT_FOUND \"Organisation not found\"", exception.getMessage());
verify(organisationRepository, times(1)).findById("org-123");
}

@Test
void getOrganisationUsers_shouldReturnNotFound_whenNoUsersFound() {
when(organisationRepository.findById("org-123")).thenReturn(Optional.of(organisation));
when(userRepository.findByOrganisations_Id("org-123", PageRequest.of(0, 10)))
.thenReturn(Page.empty());

ResponseEntity<ApiResponseDTO> response = organisationService.getOrganisationUsers("org-123", 0, 10);

assertNotNull(response);
assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
assertEquals(400, response.getBody().getStatusCode());
assertEquals("No users found for organisation with ID: org-123", response.getBody().getMessage());
assertNull(response.getBody().getData());
}

@Test
void getOrganisationUsers_shouldReturnUsers_whenUsersExist() {
when(organisationRepository.findById("org-123")).thenReturn(Optional.of(organisation));
List<User> users = List.of(user);
Page<User> userPage = new PageImpl<>(users);
when(userRepository.findByOrganisations_Id("org-123", PageRequest.of(0, 10)))
.thenReturn(userPage);

ResponseEntity<ApiResponseDTO> response = organisationService.getOrganisationUsers("org-123", 0, 10);

assertNotNull(response);
assertEquals(HttpStatus.OK, response.getStatusCode());
assertEquals(200, response.getBody().getStatusCode());
assertEquals("Users retrieved successfully for organisation with ID: org-123", response.getBody().getMessage());
assertNotNull(response.getBody().getData());

List<GetUserDto> userDtos = (List<GetUserDto>) response.getBody().getData();
assertEquals(1, userDtos.size());
assertEquals("user-123", userDtos.get(0).getId());
assertEquals("John Doe", userDtos.get(0).getName());
assertEquals("[email protected]", userDtos.get(0).getEmail());
}

}

void getOrganisationById_shouldReturnOrganisation_whenOrganisationExists() {
String organisationId = "org-123";
when(organisationRepository.findById(organisationId)).thenReturn(Optional.of(organisation));

Expand Down
Loading