feat(user): implementada paginación y ordenación en la función readAll

parent bc5f730a
package com.example.apprecetas.user.application; package com.example.apprecetas.user.application;
import com.example.apprecetas.user.domain.entity.User; import com.example.apprecetas.user.domain.entity.User;
import org.springframework.data.domain.Page;
import java.util.List; import org.springframework.data.domain.Pageable;
public interface ReadUserUseCase { public interface ReadUserUseCase {
...@@ -10,6 +10,6 @@ public interface ReadUserUseCase { ...@@ -10,6 +10,6 @@ public interface ReadUserUseCase {
User readByEmail(String email); User readByEmail(String email);
List<User> readAll(); Page<User> readAll(Pageable pageable);
} }
...@@ -8,10 +8,10 @@ import com.example.apprecetas.user.infrastructure.mapper.UserMapper; ...@@ -8,10 +8,10 @@ import com.example.apprecetas.user.infrastructure.mapper.UserMapper;
import com.example.apprecetas.user.infrastructure.repository.mongodb.UserDocument; import com.example.apprecetas.user.infrastructure.repository.mongodb.UserDocument;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class ReadUserUseCaseImpl implements ReadUserUseCase { public class ReadUserUseCaseImpl implements ReadUserUseCase {
...@@ -34,9 +34,8 @@ public class ReadUserUseCaseImpl implements ReadUserUseCase { ...@@ -34,9 +34,8 @@ public class ReadUserUseCaseImpl implements ReadUserUseCase {
} }
@Override @Override
public List<User> readAll() { public Page<User> readAll(Pageable pageable) {
return repository.readAll().stream() return repository.readAll(pageable)
.map(mapper::mapDocument) .map(mapper::mapDocument);
.toList();
} }
} }
package com.example.apprecetas.user.domain.repository; package com.example.apprecetas.user.domain.repository;
import com.example.apprecetas.user.infrastructure.repository.mongodb.UserDocument; import com.example.apprecetas.user.infrastructure.repository.mongodb.UserDocument;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Optional; import java.util.Optional;
public interface ReadUserRepository { public interface ReadUserRepository {
...@@ -11,6 +12,6 @@ public interface ReadUserRepository { ...@@ -11,6 +12,6 @@ public interface ReadUserRepository {
Optional<UserDocument> readByEmail(String email); Optional<UserDocument> readByEmail(String email);
List<UserDocument> readAll(); Page<UserDocument> readAll(Pageable pageable);
} }
package com.example.apprecetas.user.infrastructure.controller; package com.example.apprecetas.user.infrastructure.controller;
import com.example.apprecetas.user.application.ReadUserUseCase; import com.example.apprecetas.user.application.ReadUserUseCase;
import com.example.apprecetas.user.infrastructure.controller.dto.UserOutputDto; import com.example.apprecetas.user.infrastructure.controller.dto.output.UserOutputDto;
import com.example.apprecetas.user.infrastructure.mapper.UserMapper; import com.example.apprecetas.user.infrastructure.mapper.UserMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController @RestController
@RequestMapping("/user") @RequestMapping("/user")
@RequiredArgsConstructor @RequiredArgsConstructor
...@@ -29,13 +32,25 @@ public class ReadUserController { ...@@ -29,13 +32,25 @@ public class ReadUserController {
} }
@GetMapping @GetMapping
public ResponseEntity<List<UserOutputDto>> readAll() { public ResponseEntity<Page<UserOutputDto>> readAll(@RequestParam(required = false, defaultValue = "0") int page,
if (service.readAll().isEmpty()) @RequestParam(required = false, defaultValue = "5") int size,
return ResponseEntity.noContent().build(); @RequestParam(required = false) String sortBy,
return ResponseEntity.ok().body(service.readAll().stream() @RequestParam(required = false, defaultValue = "ASC") String sortDirection) {
.map(mapper::map) // Si no se proporciona un campo para ordenar, solo la paginación
.toList() if (sortBy == null || sortBy.isEmpty()) {
); Pageable pageable = PageRequest.of(page, size);
Page<UserOutputDto> dtoPage = service.readAll(pageable).map(mapper::map);
return ResponseEntity.ok().body(dtoPage);
}
// Crea la dirección de ordenación a partir del parámetro
Sort.Direction direction = Sort.Direction.fromString(sortDirection);
// Crea el objeto de paginación y ordenación
Pageable pageable = PageRequest.of(page, size, Sort.by(direction, sortBy));
Page<UserOutputDto> dtoPage = service.readAll(pageable).map(mapper::map);
return ResponseEntity.ok().body(dtoPage);
} }
} }
...@@ -4,9 +4,10 @@ import com.example.apprecetas.user.domain.repository.ReadUserRepository; ...@@ -4,9 +4,10 @@ import com.example.apprecetas.user.domain.repository.ReadUserRepository;
import com.example.apprecetas.user.infrastructure.repository.mongodb.UserDocument; import com.example.apprecetas.user.infrastructure.repository.mongodb.UserDocument;
import com.example.apprecetas.user.infrastructure.repository.mongodb.UserRepository; import com.example.apprecetas.user.infrastructure.repository.mongodb.UserRepository;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional; import java.util.Optional;
@Repository @Repository
...@@ -26,7 +27,7 @@ public class ReadUserRepositoryImpl implements ReadUserRepository { ...@@ -26,7 +27,7 @@ public class ReadUserRepositoryImpl implements ReadUserRepository {
} }
@Override @Override
public List<UserDocument> readAll() { public Page<UserDocument> readAll(Pageable pageable) {
return userRepository.findAll(); return userRepository.findAll(pageable);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment