package crmdna.api.servlet; import crmdna.common.Utils; import crmdna.common.Utils.Currency; import crmdna.common.api.APIResponse; import crmdna.common.api.APIResponse.Status; import crmdna.common.api.APIUtils; import crmdna.common.api.RequestInfo; import crmdna.group.Group; import crmdna.member.MemberEntity; import crmdna.member.MemberLoader; import crmdna.member.MemberProp; import crmdna.sessionpass.SessionPass; import crmdna.sessionpass.SessionPassProp; import crmdna.user.User; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import static crmdna.common.AssertUtils.ensureNotNull; public class SessionPassServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { String action = request.getParameter("action"); if (action == null) { ServletUtils.setJson(response, new APIResponse().status(Status.ERROR_RESOURCE_NOT_FOUND)); } else { String client = request.getParameter("client"); if (client == null) client = "isha"; String login = ServletUtils.getLogin(request); try { if (action.equals("buySubscription")) { Group.GroupProp groupProp = Group.safeGetByIdOrName(client, ServletUtils.getStrParam(request, "group")).toProp(); Calendar expiry = Calendar.getInstance(); expiry.add(Calendar.MONTH, ServletUtils.getIntParam(request, "expiryInMonths")); MemberEntity memberEntity = MemberLoader.getByEmail(client, login); ensureNotNull(memberEntity); String paymentUrl = SessionPass.buySubscription(client, groupProp.groupId, memberEntity.toProp(), ServletUtils.getIntParam(request, "numSessions"), expiry.getTime(), ServletUtils.getDoubleParam(request, "amount"), Currency.SGD, Group.getPaypalApiCredentials(client, groupProp.groupId, User.SUPER_USER), request.getRequestURL().toString(), ServletUtils.getStrParam(request, "successUrl"), ServletUtils.getStrParam(request, "errorUrl")); response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT); Utils.ensureValidUrl(paymentUrl); response.setHeader("Location", paymentUrl); } else if (action.equals("getNumPasses")) { MemberEntity memberEntity = MemberLoader.getByEmail(client, login); ensureNotNull(memberEntity); SessionPasses passes = new SessionPasses(); passes.email = login; passes.id = memberEntity.getId(); passes.credits = SessionPass.getNumPasses(client, login, true); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(passes)); } else if (action.equals("allocatePasses")) { Calendar expiry = Calendar.getInstance(); expiry.add(Calendar.MONTH, ServletUtils.getIntParam(request, "expiryInMonths")); long groupId = Group.safeGetByIdOrName( client, ServletUtils.getStrParam(request, "group")).toProp().groupId; SessionPass .allocatePasses(client, groupId, ServletUtils.getLongParam(request, "memberId"), ServletUtils.getIntParam(request, "numSessions"), expiry.getTime(), ServletUtils.getDoubleParam(request, "amount"), Currency.SGD, ServletUtils.getStrParam(request, "transactionId"), login); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS)); } else if (action.equals("getValidPasses")) { ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS) .object(SessionPass.getValidPasses(client, login))); } else if (action.equals("bookSession")) { int numPasses = SessionPass.getNumPasses(client, login, true); SessionPass.bookSession(client, login, ServletUtils.getStrParam(request, "practiceType"), ServletUtils.getStrParam(request, "sessionDateTime")); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(numPasses - 1)); } else if (action.equals("cancelBooking")) { SessionPass.cancelBooking(client, ServletUtils.getLongParam(request, "sessionPassId")); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS)); } else if (action.equals("getSessionDetails")) { String sessionDateTime = ServletUtils.getStrParam(request, "sessionDateTime"); SessionDetails sessionDetails = new SessionDetails(); sessionDetails.numRegistered = SessionPass.getNumRegistered(client, sessionDateTime); sessionDetails.isRegistered = SessionPass.isRegistered(client, login, sessionDateTime); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(sessionDetails)); } else if (action.equals("getRegistrations")) { String sessionDateTime = ServletUtils.getStrParam(request, "sessionDateTime"); SessionDetails sessionDetails = new SessionDetails(); sessionDetails.numRegistered = SessionPass.getNumRegistered(client, sessionDateTime); sessionDetails.isRegistered = SessionPass.isRegistered(client, login, sessionDateTime); List<SessionPassProp> props = SessionPass.getRegistrations(client, login, sessionDateTime); List<SessionRegistration> registrations = new ArrayList<>(); for (SessionPassProp prop : props) { MemberProp memberProp = MemberLoader.safeGet(client, prop.memberId, login).toProp(); SessionRegistration reg = new SessionRegistration(); reg.firstName = memberProp.contact.firstName; reg.lastName = memberProp.contact.lastName; reg.phoneNos = memberProp.contact.getPhoneNos(); reg.sessionPassId = prop.sessionPassId; registrations.add(reg); } ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(registrations)); } else { ServletUtils.setJson(response, new APIResponse().status(Status.ERROR_RESOURCE_INCORRECT)); } } catch (Exception ex) { ServletUtils.setJson(response, APIUtils.toAPIResponse(ex, true, new RequestInfo().client(client).req(request).login(login))); } } } public class SessionPasses { String email; long id; long credits; } public class SessionDetails { boolean isRegistered; long numRegistered; } public class SessionRegistration { String firstName; String lastName; String phoneNos; long sessionPassId; } }