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.calling.Campaign;
import crmdna.calling.CampaignEntity;
import crmdna.calling.CampaignProp;
import crmdna.calling.CampaignQueryCondition;
import crmdna.common.DateUtils;
import crmdna.common.Utils;
import crmdna.common.api.APIResponse;
import crmdna.common.api.APIResponse.Status;
import crmdna.common.api.APIUtils;
import crmdna.common.api.RequestInfo;
import crmdna.program.Program;
import crmdna.program.ProgramProp;
import javax.annotation.Nullable;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Api(name = "interaction")
public class CampaignApi {
@ApiMethod(path = "createCampaign", httpMethod = HttpMethod.POST)
public APIResponse createCampaign(@Named("client") ClientApi.ClientEnum clientEnum,
@Nullable @Named("clientIfOther") String clientOther,
@Named("programId") long programId,
@Nullable @Named("startYYYYMMDDDefaultToday") Integer startDate,
@Nullable @Named("endYYYYMMDDDefaultProgramStart") Integer endDate,
@Nullable @Named("displayName") String displayName,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) {
String client = null;
String login = null;
try {
client = EndpointUtils.getClient(clientEnum, clientOther);
if (startDate == null) {
startDate = DateUtils.toYYYYMMDD(new Date());
}
ProgramProp programProp = Program.safeGet(client, programId).toProp(client);
if (endDate == null) {
endDate = programProp.startYYYYMMDD;
}
if (displayName == null) {
displayName = programProp.getName();
}
login = Utils.getLoginEmail(user);
CampaignProp campaignProp = Campaign.create(client, programId, displayName, startDate,
endDate, login);
return new APIResponse().status(Status.SUCCESS).object(campaignProp);
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req)
.login(login));
}
}
@ApiMethod(path = "getCampaign", httpMethod = HttpMethod.GET)
public APIResponse getCampaign(@Named("client") ClientApi.ClientEnum clientEnum,
@Nullable @Named("clientIfOther") String clientOther,
@Named("campaignId") long campaignId,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req) {
String client = null;
try {
client = EndpointUtils.getClient(clientEnum, clientOther);
CampaignProp campaignProp = Campaign.safeGet(client, campaignId).toProp();
return new APIResponse().status(Status.SUCCESS).object(campaignProp);
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req));
}
}
@ApiMethod(path = "enableCampaign", httpMethod = HttpMethod.POST)
public APIResponse enableCampaign(@Named("client") ClientApi.ClientEnum clientEnum,
@Nullable @Named("clientIfOther") String clientOther,
@Named("campaignId") long campaignId,
@Named("enabled") boolean enable,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) {
String client = null;
String login = null;
try {
client = EndpointUtils.getClient(clientEnum, clientOther);
login = Utils.getLoginEmail(user);
CampaignProp campaignProp = Campaign.enable(client, campaignId, enable, login);
return new APIResponse().status(Status.SUCCESS).object(campaignProp);
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req)
.login(login));
}
}
@ApiMethod(path = "renameCampaign", httpMethod = HttpMethod.POST)
public APIResponse renameCampaign(@Named("client") ClientApi.ClientEnum clientEnum,
@Nullable @Named("clientIfOther") String clientOther,
@Named("campaignId") long campaignId,
@Named("newName") String displayName,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) {
String client = null;
String login = null;
try {
client = EndpointUtils.getClient(clientEnum, clientOther);
login = Utils.getLoginEmail(user);
CampaignProp campaignProp = Campaign.rename(client, campaignId, displayName, login);
return new APIResponse().status(Status.SUCCESS).object(campaignProp);
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req)
.login(login));
}
}
@ApiMethod(path = "updateDatesForCampaign", httpMethod = HttpMethod.POST)
public APIResponse updateDatesForCampaign(@Named("client") ClientApi.ClientEnum clientEnum,
@Nullable @Named("clientIfOther") String clientOther,
@Named("campaignId") long campaignId,
@Named("newStartYYYYMMDD") Integer newStartDate,
@Named("newEndYYYYMMDD") Integer newEndDate,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) {
String client = null;
String login = null;
try {
client = EndpointUtils.getClient(clientEnum, clientOther);
login = Utils.getLoginEmail(user);
CampaignProp campaignProp = Campaign.updateDates(client, campaignId, newStartDate, newEndDate, login);
return new APIResponse().status(Status.SUCCESS).object(campaignProp);
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req)
.login(login));
}
}
@ApiMethod(path = "deleteCampaign", httpMethod = HttpMethod.POST)
public APIResponse deleteCampaign(@Named("client") ClientApi.ClientEnum clientEnum,
@Nullable @Named("clientIfOther") String clientOther,
@Named("campaignId") long campaignId,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) {
String client = null;
String login = null;
try {
client = EndpointUtils.getClient(clientEnum, clientOther);
login = Utils.getLoginEmail(user);
Campaign.delete(client, campaignId, login);
return new APIResponse().status(Status.SUCCESS).message("Campaign [" + campaignId + "] deleted");
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req)
.login(login));
}
}
@ApiMethod(path = "queryCampaign", httpMethod = HttpMethod.GET)
public APIResponse queryCampaign(@Named("client") ClientApi.ClientEnum clientEnum,
@Nullable @Named("clientIfOther") String clientOther,
@Nullable @Named("groupId") Long groupId,
@Nullable @Named("programId") Long programId,
@Nullable @Named("enabled") Boolean enabled,
@Nullable @Named("endDateGreaterThanYYYYMMDD") Integer endDateGreaterThanYYYYMMDD,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) {
String client = null;
String login = null;
try {
client = EndpointUtils.getClient(clientEnum, clientOther);
login = Utils.getLoginEmail(user);
CampaignQueryCondition qc = new CampaignQueryCondition();
if (groupId != null) {
qc.groupIds.add(groupId);
}
if (programId != null) {
qc.programIds.add(programId);
}
if (enabled != null) {
qc.enabled = enabled;
}
if (endDateGreaterThanYYYYMMDD != null) {
qc.endDateGreaterThanYYYYMMDD = endDateGreaterThanYYYYMMDD;
}
List<CampaignEntity> entities = Campaign.query(client, qc, login);
List<CampaignProp> props = new ArrayList<>();
for (CampaignEntity e : entities) {
props.add(e.toProp());
}
return new APIResponse().status(Status.SUCCESS).object(props);
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req)
.login(login));
}
}
}