package org.xcolab.client.proposals; import org.xcolab.client.activities.ActivitiesClient; import org.xcolab.client.activities.enums.ActivityProvidersType; import org.xcolab.client.activities.helper.ActivityEntryHelper; import org.xcolab.client.members.UsersGroupsClient; import org.xcolab.client.proposals.exceptions.MembershipRequestNotFoundException; import org.xcolab.client.proposals.exceptions.ProposalNotFoundException; import org.xcolab.client.proposals.pojo.Proposal; import org.xcolab.client.proposals.pojo.team.MembershipRequest; import org.xcolab.client.proposals.pojo.team.MembershipRequestDto; import org.xcolab.util.clients.CoLabService; import org.xcolab.util.enums.activity.ActivityEntryType; import org.xcolab.util.enums.membershiprequest.MembershipRequestStatus; import org.xcolab.util.exceptions.InternalException; import org.xcolab.util.http.caching.CacheKeys; import org.xcolab.util.http.caching.CacheName; import org.xcolab.util.http.client.RestResource1; import org.xcolab.util.http.client.RestService; import org.xcolab.util.http.dto.DtoUtil; import org.xcolab.util.http.exceptions.Http409ConflictException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class MembershipClient { private static final Map<RestService, MembershipClient> instances = new HashMap<>(); private final RestService proposalService; private final RestResource1<MembershipRequestDto, Long> membershipRequestResource; private final ProposalClient proposalClient; private MembershipClient(RestService proposalService) { membershipRequestResource = new RestResource1<>(proposalService, "membershipRequests", MembershipRequestDto.TYPES); proposalClient = ProposalClient.fromService(proposalService); this.proposalService = proposalService; } public static MembershipClient fromService(RestService proposalService) { return instances .computeIfAbsent(proposalService, MembershipClient::new); } public void denyMembershipRequest(long proposalId, long userId, long membershipRequestId, String reply, long updateAuthorId) { if (hasUserRequestedMembership(proposalId, userId)) { try { MembershipRequest membershipRequest = getMembershipRequest(membershipRequestId); membershipRequest.setStatusId(MembershipRequestStatus.STATUS_DENIED); membershipRequest.setReplierUserId(updateAuthorId); membershipRequest.setReplyComments(reply); membershipRequest.setReplyDate(new Timestamp((new Date()).getTime())); updateMembershipRequest(membershipRequest); } catch (MembershipRequestNotFoundException ignored) { } } } public boolean updateMembershipRequest(MembershipRequest membershipRequest) { return membershipRequestResource .update(new MembershipRequestDto(membershipRequest), membershipRequest.getMembershipRequestId()) .execute(); } public Boolean hasUserRequestedMembership(Long proposalId, Long userId) { try { Long groupId = proposalClient.getProposal(proposalId).getGroupId(); List<MembershipRequest> userRequests = getMembershipRequestsByUser(groupId, userId); if (userRequests != null && !userRequests.isEmpty()) { return true; } } catch (ProposalNotFoundException ignored) { } return false; } public List<MembershipRequest> getMembershipRequestsByUser(Long groupId, Long userId) { return DtoUtil.toPojos(membershipRequestResource.list() .withCache(CacheKeys.withClass(MembershipRequestDto.class) .withParameter("groupId", groupId) .withParameter("userId", userId).asList(), CacheName.MISC_MEDIUM) .optionalQueryParam("groupId", groupId) .optionalQueryParam("userId", userId) .execute(), proposalService); } public MembershipRequest getMembershipRequest(long MembershipRequestId) throws MembershipRequestNotFoundException { return membershipRequestResource.get(MembershipRequestId) .execute().toPojo(proposalService); } public void approveMembershipRequest(long proposalId, Long userId, MembershipRequest request, String reply, Long updateAuthorId) { if (hasUserRequestedMembership(proposalId, userId)) { try { MembershipRequest membershipRequest = getMembershipRequest(request.getMembershipRequestId()); membershipRequest.setStatusId(MembershipRequestStatus.STATUS_APPROVED); membershipRequest.setReplierUserId(updateAuthorId); membershipRequest.setReplyComments(reply); membershipRequest.setReplyDate(new Timestamp((new Date()).getTime())); updateMembershipRequest(membershipRequest); RestService memberService = proposalService.withServiceName(CoLabService.MEMBER.getServiceName()); UsersGroupsClient usersGroupsClient = UsersGroupsClient.fromService(memberService); try { usersGroupsClient.createUsersGroups(userId, membershipRequest.getGroupId()); RestService activitiesService = proposalService.withServiceName(CoLabService.ACTIVITY.getServiceName()); ActivitiesClient activityClient = ActivitiesClient.fromService(activitiesService); ActivityEntryHelper.createActivityEntry(activityClient,userId, proposalId, null, ActivityProvidersType.ProposalMemberAddedActivityEntry.getType()); if (!activityClient.isSubscribedToActivity(userId, ActivityEntryType.PROPOSAL.getPrimaryTypeId(), proposalId, 0, "")) { activityClient .addSubscription(userId, ActivityEntryType.PROPOSAL, proposalId, null); } } catch (Http409ConflictException ignored) { // already a member - don't do anything } } catch (MembershipRequestNotFoundException e) { throw new InternalException(e); } } } public MembershipRequest addInvitedMembershipRequest(Long proposalId, Long userId, String comment) { return createMembershipRequest(proposalId, userId, comment, MembershipRequestStatus.STATUS_PENDING_INVITED); } private MembershipRequest createMembershipRequest(Long proposalId, Long userId, String comment, Integer status) { try { Long groupId = proposalClient.getProposal(proposalId).getGroupId(); MembershipRequest membershipRequest = new MembershipRequest(); membershipRequest.setComments(comment == null ? "" : comment); membershipRequest.setUserId(userId); membershipRequest.setGroupId(groupId); membershipRequest.setCompanyId(10112L); membershipRequest.setStatusId(status); membershipRequest = createMembershipRequest(membershipRequest); return membershipRequest; } catch (ProposalNotFoundException ignored) { } return null; } public MembershipRequest createMembershipRequest(MembershipRequest membershipRequest) { return membershipRequestResource.create(new MembershipRequestDto(membershipRequest)) .execute().toPojo(proposalService); } public MembershipRequest addRequestedMembershipRequest(Long proposalId, Long userId, String comment) { return createMembershipRequest(proposalId, userId, comment, MembershipRequestStatus.STATUS_PENDING_REQUESTED); } public List<MembershipRequest> getMembershipRequests(Long proposalId) { try { Proposal proposal = proposalClient.getProposal(proposalId); List<MembershipRequest> invited = getMembershipRequestsByStatus(proposal.getGroupId(), MembershipRequestStatus.STATUS_PENDING_INVITED); List<MembershipRequest> requested = getMembershipRequestsByStatus(proposal.getGroupId(), MembershipRequestStatus.STATUS_PENDING_REQUESTED); List<MembershipRequest> olderRequests = getMembershipRequestsByStatus(proposal.getGroupId(), MembershipRequestStatus.STATUS_PENDING); List<MembershipRequest> combined = new ArrayList<>(); if (invited != null && !invited.isEmpty()) { combined.addAll(invited); } if (requested != null && !requested.isEmpty()) { combined.addAll(requested); } if (olderRequests != null && !olderRequests.isEmpty()) { combined.addAll(olderRequests); } return combined; } catch (ProposalNotFoundException ignored) { return null; } } public List<MembershipRequest> getMembershipRequestsByStatus(Long groupId, Integer statusId) { return DtoUtil.toPojos(membershipRequestResource.list() .withCache(CacheKeys.withClass(MembershipRequestDto.class) .withParameter("groupId", groupId) .withParameter("statusId", statusId).asList(), CacheName.MISC_REQUEST) .optionalQueryParam("groupId", groupId) .optionalQueryParam("statusId", statusId) .execute(), proposalService); } }