package crmdna.interaction; import crmdna.calling.Campaign; import crmdna.calling.CampaignProp; import crmdna.client.Client; import crmdna.common.DateUtils; import crmdna.common.api.APIException; import crmdna.common.api.APIResponse; import crmdna.member.MemberLoader; import crmdna.user.User; import crmdna.user.User.ClientLevelPrivilege; import java.util.Date; import static crmdna.common.AssertUtils.ensure; import static crmdna.common.AssertUtils.ensureNotNull; public class Interaction { public static InteractionProp createInteraction(String client, long memberId, String content, InteractionType interactionType, Date timestamp, Long campaignId, boolean ensureWithinCampaignDates, String login) { Client.ensureValid(client); User.ensureValidUser(client, login); ensureNotNull(interactionType, "interactionType is null"); MemberLoader.safeGet(client, memberId, login); long userId = User.safeGet(client, login).toProp(client).userId; if (timestamp == null) timestamp = new Date(); // current time if (campaignId != null) { CampaignProp campaignProp = Campaign.safeGet(client, campaignId).toProp(); if (ensureWithinCampaignDates) { long yyyymmdd = DateUtils.toYYYYMMDD(timestamp); if (yyyymmdd < campaignProp.startYYYYMMDD || yyyymmdd > campaignProp.endYYYYMMDD) { throw new APIException().status(APIResponse.Status.ERROR_RESOURCE_INCORRECT) .object("Timestamp does not fall with campaign start [" + campaignProp.startYYYYMMDD + "] and end [" + campaignProp.endYYYYMMDD + "] dates. To suppress this validation change flag ensureWithinCampaignDates to false"); } } ensure(campaignProp.enabled, "Campaign [" + campaignProp.campaignId + "] is disabled"); } InteractionProp interactionProp = InteractionCore.createInteraction(client, memberId, content, interactionType.toString(), timestamp, userId, campaignId, login); //interaction score is anyway approximate. no need to update score in a transaction InteractionScore.incrementBy1(client, login, memberId); return interactionProp; } public static void deleteInteraction(String client, long interactionId, String login) { Client.ensureValid(client); User.ensureValidUser(client, login); long userId = User.safeGet(client, login).toProp(client).userId; ensure(interactionId != 0, "interaction id is 0"); InteractionEntity entity = InteractionCore.safeGet(client, interactionId); // need previlage for deleting someone else's interaction if (entity.userId != userId) { User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_INTERACTION); } InteractionCore.deleteInteraction(client, interactionId); } public static InteractionProp updateInteraction(String client, long interactionId, Long newMemberId, InteractionType newInteractionType, String newUser, String login) { Client.ensureValid(client); User.ensureValidUser(client, login); InteractionEntity entity = InteractionCore.safeGet(client, interactionId); if (newMemberId != null) MemberLoader.safeGet(client, newMemberId, login); long userId = User.safeGet(client, login).toProp(client).userId; // need privilege to update someone else's interaction if (entity.userId != userId) User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_INTERACTION); Long newUserId = null; if (newUser != null) { newUserId = User.safeGet(client, newUser).toProp(client).userId; ensureNotNull(newUserId); if (newUserId != entity.userId) User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_INTERACTION); } return InteractionCore.updateInteraction(client, interactionId, newMemberId, newInteractionType != null ? newInteractionType.toString() : null, newUserId, newUser); } public static InteractionQueryResult query(String client, InteractionQueryCondition qc, String login) { Client.ensureValid(client); User.ensureValidUser(client, login); return InteractionCore.query(client, qc); } public static int count(String client, InteractionQueryCondition qc) { return InteractionCore.queryKeys(client, qc).size(); } public static void createSubInteraction(String client, long interactionId, String content, Date timestamp, String login) { Client.ensureValid(client); User.ensureValidUser(client, login); ensure(interactionId != 0, "interactionId is 0"); InteractionEntity interactionEntity = InteractionCore.safeGet(client, interactionId); long userId = User.safeGet(client, login).toProp(client).userId; if (interactionEntity.userId != userId) { User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_INTERACTION); } if (null == timestamp) timestamp = new Date(); InteractionCore.createSubInteraction(client, interactionId, content, timestamp); //interaction score is anyway approximate. no need to update score in a transaction InteractionScore.incrementBy1(client, login, interactionEntity.memberId); } public static void deleteSubInteraction(String client, long interactionId, long subinteractionId, String login) { Client.ensureValid(client); User.ensureValidUser(client, login); ensure(interactionId != 0, "interactionId is 0"); InteractionEntity entity = InteractionCore.safeGet(client, interactionId); long userId = User.safeGet(client, login).toProp(client).userId; if (entity.userId != userId) User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_INTERACTION); InteractionCore.deleteSubInteraction(client, interactionId, subinteractionId); } public static void updateSubInteraction(String client, long interactionId, long subInteractionId, String content, String login) { Client.ensureValid(client); InteractionEntity interactionEntity = InteractionCore.safeGet(client, interactionId); long userId = User.safeGet(client, login).toProp(client).userId; if (interactionEntity.userId != userId) User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_INTERACTION); InteractionCore.updateSubInteraction(client, interactionId, subInteractionId, content, null); } public enum InteractionType { PHONE, EMAIL, FB, GOOGLEPLUS, SMS, FACETOFACE, WEBSITE, OTHER } }