From dbcc53c20c0c6dff06facaa74c917e143a1caa07 Mon Sep 17 00:00:00 2001 From: Daniel Fiala Date: Sun, 11 Aug 2024 23:32:03 +0200 Subject: [PATCH] feat(admin): added listing users for admins --- .../web/resource/AdminUsersResource.java | 10 ++++++++- .../zenei/domain/feature/ListUsers.java | 9 ++++++++ .../domain/feature/impl/ListUsersImpl.java | 21 +++++++++++++++++++ .../domain/model/user/UserRepository.java | 3 +++ .../panache/UserRepositoryPanache.java | 8 +++++++ 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dev/cloudeko/zenei/domain/feature/ListUsers.java create mode 100644 src/main/java/dev/cloudeko/zenei/domain/feature/impl/ListUsersImpl.java diff --git a/src/main/java/dev/cloudeko/zenei/application/web/resource/AdminUsersResource.java b/src/main/java/dev/cloudeko/zenei/application/web/resource/AdminUsersResource.java index 9dfdc2f..9788110 100644 --- a/src/main/java/dev/cloudeko/zenei/application/web/resource/AdminUsersResource.java +++ b/src/main/java/dev/cloudeko/zenei/application/web/resource/AdminUsersResource.java @@ -1,5 +1,7 @@ package dev.cloudeko.zenei.application.web.resource; +import dev.cloudeko.zenei.application.web.model.response.PrivateUserResponse; +import dev.cloudeko.zenei.domain.feature.ListUsers; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; @@ -10,6 +12,7 @@ import org.eclipse.microprofile.openapi.annotations.tags.Tag; import javax.annotation.security.RolesAllowed; +import java.util.stream.Collectors; @AllArgsConstructor @RolesAllowed("admin") @@ -17,9 +20,14 @@ @Tag(name = "Admin Users Service", description = "API for managing users") public class AdminUsersResource { + private final ListUsers listUsers; + @GET @Produces(MediaType.APPLICATION_JSON) public Response getUsers(@QueryParam("page") Integer page, @QueryParam("size") Integer size) { - return Response.ok().build(); + final var users = listUsers.listUsers(page, size); + final var usersResponse = users.stream().map(PrivateUserResponse::new).toList(); + + return Response.ok(usersResponse).build(); } } diff --git a/src/main/java/dev/cloudeko/zenei/domain/feature/ListUsers.java b/src/main/java/dev/cloudeko/zenei/domain/feature/ListUsers.java new file mode 100644 index 0000000..6995df6 --- /dev/null +++ b/src/main/java/dev/cloudeko/zenei/domain/feature/ListUsers.java @@ -0,0 +1,9 @@ +package dev.cloudeko.zenei.domain.feature; + +import dev.cloudeko.zenei.domain.model.user.User; + +import java.util.List; + +public interface ListUsers { + List listUsers(int offset, int limit); +} diff --git a/src/main/java/dev/cloudeko/zenei/domain/feature/impl/ListUsersImpl.java b/src/main/java/dev/cloudeko/zenei/domain/feature/impl/ListUsersImpl.java new file mode 100644 index 0000000..646edc4 --- /dev/null +++ b/src/main/java/dev/cloudeko/zenei/domain/feature/impl/ListUsersImpl.java @@ -0,0 +1,21 @@ +package dev.cloudeko.zenei.domain.feature.impl; + +import dev.cloudeko.zenei.domain.feature.ListUsers; +import dev.cloudeko.zenei.domain.model.user.User; +import dev.cloudeko.zenei.domain.model.user.UserRepository; +import jakarta.enterprise.context.ApplicationScoped; +import lombok.AllArgsConstructor; + +import java.util.List; + +@ApplicationScoped +@AllArgsConstructor +public class ListUsersImpl implements ListUsers { + + private final UserRepository userRepository; + + @Override + public List listUsers(int offset, int limit) { + return userRepository.listUsers(offset, limit); + } +} diff --git a/src/main/java/dev/cloudeko/zenei/domain/model/user/UserRepository.java b/src/main/java/dev/cloudeko/zenei/domain/model/user/UserRepository.java index ff7974c..46de351 100644 --- a/src/main/java/dev/cloudeko/zenei/domain/model/user/UserRepository.java +++ b/src/main/java/dev/cloudeko/zenei/domain/model/user/UserRepository.java @@ -1,5 +1,6 @@ package dev.cloudeko.zenei.domain.model.user; +import java.util.List; import java.util.Optional; public interface UserRepository { @@ -15,4 +16,6 @@ public interface UserRepository { Optional getUserByEmail(String email); Optional getUserByUsername(String username); + + List listUsers(int offset, int limit); } diff --git a/src/main/java/dev/cloudeko/zenei/infrastructure/repository/hibernate/panache/UserRepositoryPanache.java b/src/main/java/dev/cloudeko/zenei/infrastructure/repository/hibernate/panache/UserRepositoryPanache.java index a9abd6e..3b08444 100644 --- a/src/main/java/dev/cloudeko/zenei/infrastructure/repository/hibernate/panache/UserRepositoryPanache.java +++ b/src/main/java/dev/cloudeko/zenei/infrastructure/repository/hibernate/panache/UserRepositoryPanache.java @@ -7,6 +7,7 @@ import jakarta.enterprise.context.ApplicationScoped; import lombok.AllArgsConstructor; +import java.util.List; import java.util.Optional; @ApplicationScoped @@ -60,4 +61,11 @@ public Optional getUserByUsername(String username) { return Optional.of(userMapper.toDomain(userEntity)); } + + @Override + public List listUsers(int offset, int limit) { + return findAll().page(offset, limit).list().stream() + .map(userMapper::toDomain) + .toList(); + } }