org.mayocat.shop.billing.api.resource.OrderResource.java Source code

Java tutorial

Introduction

Here is the source code for org.mayocat.shop.billing.api.resource.OrderResource.java

Source

/*
 * Copyright (c) 2012, Mayocat <hello@mayocat.org>
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package org.mayocat.shop.billing.api.resource;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.joda.time.DateTimeZone;
import org.mayocat.authorization.annotation.Authorized;
import org.mayocat.configuration.ConfigurationService;
import org.mayocat.configuration.general.GeneralSettings;
import org.mayocat.rest.Resource;
import org.mayocat.rest.annotation.ExistingTenant;
import org.mayocat.rest.representations.ResultSetRepresentation;
import org.mayocat.shop.billing.api.representation.OrderRepresentation;
import org.mayocat.shop.billing.model.Order;
import org.mayocat.shop.billing.store.OrderStore;
import org.mayocat.store.EntityDoesNotExistException;
import org.mayocat.store.InvalidEntityException;
import org.xwiki.component.annotation.Component;

import com.google.common.base.Function;
import com.google.common.collect.Collections2;

/**
 * @version $Id: 0f4234671b5cf00ac20c2575620b3f73a0760fd4 $
 */
@Component("/tenant/{tenant}/api/orders")
@Path("/tenant/{tenant}/api/orders")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ExistingTenant
public class OrderResource implements Resource {
    @Inject
    private Provider<OrderStore> orderStore;

    @Inject
    private ConfigurationService configurationService;

    @GET
    @Authorized
    public ResultSetRepresentation<OrderRepresentation> getAllOrders(
            @QueryParam("number") @DefaultValue("50") Integer number,
            @QueryParam("offset") @DefaultValue("0") Integer offset) {

        GeneralSettings settings = configurationService.getSettings(GeneralSettings.class);
        final DateTimeZone tenantTz = DateTimeZone.forTimeZone(settings.getTime().getTimeZone().getValue());
        List<Order> orders = orderStore.get().findAllPaidOrAwaitingPayment(number, offset);

        Collection<OrderRepresentation> representations = Collections2.transform(orders,
                new Function<Order, OrderRepresentation>() {
                    public OrderRepresentation apply(final Order order) {
                        return new OrderRepresentation(tenantTz, order);
                    }
                });

        Integer total = this.orderStore.get().countAllPaidOrAwaitingPayment();
        ResultSetRepresentation<OrderRepresentation> resultSet = new ResultSetRepresentation<>("/api/orders",
                number, offset, new ArrayList<>(representations), total);

        return resultSet;
    }

    @GET
    @Path("{slug}")
    @Authorized
    public Response getOrder(@PathParam("slug") String slug) {
        Order order = orderStore.get().findBySlug(slug);
        if (order == null) {
            return Response.status(Response.Status.NOT_FOUND).entity("Order not found").build();
        }
        GeneralSettings settings = configurationService.getSettings(GeneralSettings.class);
        final DateTimeZone tenantTz = DateTimeZone.forTimeZone(settings.getTime().getTimeZone().getValue());
        return Response.ok(new OrderRepresentation(tenantTz, order)).build();
    }

    @Path("{slug}")
    @POST
    @Authorized
    // Partial update : NOT idempotent
    public Response updateOrder(@PathParam("slug") String slug, OrderRepresentation updatedOrderRepresentation) {
        try {
            Order order = this.orderStore.get().findBySlug(slug);
            if (order == null) {
                return Response.status(404).build();
            } else {
                order.setStatus(updatedOrderRepresentation.getStatus());
                this.orderStore.get().update(order);
                return Response.ok().build();
            }
        } catch (InvalidEntityException e) {
            return Response.status(Response.Status.BAD_REQUEST).build();
        } catch (EntityDoesNotExistException e) {
            return Response.status(Response.Status.NOT_FOUND).entity("No product with this slug could be found\n")
                    .type(MediaType.TEXT_PLAIN_TYPE).build();
        }
    }
}