Skip to content

Commit 39d4525

Browse files
committed
implementacao do resource de Book e testes
1 parent 0f450e5 commit 39d4525

File tree

12 files changed

+659
-0
lines changed

12 files changed

+659
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.library.app.book.resource;
2+
3+
import javax.ws.rs.core.UriInfo;
4+
5+
import com.library.app.book.model.filter.BookFilter;
6+
import com.library.app.common.resource.AbstractFilterExtractorFromUrl;
7+
8+
public class BookFilterExtractorFromUrl extends AbstractFilterExtractorFromUrl {
9+
10+
public BookFilterExtractorFromUrl(final UriInfo uriInfo) {
11+
super(uriInfo);
12+
}
13+
14+
public BookFilter getFilter() {
15+
final BookFilter bookFilter = new BookFilter();
16+
17+
bookFilter.setPaginationData(extractPaginationData());
18+
bookFilter.setTitle(getUriInfo().getQueryParameters().getFirst("title"));
19+
20+
final String categoryIdStr = getUriInfo().getQueryParameters().getFirst("categoryId");
21+
if (categoryIdStr != null) {
22+
bookFilter.setCategoryId(Long.valueOf(categoryIdStr));
23+
}
24+
25+
return bookFilter;
26+
}
27+
28+
@Override
29+
protected String getDefaultSortField() {
30+
return "title";
31+
}
32+
33+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.library.app.book.resource;
2+
3+
import javax.enterprise.context.ApplicationScoped;
4+
import javax.inject.Inject;
5+
6+
import com.google.gson.JsonArray;
7+
import com.google.gson.JsonElement;
8+
import com.google.gson.JsonObject;
9+
import com.library.app.author.model.Author;
10+
import com.library.app.author.resource.AuthorJsonConverter;
11+
import com.library.app.book.model.Book;
12+
import com.library.app.category.model.Category;
13+
import com.library.app.category.resource.CategoryJsonConverter;
14+
import com.library.app.common.json.EntityJsonConverter;
15+
import com.library.app.common.json.JsonReader;
16+
17+
@ApplicationScoped
18+
public class BookJsonConverter implements EntityJsonConverter<Book> {
19+
20+
@Inject
21+
CategoryJsonConverter categoryJsonConverter;
22+
23+
@Inject
24+
AuthorJsonConverter authorJsonConverter;
25+
26+
@Override
27+
public Book convertFrom(final String json) {
28+
final JsonObject jsonObject = JsonReader.readAsJsonObject(json);
29+
30+
final Book book = new Book();
31+
book.setTitle(JsonReader.getStringOrNull(jsonObject, "title"));
32+
book.setDescription(JsonReader.getStringOrNull(jsonObject, "description"));
33+
34+
final Category category = new Category();
35+
category.setId(JsonReader.getLongOrNull(jsonObject, "categoryId"));
36+
book.setCategory(category);
37+
38+
final JsonArray authorsIdsJsonArray = jsonObject.getAsJsonArray("authorsIds");
39+
if (authorsIdsJsonArray != null) {
40+
for (final JsonElement authorIdJsonElement : authorsIdsJsonArray) {
41+
final Author author = new Author();
42+
author.setId(authorIdJsonElement.getAsLong());
43+
book.addAuthor(author);
44+
}
45+
}
46+
47+
book.setPrice(JsonReader.getDoubeOrNull(jsonObject, "price"));
48+
49+
return book;
50+
}
51+
52+
@Override
53+
public JsonElement convertToJsonElement(final Book book) {
54+
final JsonObject jsonObject = new JsonObject();
55+
56+
jsonObject.addProperty("id", book.getId());
57+
jsonObject.addProperty("title", book.getTitle());
58+
jsonObject.addProperty("description", book.getDescription());
59+
jsonObject.add("category", categoryJsonConverter.convertToJsonElement(book.getCategory()));
60+
jsonObject.add("authors", authorJsonConverter.convertToJsonElement(book.getAuthors()));
61+
jsonObject.addProperty("price", book.getPrice());
62+
63+
return jsonObject;
64+
}
65+
}
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package com.library.app.book.resource;
2+
3+
import static com.library.app.common.model.StandardsOperationResults.*;
4+
5+
import javax.annotation.security.PermitAll;
6+
import javax.annotation.security.RolesAllowed;
7+
import javax.inject.Inject;
8+
import javax.ws.rs.Consumes;
9+
import javax.ws.rs.GET;
10+
import javax.ws.rs.POST;
11+
import javax.ws.rs.PUT;
12+
import javax.ws.rs.Path;
13+
import javax.ws.rs.PathParam;
14+
import javax.ws.rs.Produces;
15+
import javax.ws.rs.core.Context;
16+
import javax.ws.rs.core.MediaType;
17+
import javax.ws.rs.core.Response;
18+
import javax.ws.rs.core.Response.ResponseBuilder;
19+
import javax.ws.rs.core.UriInfo;
20+
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
23+
24+
import com.google.gson.JsonElement;
25+
import com.library.app.author.exception.AuthorNotFoundException;
26+
import com.library.app.book.exception.BookNotFoundException;
27+
import com.library.app.book.model.Book;
28+
import com.library.app.book.model.filter.BookFilter;
29+
import com.library.app.book.services.BookServices;
30+
import com.library.app.category.exception.CategoryNotFoundException;
31+
import com.library.app.common.exception.FieldNotValidException;
32+
import com.library.app.common.json.JsonUtils;
33+
import com.library.app.common.json.JsonWriter;
34+
import com.library.app.common.json.OperationResultJsonWriter;
35+
import com.library.app.common.model.HttpCode;
36+
import com.library.app.common.model.OperationResult;
37+
import com.library.app.common.model.PaginatedData;
38+
import com.library.app.common.model.ResourceMessage;
39+
40+
@Path("/books")
41+
@Produces(MediaType.APPLICATION_JSON)
42+
@Consumes(MediaType.APPLICATION_JSON)
43+
@RolesAllowed({ "EMPLOYEE" })
44+
public class BookResource {
45+
46+
private Logger logger = LoggerFactory.getLogger(getClass());
47+
48+
private static final ResourceMessage RESOURCE_MESSAGE = new ResourceMessage("book");
49+
50+
@Inject
51+
BookServices bookServices;
52+
53+
@Inject
54+
BookJsonConverter bookJsonConverter;
55+
56+
@Context
57+
UriInfo uriInfo;
58+
59+
@POST
60+
public Response add(final String body) {
61+
logger.debug("Adding a new book with body {}", body);
62+
Book book = bookJsonConverter.convertFrom(body);
63+
64+
HttpCode httpCode = HttpCode.CREATED;
65+
OperationResult result;
66+
try {
67+
book = bookServices.add(book);
68+
result = OperationResult.success(JsonUtils.getJsonElementWithId(book.getId()));
69+
} catch (final FieldNotValidException e) {
70+
httpCode = HttpCode.VALIDATION_ERROR;
71+
logger.error("One of the fields of the book is not valid", e);
72+
result = getOperationResultInvalidField(RESOURCE_MESSAGE, e);
73+
} catch (final CategoryNotFoundException e) {
74+
httpCode = HttpCode.VALIDATION_ERROR;
75+
logger.error("Category not found for book", e);
76+
result = getOperationResultDependencyNotFound(RESOURCE_MESSAGE, "category");
77+
} catch (final AuthorNotFoundException e) {
78+
httpCode = HttpCode.VALIDATION_ERROR;
79+
logger.error("Author not found for book", e);
80+
result = getOperationResultDependencyNotFound(RESOURCE_MESSAGE, "author");
81+
}
82+
83+
logger.debug("Returning the operation result after adding book: {}", result);
84+
return Response.status(httpCode.getCode()).entity(OperationResultJsonWriter.toJson(result)).build();
85+
}
86+
87+
@PUT
88+
@Path("/{id}")
89+
public Response update(@PathParam("id") final Long id, final String body) {
90+
logger.debug("Updating the book {} with body {}", id, body);
91+
final Book book = bookJsonConverter.convertFrom(body);
92+
book.setId(id);
93+
94+
HttpCode httpCode = HttpCode.OK;
95+
OperationResult result;
96+
try {
97+
bookServices.update(book);
98+
result = OperationResult.success();
99+
} catch (final FieldNotValidException e) {
100+
httpCode = HttpCode.VALIDATION_ERROR;
101+
logger.error("One of the fields of the book is not valid", e);
102+
result = getOperationResultInvalidField(RESOURCE_MESSAGE, e);
103+
} catch (final CategoryNotFoundException e) {
104+
httpCode = HttpCode.VALIDATION_ERROR;
105+
logger.error("Category not found for book", e);
106+
result = getOperationResultDependencyNotFound(RESOURCE_MESSAGE, "category");
107+
} catch (final AuthorNotFoundException e) {
108+
httpCode = HttpCode.VALIDATION_ERROR;
109+
logger.error("Author not found for book", e);
110+
result = getOperationResultDependencyNotFound(RESOURCE_MESSAGE, "author");
111+
} catch (final BookNotFoundException e) {
112+
httpCode = HttpCode.NOT_FOUND;
113+
logger.error("No book found for the given id", e);
114+
result = getOperationResultNotFound(RESOURCE_MESSAGE);
115+
}
116+
117+
logger.debug("Returning the operation result after updating book: {}", result);
118+
return Response.status(httpCode.getCode()).entity(OperationResultJsonWriter.toJson(result)).build();
119+
}
120+
121+
@GET
122+
@Path("/{id}")
123+
public Response findById(@PathParam("id") final Long id) {
124+
logger.debug("Find book: {}", id);
125+
ResponseBuilder responseBuilder;
126+
try {
127+
final Book book = bookServices.findById(id);
128+
final OperationResult result = OperationResult.success(bookJsonConverter.convertToJsonElement(book));
129+
responseBuilder = Response.status(HttpCode.OK.getCode()).entity(OperationResultJsonWriter.toJson(result));
130+
logger.debug("Book found: {}", book);
131+
} catch (final BookNotFoundException e) {
132+
logger.error("No book found for id", id);
133+
responseBuilder = Response.status(HttpCode.NOT_FOUND.getCode());
134+
}
135+
136+
return responseBuilder.build();
137+
}
138+
139+
@GET
140+
@PermitAll
141+
public Response findByFilter() {
142+
143+
final BookFilter bookFilter = new BookFilterExtractorFromUrl(uriInfo).getFilter();
144+
logger.debug("Finding books using filter: {}", bookFilter);
145+
146+
final PaginatedData<Book> books = bookServices.findByFilter(bookFilter);
147+
148+
logger.debug("Found {} books", books.getNumberOfRows());
149+
150+
final JsonElement jsonWithPagingAndEntries = JsonUtils.getJsonElementWithPagingAndEntries(books,
151+
bookJsonConverter);
152+
return Response.status(HttpCode.OK.getCode()).entity(JsonWriter.writeToString(jsonWithPagingAndEntries))
153+
.build();
154+
}
155+
156+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.library.app.book.resource;
2+
3+
import static com.library.app.commontests.utils.FilterExtractorTestUtils.*;
4+
import static org.hamcrest.CoreMatchers.*;
5+
import static org.junit.Assert.*;
6+
7+
import java.util.LinkedHashMap;
8+
import java.util.Map;
9+
10+
import javax.ws.rs.core.UriInfo;
11+
12+
import org.junit.Before;
13+
import org.junit.Test;
14+
import org.mockito.Mock;
15+
import org.mockito.MockitoAnnotations;
16+
17+
import com.library.app.book.model.filter.BookFilter;
18+
import com.library.app.common.model.filter.PaginationData;
19+
import com.library.app.common.model.filter.PaginationData.OrderMode;
20+
21+
public class BookFilterExtractorFromUrlTest {
22+
23+
@Mock
24+
private UriInfo uriInfo;
25+
26+
@Before
27+
public void initTestCase() {
28+
MockitoAnnotations.initMocks(this);
29+
}
30+
31+
@Test
32+
public void onlyDefaultValues() {
33+
setUpUriInfo(null, null, null, null, null);
34+
35+
final BookFilterExtractorFromUrl extractor = new BookFilterExtractorFromUrl(uriInfo);
36+
final BookFilter bookFilter = extractor.getFilter();
37+
38+
assertActualPaginationDataWithExpected(bookFilter.getPaginationData(), new PaginationData(0, 10, "title",
39+
OrderMode.ASCENDING));
40+
assertFieldsOnFilter(bookFilter, null, null);
41+
}
42+
43+
@Test
44+
public void withPaginationAndTitleAndCategoryIdAndSortAscending() {
45+
setUpUriInfo("2", "5", "Design", "1", "id");
46+
47+
final BookFilterExtractorFromUrl extractor = new BookFilterExtractorFromUrl(uriInfo);
48+
final BookFilter bookFilter = extractor.getFilter();
49+
50+
assertActualPaginationDataWithExpected(bookFilter.getPaginationData(), new PaginationData(10, 5, "id",
51+
OrderMode.ASCENDING));
52+
assertFieldsOnFilter(bookFilter, "Design", 1L);
53+
}
54+
55+
@Test
56+
public void withPaginationAndTitleAndSortAscendingWithPrefix() {
57+
setUpUriInfo("2", "5", "Design", null, "+id");
58+
59+
final BookFilterExtractorFromUrl extractor = new BookFilterExtractorFromUrl(uriInfo);
60+
final BookFilter bookFilter = extractor.getFilter();
61+
62+
assertActualPaginationDataWithExpected(bookFilter.getPaginationData(), new PaginationData(10, 5, "id",
63+
OrderMode.ASCENDING));
64+
assertFieldsOnFilter(bookFilter, "Design", null);
65+
}
66+
67+
@Test
68+
public void withPaginationAndTitleAndCategoryIdAndSortDescending() {
69+
setUpUriInfo("2", "5", "Design", "10", "-id");
70+
71+
final BookFilterExtractorFromUrl extractor = new BookFilterExtractorFromUrl(uriInfo);
72+
final BookFilter bookFilter = extractor.getFilter();
73+
74+
assertActualPaginationDataWithExpected(bookFilter.getPaginationData(), new PaginationData(10, 5, "id",
75+
OrderMode.DESCENDING));
76+
assertFieldsOnFilter(bookFilter, "Design", 10L);
77+
}
78+
79+
private void setUpUriInfo(final String page, final String perPage, final String title, final String categoryId,
80+
final String sort) {
81+
final Map<String, String> parameters = new LinkedHashMap<>();
82+
parameters.put("page", page);
83+
parameters.put("per_page", perPage);
84+
parameters.put("title", title);
85+
parameters.put("categoryId", categoryId);
86+
parameters.put("sort", sort);
87+
88+
setUpUriInfoWithMap(uriInfo, parameters);
89+
}
90+
91+
private void assertFieldsOnFilter(final BookFilter bookFilter, final String title, final Long categoryId) {
92+
assertThat(bookFilter.getTitle(), is(equalTo(title)));
93+
assertThat(bookFilter.getCategoryId(), is(equalTo(categoryId)));
94+
}
95+
96+
}

0 commit comments

Comments
 (0)