MapAdminView.java 7.5 KB
/*
 * Copyright Codecrew Ry
 * 
 * All rights reserved.
 * 
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software. 
 * 
 * Any distribution and use in source and binary forms, with or without 
 * modification is not permitted without explicit written permission from the 
 * copyright owner. 
 * 
 * A non-exclusive royalty-free right is granted to the copyright owner of the 
 * Software to use, modify and distribute all modifications to the Software in 
 * future versions of the Software. 
 * 
 */
package fi.codecrew.moya.rest;

import java.io.ByteArrayInputStream;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiResponse;

import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.EventMapBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.exceptions.BortalCatchableException;
import fi.codecrew.moya.model.EventMap;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.rest.pojo.map.v1.MapRoot;
import fi.codecrew.moya.rest.pojo.map.v1.PlacePojo;
import fi.codecrew.moya.rest.pojo.map.v1.PlaceRoot;

@RequestScoped
@Path("/placeadmin")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON })
@Api(value = "/placeadmin", description = "Administer places")
public class MapAdminView {

	@EJB
	private EventMapBeanLocal eventmapbean;
	@EJB
	private PlaceGroupBeanLocal pgbean;
	@EJB
	private EventBeanLocal eventbean;
	@EJB
	private ProductBeanLocal productbean;
	@EJB
	private UserBeanLocal eventuserbean;
	@EJB
	private transient PlaceBeanLocal placebean;

	private static final Logger logger = LoggerFactory.getLogger(MapAdminView.class);

	@GET
	@Path("/background/{mapId}")
	@ApiResponse(code = 200, message = "Return backround map as JPEG")
	public Response getMapBg(@PathParam("mapId") Integer mapid)
	{
		EventMap map = placebean.findMap(mapid);
		ByteArrayInputStream istream = new ByteArrayInputStream(map.getMapData());
		return Response.ok().entity(istream).type("image/jpeg").build();
	}

	@GET
	@Path("/maps")
	@ApiOperation(value = "Get All maps", response = MapRoot.class)
	@ApiResponse(code = 200, message = "Return all maps")
	public MapRoot getAllMaps() {
		MapRoot ret = PojoUtils.parseMaps(eventbean.getCurrentEvent().getEventMaps());
		logger.info("getallmaps called! {}", ret);
		return ret;
	}

	@GET
	@Path("/places/{mapId}")
	@ApiOperation(value = "Get places by mapId", response = PlaceRoot.class)
	public PlaceRoot getPlaces(@PathParam("mapId") Integer mapid) {
		EventMap map = placebean.findMap(mapid);
		PlaceRoot ret = PojoUtils.initPlaceRoot(map);
		logger.info("returning map {} entity {}", mapid, ret);
		return ret;
	}

	@DELETE
	@Path("/place/{id}")
	@ApiOperation("Delete a place")
	public Response deletePlace(@PathParam("id") Integer id) {
		Place place = eventmapbean.findPlace(id);
		eventmapbean.deletePlace(place);
		return Response.ok().build();
	}

	@GET
	@Path("/place/")
	@ApiOperation(value = "Always returns 406 - Not acceptable")
	@ApiResponse(code = 406, message = "Nope. Not acceptable.")
	public Response getPlaceError() {
		ResponseBuilder ret = Response.ok();
		ret = ret.status(Status.NOT_ACCEPTABLE);
		ret.entity("Method not allowed!\nGET is not supported for /place/. See api for correct use!");
		return ret.build();
	}

	@POST
	@Path("/place/")
	@ApiOperation(value = "Create a place", response = PlacePojo.class)
	public Response createPlace(PlacePojo create) {
		logger.info("Finding map with id {}", create.getMapId());
		EventMap map = eventmapbean.find(create.getMapId());
		if (map == null) {
			logger.warn("No map found!");
			return Response.serverError().entity("Error with mapId").build();
		}
		Place place = new Place();
		place.setMap(map);
		setUpdatablePlaceValues(place, create);
		if (create.getProductId() != null && (place.getProduct() == null || !place.getProduct().getId().equals(create.getProductId())))
			return Response.serverError().entity("Product id unknown!").build();
		logger.info("Creating new place {}", place.getName());
		eventmapbean.createPlace(place);
		return Response.ok().entity(PojoUtils.initPlacePojo(place)).build();
	}

	@PUT
	@Path("/place/{id}")
	@ApiOperation(value = "Set a place", response = PlacePojo.class)
	public Response updatePlace(@PathParam("id") Integer id, PlacePojo update) {
		if (update == null || id == null) {
			return Response.serverError().entity("'id' field is required!").build();
		}
		Place place = eventmapbean.findPlace(id);
		if (place == null) {
			return Response.serverError().entity("place not found with id: " + id).build();
		}
		setUpdatablePlaceValues(place, update);
		if (update.getProductId() != null && (place.getProduct() == null || !place.getProduct().getId().equals(update.getProductId())))
			return Response.serverError().entity("Product id unknown!").build();

		place = eventmapbean.updatePlace(place);
		return Response.ok(PojoUtils.initPlacePojo(place)).build();
	}

	@PUT
	@Path("/place/{placeId}/release")
	@ApiOperation("Release a class")
	public Response releasePlace(@PathParam("placeId") Integer placeId) {
		Place place = eventmapbean.findPlace(placeId);
		if (place == null) {
			return Response.serverError().entity("Place not found!").build();
		}
		logger.info("Releasing place {}", place);
		placebean.unbuyPlace(place);

		return Response.ok().build();
	}

	@PUT
	@Path("/place/{placeId}/reserve/{eventuserId}")
	@ApiOperation("Reserve a place")
	public Response reserve(@PathParam("placeId") Integer placeId, @PathParam("eventuserId") Integer eventuserId) {
		Place place = eventmapbean.findPlace(placeId);
		EventUser eventuser = eventuserbean.findByEventUserId(eventuserId);
		if (placebean.reservePlace(place, eventuser))
		{
			try {
				placebean.reserveSelectedPlaces(eventuser);
				return Response.ok().build();
			} catch (BortalCatchableException e) {
				logger.warn("Wtf! Bortalerror");
			}
		}
		return Response.serverError().build();
	}

	private void setUpdatablePlaceValues(Place place, PlacePojo update) {

		if (update.getName() != null)
			place.setName(update.getName());
		if (update.getMapX() != null)
			place.setMapX(update.getMapX());
		if (update.getMapY() != null)
			place.setMapY(update.getMapY());
		if (update.getWidth() != null)
			place.setWidth(update.getWidth());
		if (update.getHeight() != null)
			place.setHeight(update.getHeight());
		if (update.getBuyable() != null)
			place.setBuyable(update.getBuyable());
		if (update.getDisabled() != null)
			place.setDisabled(update.getDisabled());
		if (update.getProductId() != null) {
			Product product = productbean.findById(update.getProductId());
			if (product != null) {
				place.setProduct(product);
			}
		}
	}

}