MapAdminView.java 8.82 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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.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 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) {
		try {
			EventMap map = placebean.findMap(mapid);
			ByteArrayInputStream istream = new ByteArrayInputStream(map.getMapData());
			return Response.ok().entity(istream).type("image/jpeg").build();
		} catch (Exception e) {
			logger.error("GET /placeadmin/background/{mapId} threw an exception", e);
			throw e;
		}
	}

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

	@GET
	@Path("/places/{mapId}")
	@ApiOperation(value = "Get places by mapId", response = PlaceRoot.class)
	public PlaceRoot getPlaces(@PathParam("mapId") Integer mapid) {
		try {
			EventMap map = placebean.findMap(mapid);
			PlaceRoot ret = PojoUtils.initPlaceRoot(map);
			logger.info("returning map {} entity {}", mapid, ret);
			return ret;
		} catch (Exception e) {
			logger.error("PUT /placeadmin/places/{mapId} threw an exception", e);
			throw e;
		}
	}

	@DELETE
	@Path("/place/{id}")
	@ApiOperation("Delete a place")
	public Response deletePlace(@PathParam("id") Integer id) {
		try {
			Place place = eventmapbean.findPlace(id);
			if (place == null) {
				return Response.status(Status.NOT_FOUND).entity("Place not found for id " + id).build();
			}
			eventmapbean.deletePlace(place);
			return Response.ok().build();
		} catch (Exception e) {
			logger.error("DELETE /placeadmin/place/{id} threw an exception", e);
			return Response.serverError().entity("Got exception when removing place: " + e.getMessage()).build();
		}
	}

	@GET
	@Path("/place/")
	@ApiOperation(value = "Always returns 406 - Not acceptable")
	@ApiResponse(code = 406, message = "Nope. Not acceptable.")
	public Response getPlaceError() {
		try {
			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();
		} catch (Exception e) {
			logger.error("GET /placeadmin/place/ threw an exception", e);
			throw e;
		}
	}

	@POST
	@Path("/place/")
	@ApiOperation(value = "Create a place", response = PlacePojo.class)
	public Response createPlace(PlacePojo create) {
		try {
			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();
		} catch (Exception e) {
			logger.error("POST /placeadmin/place/ threw an exception", e);
			throw e;
		}
	}

	@PUT
	@Path("/place/{id}")
	@ApiOperation(value = "Set a place", response = PlacePojo.class)
	public Response updatePlace(@PathParam("id") Integer id, PlacePojo update) {
		try {
			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();
		} catch (Exception e) {
			logger.error("PUT /placeadmin/place/{id} threw an exception", e);
			throw e;
		}
	}

	@PUT
	@Path("/place/{placeId}/release")
	@ApiOperation("Release a class")
	public Response releasePlace(@PathParam("placeId") Integer placeId) {
		try {
			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();
		} catch (Exception e) {
			logger.error("PUT /placeadmin/place/{placeId}/release threw an exception", e);
			throw e;
		}
	}

	@PUT
	@Path("/place/{placeId}/reserve/{eventuserId}")
	@ApiOperation("Reserve a place")
	public Response reserve(@PathParam("placeId") Integer placeId, @PathParam("eventuserId") Integer eventuserId) {
		try {
			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", e);
				}
			}
			return Response.serverError().build();
		} catch (Exception e) {
			logger.error("PUT /placeadmin/place/{placeId}/reserve/{eventuserId} threw an exception", e);
			throw e;
		}
	}

	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);
			}
		}
	}

}