Package in.partake.controller.action.event

Source Code of in.partake.controller.action.event.EventShowTransaction

package in.partake.controller.action.event;

import in.partake.base.PartakeException;
import in.partake.controller.action.AbstractPartakeAction;
import in.partake.controller.base.permission.DraftEventEditPermission;
import in.partake.controller.base.permission.PrivateEventShowPermission;
import in.partake.model.EventCommentEx;
import in.partake.model.EventEx;
import in.partake.model.EventMessageEx;
import in.partake.model.EventTicketHolderList;
import in.partake.model.IPartakeDAOs;
import in.partake.model.UserEx;
import in.partake.model.UserTicketEx;
import in.partake.model.access.DBAccess;
import in.partake.model.dao.DAOException;
import in.partake.model.dao.PartakeConnection;
import in.partake.model.daofacade.EnrollmentDAOFacade;
import in.partake.model.daofacade.EventDAOFacade;
import in.partake.model.daofacade.MessageDAOFacade;
import in.partake.model.dto.EventTicket;
import in.partake.model.dto.UserTicket;
import in.partake.resource.ServerErrorCode;
import in.partake.resource.UserErrorCode;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.lang.StringUtils;

import play.mvc.Result;

public class EventShowAction extends AbstractPartakeAction {
    private String eventId;

    private EventEx event;
    private boolean needsPasscode;
    private List<EventTicket> tickets;
    private Map<UUID, UserTicket> userTicketMap;
    private Map<UUID, EventTicketHolderList> ticketHolderListMap;
    private List<EventCommentEx> comments;
    private List<EventMessageEx> eventMessages;

    public static Result get(String eventId) throws DAOException, PartakeException {
        EventShowAction action = new EventShowAction();
        action.eventId = eventId;

        return action.execute();
    }

    @Override
    protected Result doExecute() throws DAOException, PartakeException {
        checkIdParameterIsValid(eventId, UserErrorCode.INVALID_NOTFOUND, UserErrorCode.INVALID_NOTFOUND);

        // User might be logged in, might not be logged in. So using ensureLoginUser() is inappropriate.
        UserEx user = getLoginUser();

        EventShowTransaction transaction = new EventShowTransaction(user, eventId, session());
        transaction.execute();

        event = transaction.getEvent();
        if (event == null)
            return renderNotFound();

        if (transaction.isNeedsPasscode()) {
            this.event = null;
            return renderRedirect("/events/passcode?eventId=" + eventId);
        }

        this.tickets = transaction.getEventTickets();
        this.userTicketMap = transaction.getUserTicketMap();
        this.ticketHolderListMap = transaction.getTicketHolderListMap();
        this.comments = transaction.getComments();
        this.eventMessages = transaction.getEventMessages();

        if (event.getForeImageId() != null) {
            context().setThumbnailURL("/images/thumbnail/" + event.getForeImageId());
        }
        return render(views.html.events.show.render(context(), event, user, tickets, userTicketMap, ticketHolderListMap, comments, eventMessages));
    }

    public EventEx getEvent() {
        return event;
    }

    public boolean isNeedsPasscode() {
        return needsPasscode;
    }

    public Map<UUID, EventTicketHolderList> getTicketHolderListMap() {
        return ticketHolderListMap;
    }

    public List<EventCommentEx> getComments() {
        return comments;
    }

    public List<EventMessageEx> getEventMessages() {
        return eventMessages;
    }

    public List<EventTicket> getTickets() {
        return tickets;
    }

    public Map<UUID, UserTicket> getUserTicketMap() {
        return this.userTicketMap;
    }
}

class EventShowTransaction extends DBAccess<Void> {
    private UserEx user;
    private String eventId;
    private Map<String, String> session; // TODO: Bad style...

    private EventEx event;
    private boolean needsPasscode;

    private Map<UUID, EventTicketHolderList> ticketHolderListMap;
    private Map<UUID, UserTicket> userTicketMap;

    private List<EventTicket> tickets;
    private List<EventCommentEx> comments;
    private List<EventMessageEx> eventMessages;

    public EventShowTransaction(UserEx user, String eventId, Map<String, String> session) {
        this.user = user;
        this.eventId = eventId;
        this.session = session;
    }

    @Override
    protected Void doExecute(PartakeConnection con, IPartakeDAOs daos) throws DAOException, PartakeException {
        event = EventDAOFacade.getEventEx(con, daos, eventId);
        if (event == null)
            return null;

        if (event.isDraft()) {
            // If the event is draft, only owner can see it.
            if (user == null || !DraftEventEditPermission.check(event, user))
                throw new PartakeException(UserErrorCode.FORBIDDEN_EVENT_EDIT);
        }

        if (!StringUtils.isBlank(event.getPasscode())) {
            // owner および manager は見ることが出来る。
            String passcode = (String) session.get(eventId);
            if (user != null && PrivateEventShowPermission.check(event, user)) {
                // OK. You have the right to show this event.
            } else if (StringUtils.equals(event.getPasscode(), passcode)) {
                // OK. The same passcode.
            } else {
                // public でなければ、passcode を入れなければ見ることが出来ない
                // We make this.event null for foolproof.
                this.needsPasscode = true;
                return null;
            }
        }

        tickets = daos.getEventTicketAccess().findEventTicketsByEventId(con, eventId);

        // ----- participants を反映
        ticketHolderListMap = new HashMap<UUID, EventTicketHolderList>();
        userTicketMap = new HashMap<UUID, UserTicket>();
        for (EventTicket ticket : tickets) {
            List<UserTicketEx> participations = EnrollmentDAOFacade.getEnrollmentExs(con, daos, ticket, event);
            if (participations == null)
                throw new PartakeException(ServerErrorCode.PARTICIPATIONS_RETRIEVAL_ERROR);

            ticketHolderListMap.put(ticket.getId(), ticket.calculateParticipationList(event, participations));
            if (user != null)
                userTicketMap.put(ticket.getId(), daos.getEnrollmentAccess().findByTicketIdAndUserId(con, ticket.getId(), user.getId()));
        }

        comments = EventDAOFacade.getCommentsExByEvent(con, daos, eventId);
        eventMessages = MessageDAOFacade.findEventMessageExs(con, daos, eventId, 0, 100);

        return null;
    }

    public EventEx getEvent() {
        return event;
    }

    public boolean isNeedsPasscode() {
        return needsPasscode;
    }

    public Map<UUID, EventTicketHolderList>getTicketHolderListMap() {
        return ticketHolderListMap;
    }

    public Map<UUID, UserTicket> getUserTicketMap() {
        return userTicketMap;
    }

    public List<EventCommentEx> getComments() {
        return comments;
    }

    public List<EventMessageEx> getEventMessages() {
        return eventMessages;
    }

    public List<EventTicket> getEventTickets() {
        return tickets;
    }
}
TOP

Related Classes of in.partake.controller.action.event.EventShowTransaction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.