package edu.lmu.cs.headmaster.ws.resource;
import java.net.URI;
import java.util.List;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import org.joda.time.Interval;
import edu.lmu.cs.headmaster.ws.dao.EventDao;
import edu.lmu.cs.headmaster.ws.dao.UserDao;
import edu.lmu.cs.headmaster.ws.domain.Event;
/**
* The sole implementation of the event resource.
*/
@Path("/events")
public class EventResourceImpl extends AbstractResource implements EventResource {
private EventDao eventDao;
/**
* Creates an event resource with the injected daos.
*/
public EventResourceImpl(UserDao userDao, EventDao eventDao) {
super(userDao);
this.eventDao = eventDao;
}
@Override
public List<Event> getEvents(String query, String startDate, String stopDate, int skip,
int max) {
logServiceCall();
// First, check the parameters for the right query.
boolean textQuery = (query != null) && (startDate == null) && (stopDate == null);
boolean dateQuery = (query == null) && (startDate != null) && (stopDate != null);
validate(textQuery || dateQuery, Response.Status.BAD_REQUEST, EVENT_QUERY_PARAMETERS_BAD);
// Issue the query according to the determined type.
if (textQuery) {
return eventDao.getEvents(query, skip, max);
} else { // Sure to be dateQuery at this point.
Interval interval = validateInterval(startDate, stopDate);
return eventDao.getEventsByDate(interval.getStart(), interval.getEnd(), skip, max);
}
}
@Override
public Response createEvent(Event event) {
logServiceCall();
validate(event.getId() == null, Response.Status.BAD_REQUEST, EVENT_OVERSPECIFIED);
eventDao.createEvent(event);
return Response.created(URI.create(Long.toString(event.getId()))).build();
}
@Override
public Response createOrUpdateEvent(Long id, Event event) {
logServiceCall();
validate(id.equals(event.getId()), Response.Status.BAD_REQUEST, EVENT_INCONSISTENT);
eventDao.createOrUpdateEvent(event);
return Response.noContent().build();
}
@Override
public Event getEventById(Long id) {
logServiceCall();
Event event = eventDao.getEventById(id);
validate(event != null, Response.Status.NOT_FOUND, EVENT_NOT_FOUND);
return event;
}
}