package in.partake.controller.api.event; import in.partake.base.DateTime; import in.partake.base.PartakeException; import in.partake.base.TimeUtil; import in.partake.controller.api.AbstractPartakeAPI; import in.partake.model.IPartakeDAOs; import in.partake.model.UserEx; import in.partake.model.access.Transaction; import in.partake.model.dao.DAOException; import in.partake.model.dao.PartakeConnection; import in.partake.model.daofacade.EventDAOFacade; import in.partake.model.dto.Event; import in.partake.model.dto.EventTicket; import in.partake.resource.UserErrorCode; import java.util.Calendar; import java.util.Collections; import org.apache.commons.lang.StringUtils; import org.codehaus.jackson.node.JsonNodeFactory; import org.codehaus.jackson.node.ObjectNode; import play.mvc.Result; public class CreateAPI extends AbstractPartakeAPI { public static Result post() throws DAOException, PartakeException { return new CreateAPI().execute(); } @Override protected Result doExecute() throws DAOException, PartakeException { UserEx user = ensureLogin(); ensureValidSessionToken(); if (user.isBanned()) { throw new PartakeException(UserErrorCode.BANNED_USER); } Event embryo = new Event(); embryo.setOwnerId(user.getId()); embryo.setDraft(optBooleanParameter("draft", true)); embryo.setCreatedAt(TimeUtil.getCurrentDateTime()); // Title String title = getParameter("title"); if (StringUtils.isBlank(title) || title.length() > 100) return renderInvalid(UserErrorCode.INVALID_PARAMETERS, Collections.singletonMap("title", "タイトルは 100 文字以下で必ず入力してください。")); embryo.setTitle(title); // beginDate { DateTime beginDate = getDateTimeParameter("beginDate"); if (beginDate == null) return renderInvalid(UserErrorCode.INVALID_PARAMETERS, Collections.singletonMap("beginDate", "開始日時は必ず入力して下さい。")); Calendar beginCalendar = TimeUtil.calendar(beginDate.toDate()); if (beginCalendar.get(Calendar.YEAR) < 2000 || 2100 < beginCalendar.get(Calendar.YEAR)) return renderInvalid(UserErrorCode.INVALID_PARAMETERS, Collections.singletonMap("beginDate", "開始日時の範囲が不正です。")); embryo.setBeginDate(beginDate); } // endDate { DateTime endDate = getDateTimeParameter("endDate"); if (endDate != null) { Calendar endCalendar = TimeUtil.calendar(endDate.toDate()); if (endCalendar.get(Calendar.YEAR) < 2000 || 2100 < endCalendar.get(Calendar.YEAR)) return renderInvalid(UserErrorCode.INVALID_PARAMETERS, Collections.singletonMap("endDate", "終了日時の範囲が不正です。")); if (!embryo.getBeginDate().isBefore(endDate)) return renderInvalid(UserErrorCode.INVALID_PARAMETERS, Collections.singletonMap("endDate", "終了日時が開始日時より前になっています。")); } embryo.setEndDate(endDate); } String eventId = new CreateTransaction(embryo).execute(); ObjectNode obj = new ObjectNode(JsonNodeFactory.instance); obj.put("eventId", eventId); return renderOK(obj); } } class CreateTransaction extends Transaction<String> { private Event event; public CreateTransaction(Event event) { this.event = event; } @Override protected String doExecute(PartakeConnection con, IPartakeDAOs daos) throws DAOException, PartakeException { String eventId = EventDAOFacade.create(con, daos, event); event.setId(eventId); EventTicket ticket = EventTicket.createDefaultTicket(daos.getEventTicketAccess().getFreshId(con), eventId); daos.getEventTicketAccess().put(con, ticket); return eventId; } }