/// <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()); }
/// <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()); }
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}"); }