package crmdna.api.endpoint; import com.google.api.server.spi.config.Api; import com.google.api.server.spi.config.ApiMethod; import com.google.api.server.spi.config.ApiMethod.HttpMethod; import com.google.appengine.api.users.User; import crmdna.api.endpoint.ClientApi.ClientEnum; import crmdna.common.DateUtils; import crmdna.common.DateUtils.FutureDateRange; import crmdna.common.StopWatch; import crmdna.common.Utils; import crmdna.common.Utils.Currency; import crmdna.common.api.APIException; import crmdna.common.api.APIResponse; import crmdna.common.api.APIResponse.Status; import crmdna.common.api.APIUtils; import crmdna.common.api.RequestInfo; import crmdna.member.MemberLoader; import crmdna.member.MemberProp; import crmdna.member.MemberQueryCondition; import crmdna.sessionpass.SessionPass; import crmdna.sessionpass.SessionPassProp; import crmdna.user.User.ClientLevelPrivilege; import javax.annotation.Nullable; import javax.inject.Named; import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.List; import static crmdna.common.AssertUtils.ensure; @Api(name = "member") public class SessionPassApi { @ApiMethod(path = "allocatePasses", httpMethod = HttpMethod.POST) public APIResponse allocatePasses(@Named("client") ClientEnum clientEnum, @Named("group") ProgramIshaApi.GroupEnum groupEnum, @Named("memberIdOrEmail") String memberIdOrEmail, @Named("numSessions") int numSessions, @Named("expiry") FutureDateRange dateRange, @Named("amount") double amount, @Nullable @Named("currencyDefaultSGD") Currency currency, @Nullable @Named("groupOtherIdOrName") String groupOtherIdOrName, @Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) { String client = Utils.removeSpaceUnderscoreBracketAndHyphen(clientEnum.toString().toLowerCase()); String login = null; if (currency == null) currency = Currency.SGD; try { StopWatch stopWatch = StopWatch.createStarted(); login = Utils.getLoginEmail(user); long memberId = 0; if (Utils.canParseAsLong(memberIdOrEmail)) { memberId = Utils.safeParseAsLong(memberIdOrEmail); MemberLoader.safeGet(client, memberId, login); } else { String email = memberIdOrEmail.toLowerCase(); Utils.ensureValidEmail(email); MemberQueryCondition qc = new MemberQueryCondition(client, 100); qc.email = email; // TODO: query members with valid account List<MemberProp> memberProps = MemberLoader.querySortedProps(qc, login); if (memberProps.isEmpty()) throw new APIException("No member found with email [" + email + "]") .status(Status.ERROR_RESOURCE_NOT_FOUND); if (memberProps.size() > 1) throw new APIException( "Found multiple [" + memberProps.size() + "] members with email [" + email + "]").status(Status.ERROR_RESOURCE_NOT_FOUND); memberId = memberProps.get(0).memberId; } ensure(memberId != 0, "memberId is 0"); String email = MemberLoader.safeGet(client, memberId, login).toProp().contact.email; ensure(Utils.isValidEmailAddress(email), "Email for member id [" + memberId + "] is either not specified or not valid"); long expiryMS = new Date().getTime() + DateUtils.getMilliSecondsFromDateRange(dateRange); long groupId = EndpointUtils.getGroupId(client, groupEnum, groupOtherIdOrName); List<SessionPassProp> sessionPassProps = SessionPass .allocatePasses(client, groupId, memberId, numSessions, new Date(expiryMS), amount, currency, SessionPass.MANUAL_TRANSACTION_ID, login); return new APIResponse().status(Status.SUCCESS).object(sessionPassProps) .message("Allocated [" + numSessions + "] session passes for [" + email + "]") .processingTimeInMS(stopWatch.msElapsed()); } catch (Exception ex) { return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req) .login(login)); } } @ApiMethod(path = "cancelBooking", httpMethod = HttpMethod.POST) public APIResponse cancelBooking(@Named("client") ClientEnum clientEnum, @Named("sessionPassIds") List<Long> sessionPassIds, HttpServletRequest req, User user) { String client = Utils.removeSpaceUnderscoreBracketAndHyphen(clientEnum.toString().toLowerCase()); String login = Utils.getLoginEmail(user); crmdna.user.User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_SESSION_PASS); try { for (long id : sessionPassIds) { SessionPass.cancelBooking(client, id); } return new APIResponse().status(Status.SUCCESS); } catch (Exception ex) { return APIUtils.toAPIResponse(ex, false, new RequestInfo().client(client).req(req).login(login)); } } }