using CanvasModel.Courses; using CanvasModel.EnrollmentTerms; using RestSharp; public class CanvasService { private const string BaseUrl = "https://snow.instructure.com/api/v1/"; private readonly IWebRequestor webRequestor; private string courseid { get; } public CanvasService(IWebRequestor webRequestor) { courseid = "774898"; this.webRequestor = webRequestor; } public async Task> GetTerms() { var url = $"accounts/10/terms"; var request = new RestRequest(url); var termResponses = await PaginatedRequest(request); var terms = termResponses .Select(r => r.EnrollmentTerms) .SelectMany(s => s).ToArray(); return terms; } private async Task> PaginatedRequest(RestRequest request) { var requestCount = 1; request.AddQueryParameter("per_page", "100"); RestResponse response = await webRequestor.GetAsync(request); var returnData = response.Data != null ? new T[] { response.Data } : new T[] { }; var nextUrl = getNextUrl(response.Headers); while (nextUrl is not null) { requestCount += 1; RestRequest nextRequest = new RestRequest(nextUrl); var nextResponse = await webRequestor.GetAsync(nextRequest); if (nextResponse.Data is not null) returnData = returnData.Append(nextResponse.Data).ToArray(); nextUrl = getNextUrl(nextResponse.Headers); } System.Console.WriteLine($"Requesting {typeof(T)} took {requestCount} requests"); return returnData; } private static string? getNextUrl(IEnumerable? headers) => headers? .ToList() .Find(h => h.Name == "Link")? .Value? .ToString()? .Split(",") .Where(url => url.Contains("rel=\"next\"")) .FirstOrDefault()? .Split(";") .FirstOrDefault()? .TrimEnd('>') .TrimStart('<') .Replace(" ", "") .Replace(BaseUrl, ""); }