Skip to content
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 @@ -9,15 +9,12 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/organisations")
@Tag(name="Organisation")
@Tag(name = "Organisation")
public class OrganisationController {
private final OrganisationService organisationService;

Expand All @@ -30,4 +27,15 @@ public ResponseEntity<CreateOrganisationResponseDto> createOrganisation(
organisationService.create(orgRequest, activeUser)
);
}

@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());
}
}
}
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,18 +1,26 @@
package hng_java_boilerplate.organisation.service;

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.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 @@ -80,4 +88,36 @@ public CreateOrganisationResponseDto create(
.status_code(201)
.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());
}
}
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
@@ -1,6 +1,7 @@
package hng_java_boilerplate.organisation.service;

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 @@ -9,6 +10,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 @@ -17,6 +19,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 @@ -52,6 +57,8 @@ class OrganisationServiceTest {
private CreateOrganisationRequestDto orgRequest;
private User user;

private Organisation organisation;

@BeforeEach
void setUp() {
orgRequest = new CreateOrganisationRequestDto(
Expand All @@ -66,6 +73,15 @@ void setUp() {
);
user = new User();
user.setId("user-123");

organisation = new Organisation();
organisation.setId("org-123");
organisation.setName("Test Organisation");

user = new User();
user.setId("user-123");
user.setName("John Doe");
user.setEmail("john.doe@example.com");
}

@Test
Expand Down Expand Up @@ -130,4 +146,54 @@ void create_shouldThrowValidationException_whenRequestIsInvalid() {
assertEquals("Name must not be empty", errors.get(0).message());
}

@Test
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("john.doe@example.com", userDtos.get(0).getEmail());
}

}