/// <summary> /// Submits a membership request to the specified group's /// moderation workflow for approval. /// </summary> /// <param name="member">The member information for the membership request</param> public void AddAModeratedMember(CommunityMember member) { // Define a unique reference representing the entity // under moderation. Note that this entity may be // transient or may not yet have been assigned a // unique identifier. Defining an item reference allows // you to bridge this gap. // For example: "members:/{group-id}/{user-reference}" var targetReference = CreateUri(member.GroupId, member.User); // Retrieve the workflow supporting moderation of // membership for the group to which the user is // being added. var moderationWorkflow = GetWorkflowFor(member.GroupId); // The workflow defines the intial (or 'start') state // for moderation. var initialState = moderationWorkflow.InitialState; // Create a new workflow item... var workflowItem = new WorkflowItem( WorkflowId.Create(moderationWorkflow.Id), // ...under the group's moderation workflow new WorkflowState(initialState), // ...in the workflow's initial state Reference.Create(targetReference) // ...identified with this reference ); var memberRequest = _memberAdapter.Adapt(member); try { _workflowItemService.Add(workflowItem, memberRequest); } catch (SocialAuthenticationException ex) { throw new SocialRepositoryException("The application failed to authenticate with Episerver Social.", ex); } catch (MaximumDataSizeExceededException ex) { throw new SocialRepositoryException( "The application request was deemed too large for Episerver Social.", ex); } catch (SocialCommunicationException ex) { throw new SocialRepositoryException("The application failed to communicate with Episerver Social.", ex); } catch (SocialException ex) { throw new SocialRepositoryException("Episerver Social failed to process the application request.", ex); } }
/// <summary> /// Takes action on the specified workflow item, representing a /// membership request. /// </summary> /// <param name="workflowId">The id of the workflow </param> /// <param name="action">The moderation action to be taken</param> /// <param name="userId">The unique id of the user under moderation.</param> /// <param name="communityId">The unique id of the community to which membership has been requested.</param> public void Moderate(string workflowId, string action, string userId, string communityId) { var membershipRequest = GetMembershipRequest(userId, communityId); var populatedWorkflowId = WorkflowId.Create(workflowId); var requestReference = Reference.Create(CreateUri(membershipRequest.Group, membershipRequest.User)); try { var transitionToken = _workflowService.BeginTransitionSession(populatedWorkflowId, requestReference); try { // Retrieve the moderation workflow associated with // the item to be acted upon. var workflow = _workflowService.Get(populatedWorkflowId); // Leverage the workflow to determine what the // resulting state of the item will be upon taking // the specified action. //retrieve the current state of the workflow item once the begintransitionsession begins. var filter = new WorkflowItemFilter { Target = requestReference }; var criteria = new Criteria <WorkflowItemFilter> { Filter = filter }; var workflowItem = _workflowItemService.Get(criteria).Results.Last(); // Example: Current State: "Pending", Action: "Approve" => Transitioned State: "Approved" var transitionedState = workflow.Transition(workflowItem.State, new WorkflowAction(action)); var subsequentWorkflowItem = new WorkflowItem( workflow.Id, transitionedState, requestReference ); _workflowItemService.Add(subsequentWorkflowItem, membershipRequest, transitionToken); // Perform any application logic given the item's // new state. if (IsApproved(subsequentWorkflowItem.State)) { _memberRepository.Add(_memberAdapter.Adapt(membershipRequest)); } } finally { _workflowService.EndTransitionSession(transitionToken); } } catch (SocialAuthenticationException ex) { throw new SocialRepositoryException("The application failed to authenticate with Episerver Social.", ex); } catch (MaximumDataSizeExceededException ex) { throw new SocialRepositoryException( "The application request was deemed too large for Episerver Social.", ex); } catch (SocialCommunicationException ex) { throw new SocialRepositoryException("The application failed to communicate with Episerver Social.", ex); } catch (SocialException ex) { throw new SocialRepositoryException("Episerver Social failed to process the application request.", ex); } }