public CommonResult Unfollow(string viewerId, string ownerId, string accessToken)
        {
            if (logService)
            {
                WriteLogToFile(viewerId + "/unfollow/" + ownerId + "?accessToken=" + accessToken);
            }
            try
            {
                ValidateSignature();
                ChatterSoapService soap = getChatterSoapService();
                var ssOwnerId           = getSalesforceUserId(soap, ownerId);
                var ssViewerId          = getSalesforceUserId(soap, viewerId);

                ChatterRestService rest  = getChatterRestService(accessToken);
                ChatterResponse    cresp = rest.Unfollow(ssViewerId, ssOwnerId);
                return(IsUserFollowing(viewerId, ownerId, accessToken));
            }
            catch (Exception ex)
            {
                HandleError(ex, url);
                HandleError(ex, accessToken);
                return(new CommonResult()
                {
                    Success = false, ErrorMessage = ex.Message
                });
            }
        }
        public CommonResult IsUserFollowing(string viewerId, string ownerId, string accessToken)
        {
            try
            {
                ChatterSoapService soap = getChatterSoapService();
                var ssOwnerId           = getSalesforceUserId(soap, ownerId);
                var ssViewerId          = getSalesforceUserId(soap, viewerId);

                ChatterRestService rest  = getChatterRestService(accessToken);
                ChatterResponse    cresp = rest.GetFollowers(ssOwnerId);
                int total = cresp != null ? cresp.total : 0;

                while (cresp != null && cresp.followers != null)
                {
                    foreach (ChatterSubscription csub in cresp.followers)
                    {
                        if (csub.subscriber != null && csub.subscriber.id.StartsWith(ssViewerId))
                        {
                            return(new CommonResult()
                            {
                                Success = true, Following = true, Total = total, AccessToken = rest.GetAccessToken()
                            });
                        }
                    }
                    cresp = rest.GetNextPage(cresp);
                }

                return(new CommonResult()
                {
                    Success = true, Following = false, Total = total, AccessToken = rest.GetAccessToken()
                });
            }
            catch (Exception ex)
            {
                HandleError(ex, url);
                HandleError(ex, accessToken);
                return(new CommonResult()
                {
                    Success = false, ErrorMessage = ex.Message
                });
            }
        }