コード例 #1
0
        /// <summary>Gets all salesforce objects asynchronous.</summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="partyId">The party identifier.</param>
        /// <param name="getFirstPageFunc">The get first page function.</param>
        /// <param name="svcSalesforce">The SVC salesforce.</param>
        /// <param name="oauthTokenManager">The oauth token manager.</param>
        /// <param name="logTrace">The log trace.</param>
        /// <returns></returns>
        public static async Task <IList <T> > GetAllSalesforceObjectsAsync <T>(int partyId,
                                                                               Func <Task <ResponseBase <SalesforceQueryResponseData <T>, IList <SalesforceError> > > > getFirstPageFunc,
                                                                               ISalesforceServiceClientV2 svcSalesforce, IOAuthTokenManager oauthTokenManager,
                                                                               ILogTrace logTrace)
        {
            var startedAt = DateTime.UtcNow;

            // send request to get the first batch from Salesforce
            var firstTopicsRes = await GetFirstSalesforceObjectPageAsync(partyId,
                                                                         getFirstPageFunc, svcSalesforce, oauthTokenManager, logTrace);

            var sfObjects = firstTopicsRes.Data.Records;

            // repeat until all the topics are retrieved, just in case, usually there won't be more than 1000 topics
            var nextRecordUrl = firstTopicsRes.Data.NextRecordsUrl;

            while (nextRecordUrl != null)
            {
                var nextTopicsRes = await svcSalesforce.GetNextPageAsync(firstTopicsRes.Data);

                nextRecordUrl = nextTopicsRes.Data.NextRecordsUrl;
                sfObjects     = sfObjects.Concat(nextTopicsRes.Data.Records).ToList();
            }

            logTrace?.Add(LogLevel.Info, $"GetAllSalesforce{typeof(T).Name}Async() - Done", $"{typeof(T).Name}s #{sfObjects.Count}", startedAt);

            return(sfObjects.ToList());
        }
コード例 #2
0
        /// <summary>
        /// Get all Topics from Salesforce, convert to SalesforceTopicMapping schema before returning
        /// </summary>
        /// <param name="svcSalesforce"></param>
        /// <param name="logTrace"></param>
        /// <returns>
        /// The list of SalesforceTopicMapping objects representing the current Topics in Salesforce
        /// All the FMGGroupId props of these objects will be null
        /// </returns>
        protected async Task <IList <SalesforceTopicMapping> > GetAllSalesforceTopicsAsync(
            int partyId, ISalesforceServiceClientV2 svcSalesforce, ILogTrace logTrace)
        {
            var topics = await SalesforceUtil.GetAllSalesforceObjectsAsync(partyId,
                                                                           () => svcSalesforce.GetAllTopicsAsync(), svcSalesforce, AppStore.OAuthTokenManager, logTrace);

            // map the result to the SalesforceTopicMapping object
            var groupMappings = topics.Select(topic => new SalesforceTopicMapping
            {
                SalesforceTopicId   = topic.Id,
                SalesforceTopicName = topic.Name
            });

            return(groupMappings.ToList());
        }
コード例 #3
0
        GetFirstSalesforceObjectPageAsync <T>(int partyId,
                                              Func <Task <ResponseBase <SalesforceQueryResponseData <T>, IList <SalesforceError> > > > getFirstPageFunc,
                                              ISalesforceServiceClientV2 svcSalesforce, IOAuthTokenManager oauthTokenManager,
                                              ILogTrace logTrace)
        {
            var domain    = $"GetFirstSalesforce{typeof(T).Name}Page";
            var startedAt = DateTime.UtcNow;

            // send request to get the first batch from Salesforce
            var res = await getFirstPageFunc();

            logTrace?.Add(LogLevel.Info, domain, "First try", startedAt);

            // success case
            if (res.Status == HttpStatusCode.OK)
            {
                return(res);
            }

            // error case
            var errorCode = res.Error?.FirstOrDefault()?.ErrorCode;

            if (errorCode == null)
            {
                throw new Exception($"{domain} - Status {res.Status} - Message {res.ErrorString}");
            }

            if (errorCode != "INVALID_SESSION_ID")
            {
                throw new Exception(
                          $"{domain} - Status {res.Status} - Code {errorCode} - Message {res.ErrorString}"
                          );
            }

            logTrace?.Add(LogLevel.Info, domain, "AccessToken expired");

            // try to refresh token
            startedAt = DateTime.UtcNow;
            var oauthToken = await oauthTokenManager.RefreshAccessTokenAsync <SalesforceOAuthError>(
                new RefreshAccessTokenRequest
            {
                PartyId    = partyId,
                MaxRetries = 5,
                RetryWaitSecondsIfFailed = 5
            }, logTrace);

            if (oauthToken == null)
            {
                logTrace?.Add(LogLevel.Warning, domain, "Refresh Token Failed.", startedAt);
                throw new IgnoreProcessingMessageException("Refresh Token Failed.", $"Failed to RefreshAccessToken for partyId = {partyId}");
            }

            logTrace?.Add(LogLevel.Info, domain, "AccessToken refreshed", startedAt);

            // update the access token in svcSalesforce
            svcSalesforce.AccessToken = oauthToken.AccessToken;

            // try again
            startedAt = DateTime.UtcNow;
            res       = await getFirstPageFunc();

            logTrace?.Add(LogLevel.Info, domain, "Task retried", startedAt);

            // success case
            if (res.Status == HttpStatusCode.OK)
            {
                return(res);
            }

            // error case
            throw new Exception($"{domain} - Status {res.Status} - Code {errorCode} - Message {res.ErrorString}");
        }