Skip to content

Commit 58fa9c8

Browse files
committed
fixing sort to be generic.
1 parent f3864ca commit 58fa9c8

File tree

5 files changed

+48
-30
lines changed

5 files changed

+48
-30
lines changed

src/main/java/fr/fxjavadevblog/aid/api/genre/GenreResource.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77
import javax.ws.rs.Path;
88
import javax.ws.rs.PathParam;
99
import javax.ws.rs.Produces;
10+
import javax.ws.rs.QueryParam;
11+
import javax.ws.rs.core.Context;
1012
import javax.ws.rs.core.MediaType;
1113
import javax.ws.rs.core.Response;
14+
import javax.ws.rs.core.UriInfo;
1215

1316
import org.eclipse.microprofile.metrics.MetricUnits;
1417
import org.eclipse.microprofile.metrics.annotation.Timed;
1518
import org.eclipse.microprofile.openapi.annotations.Operation;
19+
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
1620
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
1721
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
1822

@@ -21,6 +25,7 @@
2125
import fr.fxjavadevblog.aid.utils.jaxrs.Pagination;
2226
import fr.fxjavadevblog.aid.utils.jaxrs.QueryParameterUtils;
2327
import fr.fxjavadevblog.aid.utils.pagination.PagedResponse;
28+
import fr.fxjavadevblog.aid.utils.validation.SortableOn;
2429
import io.quarkus.hibernate.orm.panache.PanacheQuery;
2530
import io.quarkus.panache.common.Sort;
2631
import lombok.extern.slf4j.Slf4j;
@@ -57,10 +62,23 @@ public Genre[] getAllGenres() {
5762
description = "A measure of how long it takes to fetch all video games filtered by a given genre.",
5863
unit = MetricUnits.MILLISECONDS)
5964
@APIResponse(responseCode = "206", description = "Partial response. Paged.")
60-
public Response findByGenre(@PathParam("genre") final Genre genre, @BeanParam @Valid final Pagination pagination)
65+
public Response findByGenre(@PathParam("genre")
66+
final Genre genre,
67+
68+
@BeanParam
69+
@Valid
70+
final Pagination pagination,
71+
72+
@Parameter(description="Sort order", required = false, allowReserved = true)
73+
@QueryParam(value = "sort")
74+
@SortableOn({"name","genre"})
75+
final String sortingClause,
76+
77+
@Context
78+
final UriInfo uriInfo)
6179
{
6280
log.info("find video-games by genre. Pagination : ", pagination);
63-
Sort sort = QueryParameterUtils.createSort(pagination.getSortingClause());
81+
Sort sort = QueryParameterUtils.createSort(sortingClause);
6482
PanacheQuery<VideoGame> query = videoGameRepository.findByGenre(genre, sort)
6583
.page(pagination.getPage(), pagination.getSize());
6684
return PagedResponse.of(query);

src/main/java/fr/fxjavadevblog/aid/api/videogame/VideoGameResource.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package fr.fxjavadevblog.aid.api.videogame;
22

3-
import java.util.List;
4-
53
import javax.enterprise.inject.spi.CDI;
64
import javax.inject.Inject;
75
import javax.transaction.Transactional;
@@ -17,31 +15,32 @@
1715
import javax.ws.rs.Path;
1816
import javax.ws.rs.PathParam;
1917
import javax.ws.rs.Produces;
18+
import javax.ws.rs.QueryParam;
2019
import javax.ws.rs.core.Context;
2120
import javax.ws.rs.core.MediaType;
2221
import javax.ws.rs.core.Response;
2322
import javax.ws.rs.core.Response.Status;
2423
import javax.ws.rs.core.UriBuilder;
2524
import javax.ws.rs.core.UriInfo;
2625

27-
import org.apache.commons.collections4.CollectionUtils;
2826
import org.eclipse.microprofile.metrics.MetricUnits;
2927
import org.eclipse.microprofile.metrics.annotation.Timed;
3028
import org.eclipse.microprofile.openapi.annotations.Operation;
3129
import org.eclipse.microprofile.openapi.annotations.enums.SchemaType;
3230
import org.eclipse.microprofile.openapi.annotations.headers.Header;
3331
import org.eclipse.microprofile.openapi.annotations.media.Content;
3432
import org.eclipse.microprofile.openapi.annotations.media.Schema;
33+
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
3534
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
3635
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
3736

3837
import fr.fxjavadevblog.aid.api.exceptions.ResourceNotFoundException;
39-
import fr.fxjavadevblog.aid.utils.jaxrs.Filter;
4038
import fr.fxjavadevblog.aid.utils.jaxrs.Filtering;
4139
import fr.fxjavadevblog.aid.utils.jaxrs.Pagination;
4240
import fr.fxjavadevblog.aid.utils.jaxrs.QueryParameterUtils;
4341
import fr.fxjavadevblog.aid.utils.jaxrs.SpecificMediaType;
4442
import fr.fxjavadevblog.aid.utils.pagination.PagedResponse;
43+
import fr.fxjavadevblog.aid.utils.validation.SortableOn;
4544
import fr.fxjavadevblog.preconditions.Checker;
4645
import io.quarkus.hibernate.orm.panache.PanacheQuery;
4746
import io.quarkus.panache.common.Sort;
@@ -87,14 +86,24 @@ public Response getMetaData()
8786
@Timed(name = "videogames-find-all", absolute = true, description = "A measure of how long it takes to fetch all video games.", unit = MetricUnits.MILLISECONDS)
8887
@APIResponse(responseCode = "206", description = "Partial response. Paged.", content= {@Content( schema=@Schema(implementation = VideoGame.class))})
8988
@APIResponse(responseCode = "412", description = "Invalid parameters.", content= { @Content(mediaType=SpecificMediaType.APPLICATION_PROBLEM_JSON) } )
90-
public Response findAll(@BeanParam @Valid final Pagination pagination, @BeanParam final Filtering filtering)
89+
public Response findAll(@BeanParam
90+
@Valid
91+
final Pagination pagination,
92+
93+
@Parameter(description="Sort order", required = false, allowReserved = true)
94+
@QueryParam(value = "sort")
95+
@SortableOn({"name","genre"})
96+
final String sortingClause,
97+
98+
@Context
99+
final UriInfo uriInfo)
91100
{
92101
log.info("findAll video games. Pagination : {}", pagination);
93102

94103
PanacheQuery<VideoGame> query;
95-
Sort sort = QueryParameterUtils.createSort(pagination.getSortingClause());
104+
Sort sort = QueryParameterUtils.createSort(sortingClause);
96105

97-
filtering.setModelClass(VideoGame.class);
106+
Filtering filtering = Filtering.of(VideoGame.class, uriInfo);
98107

99108
if (!filtering.isFilterPresent())
100109
{

src/main/java/fr/fxjavadevblog/aid/utils/jaxrs/Filtering.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import fr.fxjavadevblog.aid.api.exceptions.ApiException;
2424
import lombok.AllArgsConstructor;
25-
import lombok.Builder;
2625
import lombok.Getter;
2726
import lombok.NoArgsConstructor;
2827
import lombok.Setter;
@@ -33,7 +32,6 @@
3332
@ToString
3433
@NoArgsConstructor
3534
@AllArgsConstructor
36-
@Builder
3735
@Slf4j
3836
public class Filtering
3937
{
@@ -75,20 +73,22 @@ private Operation(String operation)
7573
operationAliases.put("gte", Operation.GREATER_THAN);
7674
}
7775

78-
public void setModelClass(Class <?> clazz)
76+
public static Filtering of(Class <?> clazz, UriInfo uriInfo)
7977
{
80-
this.modelClass = clazz;
81-
filters = new LinkedList<>();
78+
Filtering f = new Filtering();
79+
f.modelClass = clazz;
80+
f.filters = new LinkedList<>();
8281
MultivaluedMap <String, String> parameters;
8382
if (uriInfo != null)
8483
{
8584
parameters = uriInfo.getQueryParameters();
86-
parameters.forEach(convertParameterToFilter());
85+
parameters.forEach(f.convertParameterToFilter());
8786
}
8887
else
8988
{
9089
log.info("No uriInfo to get parameters from");
91-
}
90+
}
91+
return f;
9292
}
9393

9494
public boolean isFilterPresent()

src/main/java/fr/fxjavadevblog/aid/utils/jaxrs/Pagination.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
import javax.validation.constraints.Max;
44
import javax.validation.constraints.Min;
5-
import javax.ws.rs.DefaultValue;
65
import javax.ws.rs.QueryParam;
76

87
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
98

10-
import fr.fxjavadevblog.aid.utils.validation.SortableOn;
119
import lombok.AllArgsConstructor;
1210
import lombok.Builder;
1311
import lombok.Getter;
@@ -21,24 +19,16 @@
2119
@AllArgsConstructor
2220
@Builder
2321
public class Pagination
24-
{
25-
@Parameter(description="Sort order", required = false, example = "name,-genre", allowReserved = true)
26-
@QueryParam(value = "sort")
27-
@SortableOn({"name", "genre"})
28-
@Getter @Setter
29-
private String sortingClause;
30-
22+
{
3123
@Parameter(description="Page to display starting from 0", required = true)
3224
@QueryParam(value = "page")
33-
@DefaultValue("0")
3425
@Min(value=0, message="page must be equal or greater than 0")
3526
@Max(value=Integer.MAX_VALUE, message="page must be equal or less than " + Integer.MAX_VALUE)
3627
@Getter @Setter
3728
private int page;
3829

3930
@Parameter(description="Number of items to be displayed per page", required = true)
4031
@QueryParam(value = "size")
41-
@DefaultValue("50")
4232
@Min(value=2, message="size must be equal or greater than 2")
4333
@Max(value=200, message="size must be equal or less than 200")
4434
@Getter @Setter

src/test/java/fr/fxjavadevblog/aid/api/videogame/VideoGameResourceTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package fr.fxjavadevblog.aid.api.videogame;
22

3-
import static org.junit.jupiter.api.Assertions.*;
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotNull;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
46

57
import java.util.stream.Stream;
68

@@ -10,7 +12,6 @@
1012
import org.junit.jupiter.api.Test;
1113

1214
import fr.fxjavadevblog.aid.api.genre.Genre;
13-
import fr.fxjavadevblog.aid.utils.jaxrs.Filtering;
1415
import fr.fxjavadevblog.aid.utils.jaxrs.Pagination;
1516
import io.quarkus.test.junit.QuarkusTest;
1617

@@ -24,7 +25,7 @@ void checkInjection() {
2425

2526
@Test
2627
void testFindAll() {
27-
Response response = this.findAll(Pagination.builder().page(0).size(50).build(), new Filtering());
28+
Response response = this.findAll(Pagination.builder().page(0).size(50).build(), null, null);
2829
assertCorrectResponse(response);
2930
}
3031

0 commit comments

Comments
 (0)