package org.xcolab.client.activities; import org.xcolab.client.activities.exceptions.ActivityEntryNotFoundException; import org.xcolab.client.activities.exceptions.ActivitySubscriptionNotFoundException; import org.xcolab.client.activities.pojo.ActivityEntry; import org.xcolab.client.activities.pojo.ActivitySubscription; import org.xcolab.util.IdListUtil; import org.xcolab.util.enums.activity.ActivityEntryType; import org.xcolab.util.http.caching.CacheKeys; import org.xcolab.util.http.caching.CacheName; import org.xcolab.util.http.client.RestResource; import org.xcolab.util.http.client.RestResource1; import org.xcolab.util.http.client.RestService; import org.xcolab.util.http.exceptions.EntityNotFoundException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public final class ActivitiesClient { private static final Map<RestService, ActivitiesClient> instances = new HashMap<>(); private final RestService activitiesService; private final RestResource<ActivityEntry, Long> activityEntryResource; private final RestResource<ActivitySubscription, Long> activitySubscriptionResource; private ActivitiesClient(RestService activityService) { this.activitiesService = activityService; activityEntryResource = new RestResource1<>(activitiesService, "activityEntries", ActivityEntry.TYPES); activitySubscriptionResource = new RestResource1<>(activitiesService, "activitySubscriptions", ActivitySubscription.TYPES); } public ActivityEntry createActivityEntry(Long memberId, Long classPrimaryKey, String extraData, Integer providerType) { return activityEntryResource.service("createActivityEntry", ActivityEntry.class) .queryParam("providerType", providerType) .queryParam("memberId", memberId) .queryParam("classPrimaryKey",classPrimaryKey) .queryParam("extraData",extraData) .post(); } public ActivityEntry getActivityEntry(Long activityEntryId) throws ActivityEntryNotFoundException { try { return activityEntryResource.get(activityEntryId) .withCache(CacheKeys.of(ActivityEntry.class, activityEntryId), CacheName.MISC_REQUEST) .executeChecked(); } catch (EntityNotFoundException e) { throw new ActivityEntryNotFoundException( "ActivityEntry with id " + activityEntryId + " not found."); } } public List<ActivityEntry> getActivityEntries(Integer startRecord, Integer limitRecord, Long memberId, List<Long> memberIdsToExclude) { return activityEntryResource.list() .optionalQueryParam("startRecord", startRecord) .optionalQueryParam("limitRecord", limitRecord) .optionalQueryParam("memberId", memberId) .optionalQueryParam("memberIdsToExclude", IdListUtil.getStringFromIds(memberIdsToExclude)) .execute(); } public List<ActivityEntry> getActivityEntriesAfter(Date afterDate) { if (afterDate == null) { return null; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return activityEntryResource.list() .queryParam("activitiesAfter", sdf.format(afterDate)) .execute(); } public Integer countActivities(Long memberId, List<Long> memberIdsToExclude) { try { return activityEntryResource.<ActivityEntry, Integer>service("count", Integer.class) .optionalQueryParam("memberId", memberId) .optionalQueryParam("memberIdsToExclude", memberIdsToExclude) .withCache(CacheKeys.withClass(ActivityEntry.class) .withParameter("memberId", memberId) .withParameter("memberIdsToExclude", memberIdsToExclude) .asCount(), CacheName.MISC_REQUEST) .getChecked(); } catch (EntityNotFoundException e) { return 0; } } public ActivitySubscription getActivitySubscription(long activitySubscriptionId) throws ActivitySubscriptionNotFoundException { try { return activitySubscriptionResource .get(activitySubscriptionId) .withCache(CacheKeys.of(ActivitySubscription.class, activitySubscriptionId), CacheName.MISC_REQUEST) .executeChecked(); } catch (EntityNotFoundException e) { throw new ActivitySubscriptionNotFoundException( "ActivitySubscription with id " + activitySubscriptionId + " not found."); } } public ActivitySubscription createActivitySubscription( ActivitySubscription activitySubscription) { return activitySubscriptionResource.create(activitySubscription).execute(); } public boolean deleteSubscription(Long pk) { return activitySubscriptionResource.delete(pk).execute(); } public ActivitySubscription addSubscription(long memberId, ActivityEntryType activityEntryType, long classPK, String extraInfo) { return activitySubscriptionResource.service("subscribe", ActivitySubscription.class) .queryParam("receiverId", memberId) .queryParam("activityEntryType", activityEntryType) .queryParam("classPK", classPK) .queryParam("extraInfo", extraInfo) .post(); } public boolean deleteSubscription(Long receiverId, ActivityEntryType activityEntryType, Long classPK, String extraInfo) { return activitySubscriptionResource.service("deleteIfSubscribed", Boolean.class) .queryParam("receiverId", receiverId) .queryParam("activityEntryType", activityEntryType) .queryParam("classPK", classPK) .queryParam("extraInfo", extraInfo) .delete(); } public boolean deleteSubscriptionById(Long subscriptionId) { return activitySubscriptionResource.delete(subscriptionId).execute(); } public boolean isSubscribedToActivity(Long receiverId, Long classNameId, Long classPK, Integer type, String extraInfo) { return activitySubscriptionResource.service("isSubscribed", Boolean.class) .queryParam("receiverId", receiverId) .queryParam("classNameId", classNameId) .queryParam("classPK", classPK) .queryParam("extraInfo", extraInfo) .queryParam("type", type) .get(); } public List<ActivitySubscription> getActivitySubscriptions(Long classNameId, Long classPK, Long receiverId) { return activitySubscriptionResource.list() .optionalQueryParam("classNameId", classNameId) .optionalQueryParam("classPK", classPK) .optionalQueryParam("receiverId", receiverId) .execute(); } public List<ActivitySubscription> getActivitySubscriptionsForMember(Long memberId) { return getActivitySubscriptions(null, null, memberId); } public static ActivitiesClient fromService(RestService activitiesService) { ActivitiesClient client = instances.get(activitiesService); if (client == null) { client = new ActivitiesClient(activitiesService); instances.put(activitiesService, client); } return client; } }