Skip to content

Commit 26b9021

Browse files
committed
feat: Criar filtro de pesquisa para as chamas GET (getAll) e ordenação
por campo (#11).
1 parent 874b25c commit 26b9021

File tree

8 files changed

+153
-17
lines changed

8 files changed

+153
-17
lines changed

src/main/java/br/com/virtuallibrary/commons/services/IBaseService.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import javax.validation.ValidationException;
99

1010
import org.springframework.data.domain.Page;
11+
import org.springframework.data.mongodb.core.MongoTemplate;
12+
import org.springframework.data.mongodb.core.query.Criteria;
13+
import org.springframework.data.mongodb.core.query.Query;
1114
import org.springframework.security.core.userdetails.UserDetails;
1215

1316
import br.com.virtuallibrary.commons.entities.BaseEntity;
@@ -17,6 +20,21 @@ public interface IBaseService<E extends BaseEntity, ID extends Serializable, R e
1720

1821
List<E> findAll();
1922

23+
/**
24+
* and – operador lógico AND
25+
* or – operador lógico OR
26+
* not – operador lógico NOT
27+
* gt = maior que
28+
* lt = menor que
29+
* gte = maior ou igual
30+
* lte = menor ou igual
31+
* ne = diferente de
32+
* in = todos os documentos cujo atributo possui um dos valores especificados (no SQL operador IN)
33+
* nin = todos os documentos cujo atributo não possui um dos valores especificados (no SQL operador NOT IN)
34+
* @param page A página a ser pesquisada.
35+
* @param size A quantidade de registro por página.
36+
* @return O resultado paginado.
37+
*/
2038
Page<E> findPaginated(int page, int size);
2139

2240
Optional<E> findById(ID id);
@@ -31,4 +49,10 @@ public interface IBaseService<E extends BaseEntity, ID extends Serializable, R e
3149

3250
UserDetails getUser();
3351

52+
MongoTemplate getTemplate();
53+
54+
Criteria getCriteriaByFilter(Query query, String filter, Object value);
55+
56+
Page<E> findAll(Query query, int page, int size);
57+
3458
}

src/main/java/br/com/virtuallibrary/commons/services/impl/BaseServiceImpl.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@
1616
import org.springframework.beans.BeanUtils;
1717
import org.springframework.beans.BeanWrapper;
1818
import org.springframework.beans.BeanWrapperImpl;
19+
import org.springframework.beans.factory.annotation.Autowired;
1920
import org.springframework.data.domain.Page;
2021
import org.springframework.data.domain.PageRequest;
2122
import org.springframework.data.domain.Pageable;
23+
import org.springframework.data.mongodb.core.MongoTemplate;
24+
import org.springframework.data.mongodb.core.query.Criteria;
25+
import org.springframework.data.mongodb.core.query.Query;
26+
import org.springframework.data.repository.support.PageableExecutionUtils;
2227
import org.springframework.security.core.Authentication;
2328
import org.springframework.security.core.context.SecurityContextHolder;
2429
import org.springframework.security.core.userdetails.User;
@@ -41,6 +46,9 @@ public class BaseServiceImpl<E extends BaseEntity, ID extends Serializable, R ex
4146
private final String ANONYMOUS = "Anonymous";
4247
private final R repository;
4348
private final Class<E> entityClass;
49+
50+
@Autowired
51+
private MongoTemplate mongoTemplate;
4452

4553
@Override
4654
public UserDetails getUser() {
@@ -64,6 +72,20 @@ protected R getRepository() {
6472
protected Class<E> getEntityClass() {
6573
return entityClass;
6674
}
75+
76+
@Override
77+
public MongoTemplate getTemplate() {
78+
return mongoTemplate;
79+
}
80+
81+
@Override
82+
public Page<E> findAll(Query query, final int page, final int size) {
83+
if (query == null) {
84+
query = new Query();
85+
}
86+
List<E> results = getTemplate().find(query, getEntityClass());
87+
return getPage(results, PageRequest.of(page, size), query);
88+
}
6789

6890
@Override
6991
public List<E> findAll() {
@@ -189,5 +211,25 @@ private void checkAuditedEntity(E entity) {
189211
}
190212
}
191213
}
192-
214+
215+
public Page<E> getPage(List<E> results, Pageable pageable, Query query) {
216+
query.with(pageable);
217+
return PageableExecutionUtils.getPage(results, pageable, () -> getTemplate().count(query, entityClass));
218+
}
219+
220+
@Override
221+
public Criteria getCriteriaByFilter(final Query query, final String filter, final Object value) {
222+
if (filter.equalsIgnoreCase("gt")) {
223+
return new Criteria("stars").gt(value);
224+
} else if (filter.equalsIgnoreCase("lt")) {
225+
return new Criteria("stars").lt(value);
226+
} else if (filter.equalsIgnoreCase("gte")) {
227+
return new Criteria("stars").gte(value);
228+
} else if (filter.equalsIgnoreCase("lte")) {
229+
return new Criteria("stars").lte(value);
230+
} else {
231+
throw new IllegalArgumentException(String.format("Não foi possível usar o filtro %s.", filter));
232+
}
233+
}
234+
193235
}

src/main/java/br/com/virtuallibrary/rest/controllers/impl/BookController.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,33 @@ public BookController(BookService service, BookModelAssembler modelAssembler) {
4848

4949
@ResponseStatus(HttpStatus.OK)
5050
@GetMapping(produces = { IConstants.APPLICATION_JSON_UTF_8, IConstants.APPLICATION_XML_UTF_8 })
51-
@Operation(summary = "Obter lista de Book paginado", description = "Retorna a lista de Books paginado.", tags = { "Book" })
51+
@Operation(summary = "Obter lista de Book paginado",
52+
description = "Retorna a lista de Books paginado.<br/>"
53+
+ "Os filtros são por default contains e ignoreCase.<br/>"
54+
+ "Segue os filtros:<br/>"
55+
+ "Por título;<br/>"
56+
+ "Por autor;<br/>"
57+
+ "Os filtros podem ser combinados.",
58+
tags = { "Book" })
5259
@ApiResponses(value = {
5360
@ApiResponse(responseCode = "200", description = "Registros listados com sucesso"),
5461
@ApiResponse(responseCode = "400", description = "Erro na obtenção dos dados"),
55-
@ApiResponse(responseCode = "500", description = "Erro interno do servidor") })
62+
@ApiResponse(responseCode = "500", description = "Erro interno do servidor")})
5663
public ResponseEntity<CollectionModel<BookModel>> findAll(
57-
@Parameter(description="Número da página, default é 0") @RequestParam(value = "page", required = false, defaultValue = IConstants.defaultPage) int page,
58-
@Parameter(description="Quantidade de registros por página, default é 5") @RequestParam(value = "size", required = false, defaultValue = IConstants.defaultSize) int size) {
64+
@Parameter(description="Número da página.") @RequestParam(value = "page", required = false, defaultValue = IConstants.defaultPage) int page,
65+
@Parameter(description="Quantidade de registros por página.") @RequestParam(value = "size", required = false, defaultValue = IConstants.defaultSize) int size,
66+
@Parameter(description="Filtro pelo título do livro.") @RequestParam(value = "title", required = false) String title,
67+
@Parameter(description="Filtro pelo autor do livro.") @RequestParam(value = "author", required = false) String author) {
68+
69+
PagedModel<BookModel> collModel = null;
70+
71+
if (title == null && author == null) {
72+
collModel = pagedResourcesAssembler.toModel(getService().findPaginated(page, size), getModelAssembler());
73+
} else{
74+
75+
collModel = pagedResourcesAssembler.toModel(getService().findPaginated(title, author, page, size), getModelAssembler());
76+
}
5977

60-
PagedModel<BookModel> collModel = pagedResourcesAssembler.toModel(getService().findPaginated(page, size), getModelAssembler());
6178

6279
return ResponseEntity.ok().body(collModel);
6380
}

src/main/java/br/com/virtuallibrary/rest/controllers/impl/RatingController.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,31 @@ public RatingController(RatingService service, RatingModelAssembler modelAssembl
4747

4848
@ResponseStatus(HttpStatus.OK)
4949
@GetMapping(produces = { IConstants.APPLICATION_JSON_UTF_8, IConstants.APPLICATION_XML_UTF_8 })
50-
@Operation(summary = "Obter lista de Rating paginado", description = "Retorna a lista de Rating paginado. Quando passado %bookId%, retorna todos os Ratings associado ao livro.", tags = { "Rating" })
50+
@Operation(summary = "Obter lista de Rating paginado", description =
51+
"Retorna a lista de Rating paginado. Quando passado <b>bookId</b>, retorna todos os Ratings associado ao livro.<br/>"
52+
+ "O filtro padrão é o igual, mas você pode usar:<br/>"
53+
+ "Maior que \"gt:2\"<br/>"
54+
+ "Menor que \"lt:2\"<br/>"
55+
+ "Maior ou igual \"gte:2\"<br/>"
56+
+ "Menor ou igual \"lte:2\"<br/>"
57+
+ "Também é possível combinar dois filtros: gt:1:lt:5",
58+
tags = { "Rating" })
5159
@ApiResponses(value = {
5260
@ApiResponse(responseCode = "200", description = "Registros listados com sucesso"),
5361
@ApiResponse(responseCode = "400", description = "Erro na obtenção dos dados"),
5462
@ApiResponse(responseCode = "500", description = "Erro interno do servidor") })
5563
public ResponseEntity<PagedModel<RatingModel>> findAll(
56-
@Parameter(description="O código do livro, deafult é \"\"") @RequestParam(value = "bookId", required = false, defaultValue = IConstants.BLANK) String bookId,
57-
@Parameter(description="Número da página, default é 0") @RequestParam(value = "page", required = false, defaultValue = IConstants.defaultPage) int page,
58-
@Parameter(description="Quantidade de registros por página, default é 5") @RequestParam(value = "size", required = false, defaultValue = IConstants.defaultSize) int size) {
64+
@Parameter(description="Número da página, default é 0.") @RequestParam(value = "page", required = false, defaultValue = IConstants.defaultPage) int page,
65+
@Parameter(description="Quantidade de registros por página, default é 5.") @RequestParam(value = "size", required = false, defaultValue = IConstants.defaultSize) int size,
66+
@Parameter(description="O código do livro.") @RequestParam(value = "bookId", required = false) String bookId,
67+
@Parameter(description="Por classificação.") @RequestParam(value = "stars", required = false) String stars) {
5968

6069
PagedModel<RatingModel> collModel = null;
6170

62-
if (bookId.isBlank()) {
71+
if (bookId == null && stars == null) {
6372
collModel = pagedResourcesAssembler.toModel(getService().findPaginated(page, size), getModelAssembler());
6473
} else {
65-
collModel = pagedResourcesAssembler.toModel(getService().findPaginated(bookId, page, size), getModelAssembler());
74+
collModel = pagedResourcesAssembler.toModel(getService().findPaginated(bookId, stars, page, size), getModelAssembler());
6675
}
6776

6877
return ResponseEntity.ok().body(collModel);
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package br.com.virtuallibrary.services;
22

3+
import org.springframework.data.domain.Page;
4+
35
import br.com.virtuallibrary.commons.services.IBaseService;
46
import br.com.virtuallibrary.entity.Book;
57
import br.com.virtuallibrary.repositories.BookRepository;
68

79
public interface BookService extends IBaseService<Book, String, BookRepository> {
810

11+
Page<Book> findPaginated(String title, String author, int page, int size);
12+
913
}

src/main/java/br/com/virtuallibrary/services/RatingService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
public interface RatingService extends IBaseService<Rating, String, RatingRepository> {
1212

1313
List<Rating> findByBookId(String bookId);
14-
Page<Rating> findPaginated(String bookI, int page, int size);
14+
Page<Rating> findPaginated(String bookI, String stars, int page, int size);
1515
}

src/main/java/br/com/virtuallibrary/services/impl/BookServicesImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package br.com.virtuallibrary.services.impl;
22

33
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.mongodb.core.query.Criteria;
6+
import org.springframework.data.mongodb.core.query.Query;
47
import org.springframework.stereotype.Service;
58

69
import br.com.virtuallibrary.commons.services.impl.BaseServiceImpl;
@@ -16,4 +19,18 @@ public BookServicesImpl(BookRepository repository) {
1619
super(repository);
1720
}
1821

22+
@Override
23+
public Page<Book> findPaginated(String title, String author, int page, int size) {
24+
Query query = new Query();
25+
26+
if (title != null) {
27+
query.addCriteria(new Criteria("title").regex(String.format(".*%s.*", title)));
28+
}
29+
if (author != null) {
30+
query.addCriteria(new Criteria("author").regex(String.format(".*%s.*", author)));
31+
}
32+
33+
return findAll(query, page, size);
34+
}
35+
1936
}

src/main/java/br/com/virtuallibrary/services/impl/RatingServiceImpl.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@
66
import org.springframework.data.domain.Page;
77
import org.springframework.data.domain.PageRequest;
88
import org.springframework.data.domain.Pageable;
9+
import org.springframework.data.mongodb.core.query.Criteria;
10+
import org.springframework.data.mongodb.core.query.Query;
11+
import org.springframework.data.repository.support.PageableExecutionUtils;
912
import org.springframework.stereotype.Service;
1013

14+
import com.mongodb.BasicDBList;
15+
1116
import br.com.virtuallibrary.commons.services.impl.BaseServiceImpl;
1217
import br.com.virtuallibrary.entity.Rating;
1318
import br.com.virtuallibrary.repositories.RatingRepository;
@@ -27,12 +32,30 @@ public List<Rating> findByBookId(String bookId) {
2732
}
2833

2934
@Override
30-
public Page<Rating> findPaginated(String bookId, int page, int size) {
31-
Pageable pageable = PageRequest.of(page, size);
35+
public Page<Rating> findPaginated(String bookId, String stars, int page, int size) {
36+
Query query = new Query();
37+
3238
if (bookId != null) {
33-
return getRepository().findByBookId(bookId, pageable);
39+
query.addCriteria(new Criteria("bookId").is(bookId));
40+
}
41+
42+
//FIXME: Melhorar o código abaixo.
43+
if (stars != null) {
44+
String[] filters = stars.split(":");
45+
46+
if (filters.length == 2) {
47+
query.addCriteria(getCriteriaByFilter(query, filters[0], Integer.valueOf(filters[1])));
48+
} else if (filters.length == 4) {
49+
BasicDBList bsonList = new BasicDBList();
50+
bsonList.add(getCriteriaByFilter(query, filters[0], Integer.valueOf(filters[1])).getCriteriaObject());
51+
bsonList.add(getCriteriaByFilter(query, filters[2], Integer.valueOf(filters[3])).getCriteriaObject());
52+
query.addCriteria(new Criteria("$and").is(bsonList));
53+
} else {
54+
query.addCriteria(new Criteria("stars").is(Integer.parseInt(stars)));
55+
}
3456
}
35-
return getRepository().findAll(pageable);
57+
58+
return findAll(query, page, size);
3659
}
3760

3861
}

0 commit comments

Comments
 (0)