package in.partake.controller.api.user;
import in.partake.base.PartakeException;
import in.partake.base.Util;
import in.partake.controller.api.AbstractPartakeAPI;
import in.partake.model.IPartakeDAOs;
import in.partake.model.access.DBAccess;
import in.partake.model.dao.DAOException;
import in.partake.model.dao.PartakeConnection;
import in.partake.model.dao.access.IUserTicketAccess;
import in.partake.model.daofacade.EnrollmentDAOFacade;
import in.partake.model.dto.Event;
import in.partake.model.dto.EventTicket;
import in.partake.model.dto.UserTicket;
import in.partake.model.dto.auxiliary.CalculatedEnrollmentStatus;
import java.util.ArrayList;
import java.util.List;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.JsonNodeFactory;
import org.codehaus.jackson.node.ObjectNode;
import play.mvc.Result;
class TicketAndStatus {
public EventTicket ticket;
public Event event;
public CalculatedEnrollmentStatus status;
public TicketAndStatus(EventTicket ticket, Event event, CalculatedEnrollmentStatus status) {
this.ticket = ticket;
this.event = event;
this.status = status;
}
}
public class GetTicketsAPI extends AbstractPartakeAPI {
public static Result get() throws DAOException, PartakeException {
return new GetTicketsAPI().execute();
}
@Override
public Result doExecute() throws DAOException, PartakeException {
String userId = getValidUserIdParameter();
int offset = optIntegerParameter("offset", 0);
offset = Util.ensureRange(offset, 0, Integer.MAX_VALUE);
int limit = optIntegerParameter("limit", 10);
limit = Util.ensureRange(limit, 0, 100);
GetEnrollmentsTransaction transaction = new GetEnrollmentsTransaction(userId, offset, limit);
transaction.execute();
ArrayNode statuses = new ArrayNode(JsonNodeFactory.instance);
for (TicketAndStatus ticketAndStatus : transaction.getStatuses()) {
// TODO: We should consider how to join EventEntities and EnrollmentEntities.
// If the event is private (or draft), its information does not be fed.
// However, we show the existence of the event now.
if (ticketAndStatus.event == null || !ticketAndStatus.event.isSearchable())
continue;
ObjectNode obj = new ObjectNode(JsonNodeFactory.instance);
obj.put("ticket", ticketAndStatus.ticket.toSafeJSON());
obj.put("event", ticketAndStatus.event.toSafeJSON());
obj.put("status", ticketAndStatus.status.toString());
statuses.add(obj);
}
ObjectNode obj = new ObjectNode(JsonNodeFactory.instance);
obj.put("totalTicketCount", transaction.getTotalTicketCount());
obj.put("ticketStatuses", statuses);
return renderOK(obj);
}
}
class GetEnrollmentsTransaction extends DBAccess<Void> {
private String userId;
private int offset;
private int limit;
private int totalTicketCount;
private List<TicketAndStatus> statuses;
public GetEnrollmentsTransaction(String userId, int offset, int limit) {
this.userId = userId;
this.offset = offset;
this.limit = limit;
this.statuses = new ArrayList<TicketAndStatus>();
}
@Override
protected Void doExecute(PartakeConnection con, IPartakeDAOs daos) throws DAOException, PartakeException {
IUserTicketAccess enrollmentAccess = daos.getEnrollmentAccess();
List<UserTicket> enrollments = enrollmentAccess.findByUserId(con, userId, offset, limit);
this.totalTicketCount = enrollmentAccess.countByUserId(con, userId);
for (UserTicket enrollment : enrollments) {
if (enrollment == null)
continue;
Event event = daos.getEventAccess().find(con, enrollment.getEventId());
if (event == null)
continue;
EventTicket ticket = daos.getEventTicketAccess().find(con, enrollment.getTicketId());
if (ticket == null)
continue;
CalculatedEnrollmentStatus calculatedEnrollmentStatus = EnrollmentDAOFacade.calculateEnrollmentStatus(con, daos, userId, ticket, event);
TicketAndStatus status = new TicketAndStatus(ticket, event, calculatedEnrollmentStatus);
statuses.add(status);
}
return null;
}
public int getTotalTicketCount() {
return totalTicketCount;
}
public List<TicketAndStatus> getStatuses() {
return this.statuses;
}
}