package com.sap.hana.cloud.samples.benefits.odata;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportEntitySets.CAMPAIGNS;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportNames.ADD_CAMPAIGN;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportNames.DELETE_CAMPAIGN;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportNames.EDIT_CAMPAIGN;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportNames.HR_CAMPAIGNS;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportNames.START_CAMPAIGN;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportNames.STOP_CAMPAIGN;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportNames.USER_CAMPAIGNS;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportParameters.CAMPAIGN_ID;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportParameters.NAME;
import static com.sap.hana.cloud.samples.benefits.odata.cfg.FunctionImportParameters.START_DATE;
import static org.apache.olingo.odata2.api.annotation.edm.EdmType.DATE_TIME;
import static org.apache.olingo.odata2.api.annotation.edm.EdmType.INT64;
import static org.apache.olingo.odata2.api.annotation.edm.EdmType.STRING;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.apache.olingo.odata2.api.annotation.edm.EdmFunctionImport;
import org.apache.olingo.odata2.api.annotation.edm.EdmFunctionImport.HttpMethod;
import org.apache.olingo.odata2.api.annotation.edm.EdmFunctionImport.ReturnType;
import org.apache.olingo.odata2.api.annotation.edm.EdmFunctionImport.ReturnType.Type;
import org.apache.olingo.odata2.api.annotation.edm.EdmFunctionImportParameter;
import com.sap.hana.cloud.samples.benefits.odata.beans.StartCampaignDetails;
import com.sap.hana.cloud.samples.benefits.persistence.UserPointsDAO;
import com.sap.hana.cloud.samples.benefits.persistence.model.Campaign;
import com.sap.hana.cloud.samples.benefits.persistence.model.User;
public class CampaignService extends ODataService {
@EdmFunctionImport(name = USER_CAMPAIGNS, entitySet = CAMPAIGNS, returnType = @ReturnType(type = Type.ENTITY, isCollection = true))
public List<Campaign> getUserCampaigns() {
final User currentUser = getLoggedInSfUser();
User hr = currentUser.getHrManager();
return hr != null ? hr.getCampaigns() : Collections.<Campaign> emptyList();
}
@EdmFunctionImport(name = HR_CAMPAIGNS, entitySet = CAMPAIGNS, returnType = @ReturnType(type = Type.ENTITY, isCollection = true))
public List<Campaign> getHrCampaigns() {
final User currentUser = getLoggedInSfUser();
return currentUser.getCampaigns();
}
@EdmFunctionImport(name = START_CAMPAIGN, returnType = @ReturnType(type = Type.SIMPLE, isCollection = false), httpMethod = HttpMethod.POST)
public boolean startCampaign(@EdmFunctionImportParameter(name = CAMPAIGN_ID, type = INT64) Long campaignId) {
final StartCampaignDetails startCampaignDetails = this.canStartCampaign(campaignId);
if (startCampaignDetails.getCanBeStarted()) {
final Campaign campaign = campaignDAO.getById(campaignId);
campaign.setActive(true);
campaignDAO.save(campaign);
return true;
}
return false;
}
private StartCampaignDetails canStartCampaign(Long campaignId) {
final StartCampaignDetails response = new StartCampaignDetails();
response.setCampaignId(campaignId);
Campaign compaign = campaignDAO.getById(campaignId);
final boolean isValidCampaign = this.isValidCampaign(compaign);
final Campaign activeCampaign = campaignDAO.getActiveCampaign(getLoggedInSfUser());
final boolean canBeStarted = activeCampaign == null || activeCampaign.getId().equals(campaignId);
if (isValidCampaign && canBeStarted) {
response.setCanBeStarted(true);
} else {
response.setCanBeStarted(false);
if (activeCampaign != null) {
response.setStartedCampaignName(activeCampaign.getName());
}
}
return response;
}
@EdmFunctionImport(name = STOP_CAMPAIGN, returnType = @ReturnType(type = Type.SIMPLE, isCollection = false), httpMethod = HttpMethod.POST)
public boolean stopCampaign(@EdmFunctionImportParameter(name = CAMPAIGN_ID, type = INT64) Long campaignId) throws AppODataException {
final Campaign campaign = campaignDAO.getById(campaignId);
if (campaign == null) {
throw new AppODataException("Campaign with this name does not exist"); //$NON-NLS-1$
}
campaign.setActive(false);
campaignDAO.save(campaign);
return true;
}
@EdmFunctionImport(name = ADD_CAMPAIGN, returnType = @ReturnType(type = Type.SIMPLE, isCollection = false), httpMethod = HttpMethod.POST)
public boolean addCampaign(@EdmFunctionImportParameter(name = NAME, type = STRING) String campaignName) throws AppODataException {
final User user = getLoggedInSfUser();
if (campaignDAO.getByCaseInsensitiveName(campaignName, user) != null) {
throw new AppODataException("Campaign with this name already exist"); //$NON-NLS-1$
}
final Campaign newCampaign = new Campaign();
newCampaign.setName(campaignName);
newCampaign.setOwner(user);
campaignDAO.saveNew(newCampaign);
new UserPointsDAO().createCampaignUserPoints(newCampaign);
return true;
}
@EdmFunctionImport(name = DELETE_CAMPAIGN, returnType = @ReturnType(type = Type.SIMPLE, isCollection = false), httpMethod = HttpMethod.DELETE)
public boolean deleteCampaign(@EdmFunctionImportParameter(name = CAMPAIGN_ID, type = INT64) Long campaignId) throws AppODataException {
try {
campaignDAO.delete(campaignId);
return true;
} catch (IllegalArgumentException ex) {
throw new AppODataException("Error occur while deleting campaign", ex); //$NON-NLS-1$
}
}
private boolean isValidCampaign(Campaign campaign) {
if (campaign == null || campaign.getName() == null || campaign.getStartDate() == null || campaign.getEndDate() == null) {
return false;
}
if (campaign.getStartDate().compareTo(campaign.getEndDate()) >= 0) {
return false;
}
return true;
}
@EdmFunctionImport(name = EDIT_CAMPAIGN, returnType = @ReturnType(type = Type.SIMPLE, isCollection = false), httpMethod = HttpMethod.POST)
public boolean editCampaign(@EdmFunctionImportParameter(name = START_DATE, type = DATE_TIME) Date startDate,
@EdmFunctionImportParameter(name = "endDate", type = DATE_TIME) Date endDate,
@EdmFunctionImportParameter(name = "campaignid", type = INT64) Long campaignId) throws AppODataException {
final Campaign selectedCampaign = campaignDAO.getById(campaignId);
if (selectedCampaign == null) {
throw new AppODataException("Campaign does not exist"); //$NON-NLS-1$
} else if (startDate == null || endDate == null || startDate.compareTo(endDate) >= 0) {
throw new AppODataException("Incorrect campaign dates"); //$NON-NLS-1$
}
selectedCampaign.setStartDate(startDate);
selectedCampaign.setEndDate(endDate);
campaignDAO.save(selectedCampaign);
return true;
}
}