package org.multibit.mbm.resources.item; import com.google.common.base.Optional; import com.yammer.dropwizard.jersey.caching.CacheControl; import com.yammer.metrics.annotation.Timed; import org.multibit.mbm.api.hal.HalMediaType; import org.multibit.mbm.api.response.hal.item.PublicItemBridge; import org.multibit.mbm.api.response.hal.item.PublicItemCollectionBridge; import org.multibit.mbm.db.dao.ItemDao; import org.multibit.mbm.core.model.Item; import org.multibit.mbm.core.model.User; import org.multibit.mbm.resources.BaseResource; import org.multibit.mbm.resources.ResourceAsserts; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.List; import java.util.concurrent.TimeUnit; /** * <p>Resource to provide the following to application:</p> * <ul> * <li>Provision of REST endpoints to manage Item retrieval operations * by the public</li> * </ul> * <p>This is the main interaction point for the public to get detail on Items for sale.</p> * * @since 0.0.1 */ @Component @Path("/items") @Produces({HalMediaType.APPLICATION_HAL_JSON, HalMediaType.APPLICATION_HAL_XML, MediaType.APPLICATION_JSON}) public class PublicItemResource extends BaseResource { @Resource(name = "hibernateItemDao") ItemDao itemDao; /** * Provide a paged response of all items in the system * * @param rawPageSize The unvalidated page size * @param rawPageNumber The unvalidated page number * * @return A response containing a paged list of all items */ @GET @Timed @Path("/promotion") @CacheControl(maxAge = 6, maxAgeUnit = TimeUnit.HOURS) public Response retrievePromotionalItemsByPage( @QueryParam("ps") Optional<String> rawPageSize, @QueryParam("pn") Optional<String> rawPageNumber) { // Validation int pageSize = Integer.valueOf(rawPageSize.get()); int pageNumber = Integer.valueOf(rawPageNumber.get()); List<Item> items = itemDao.getAllByPage(pageSize, pageNumber); // Provide a representation to the client PublicItemCollectionBridge bridge = new PublicItemCollectionBridge(uriInfo, Optional.<User>absent()); return ok(bridge, items); } /** * Provide a paged response of all items in the system * * @param rawSku The unvalidated Stock Keeping Unit (SKU) * * @return A response containing a paged list of all items */ @GET @Timed @Path("/{sku}") @CacheControl(maxAge = 6, maxAgeUnit = TimeUnit.HOURS) public Response retrieveBySku(@PathParam("sku") String rawSku) { // Validation // TODO Work out how to validate a SKU String sku = rawSku; Optional<Item> item = itemDao.getBySKU(sku); ResourceAsserts.assertPresent(item, "item"); // Provide a representation to the client PublicItemBridge bridge = new PublicItemBridge(uriInfo, Optional.<User>absent()); return ok(bridge, item.get()); } public void setItemDao(ItemDao itemDao) { this.itemDao = itemDao; } }