package com.sap.hana.cloud.samples.benefits.persistence; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.TypedQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sap.hana.cloud.samples.benefits.odata.beans.BenefitsAmount; import com.sap.hana.cloud.samples.benefits.persistence.manager.EntityManagerProvider; import com.sap.hana.cloud.samples.benefits.persistence.model.Campaign; import com.sap.hana.cloud.samples.benefits.persistence.model.DBQueries; import com.sap.hana.cloud.samples.benefits.persistence.model.User; import com.sap.hana.cloud.samples.benefits.persistence.model.UserPoints; public class UserPointsDAO extends BasicDAO<UserPoints> { private final Logger logger = LoggerFactory.getLogger(this.getClass()); public UserPointsDAO() { super(EntityManagerProvider.getInstance()); } public UserPoints getUserPoints(User user, Campaign campaign) { return getUserPoints(user.getUserId(), campaign.getId()); } public UserPoints getUserPoints(String userId, long campaignId) { final EntityManager em = emProvider.get(); TypedQuery<UserPoints> query = em.createNamedQuery(DBQueries.GET_USER_POINTS, UserPoints.class); query.setParameter("userId", userId); //$NON-NLS-1$ query.setParameter("campaignId", campaignId); //$NON-NLS-1$ UserPoints result = null; try { result = query.getSingleResult(); } catch (NoResultException x) { logger.debug("Could not retrieve user points for userId {} from table {}.", userId, "User"); //$NON-NLS-1$ //$NON-NLS-2$ } catch (NonUniqueResultException e) { throw new IllegalStateException(String.format("More than one entity for userId %s from table User.", userId)); //$NON-NLS-1$ } return result; } public void createCampaignUserPoints(Campaign campaign) { if (campaign.getOwner() != null) { List<User> employees = campaign.getOwner().getEmployees(); Map<String, BenefitsAmount> mapping = createBenefitsAmountMapping(employees); updateUserPoints(campaign, employees, mapping); } } private Map<String, BenefitsAmount> createBenefitsAmountMapping(List<User> employees) { Map<String, BenefitsAmount> mapping = new HashMap<>(); for (User employee : employees) { mapping.put(employee.getUserId(), BenefitsAmount.defaultBenefitsAmount(employee.getUserId())); } return mapping; } private void updateUserPoints(Campaign campaign, List<User> employees, Map<String, BenefitsAmount> mapping) { for (User employee : employees) { BenefitsAmount emplBenefitsAmount = mapping.get(employee.getUserId()); if (emplBenefitsAmount == null) { String errMsg = "Missing benefits amount for the campaign employee " + employee.getUserId(); //$NON-NLS-1$ throw new IllegalStateException(errMsg); } saveNewUserPoints(campaign, employee, emplBenefitsAmount.getTargetPoints()); } } private void saveNewUserPoints(Campaign campaign, User user, long targetPoints) { UserPoints points = getUserPoints(user, campaign); if (points == null) { points = new UserPoints(); points.setCampaign(campaign); points.setUser(user); points.setAvailablePoints(targetPoints); points.setEntitlementPoints(targetPoints); saveNew(points); } else { points.setAvailablePoints(targetPoints); save(points); } } }