diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..f63a076 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/Management.Web/bin/Debug/net7.0/Management.Web.dll", + "args": [], + "cwd": "${workspaceFolder}/Management.Web", + "stopAtEntry": false, + // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser + "serverReadyAction": { + "action": "openExternally", + "pattern": "\\bNow listening on:\\s+(https?://\\S+)" + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..e7b7585 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Management.Web/Management.Web.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/Management.Web/Management.Web.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/Management.Web/Management.Web.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Management.Test/Models/TermTests.cs b/Management.Test/Models/TermTests.cs index 90862fa..af1206d 100644 --- a/Management.Test/Models/TermTests.cs +++ b/Management.Test/Models/TermTests.cs @@ -1,22 +1,28 @@ + +using CanvasModel.EnrollmentTerms; + public class DeserializationTests { - [Test] - public void TestTerm() - { + // [Test] + // public void TestTerm() + // { - var canvasContentResponse = @"{ - ""enrollment_terms"": [ - { - ""id"": 1, - ""name"": ""one"", - ""start_at"": 2022-01-01T00:00:00Z, - ""end_at"": 2022-02-01T00:00:00Z, - ""created_at"": ""2011-04-26T23:34:35Z"", - ""workflow_state"": ""active"", - ""grading_period_group_id"": null - }, - }"; + // var canvasContentResponse = @"{ + // ""enrollment_terms"": [ + // { + // ""id"": 1, + // ""name"": ""one"", + // ""start_at"": 2022-01-01T00:00:00Z, + // ""end_at"": 2022-02-01T00:00:00Z, + // ""created_at"": ""2011-04-26T23:34:35Z"", + // ""workflow_state"": ""active"", + // ""grading_period_group_id"": null + // }, + // }"; - - } + // var result = JsonSerializer.Deserialize(canvasContentResponse); + + // result.Should().NotBeNull(); + // result?.Id.Should().Be(1); + // } } \ No newline at end of file diff --git a/Management.Test/SemesterPlannerTests.cs b/Management.Test/SemesterPlannerTests.cs deleted file mode 100644 index f0054a9..0000000 --- a/Management.Test/SemesterPlannerTests.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Management.Test; - -public class SemesterPlannerTests -{ - [Test] - public void TestCanCreatePlannerFromCanvasSemester() - { - var - } -} \ No newline at end of file diff --git a/Management.Test/Services/CanvasServiceTests.cs b/Management.Test/Services/CanvasServiceTests.cs index 8c8b043..ede3544 100644 --- a/Management.Test/Services/CanvasServiceTests.cs +++ b/Management.Test/Services/CanvasServiceTests.cs @@ -33,7 +33,6 @@ public class CanvasServiceTests var canvasTerms = await service.GetTerms(); canvasTerms.Should().BeEquivalentTo(expectedTerms); - } } \ No newline at end of file diff --git a/Management.Test/Usings.cs b/Management.Test/Usings.cs index cefced4..9b6fd3c 100644 --- a/Management.Test/Usings.cs +++ b/Management.Test/Usings.cs @@ -1 +1,3 @@ -global using NUnit.Framework; \ No newline at end of file +global using NUnit.Framework; +global using FluentAssertions; +global using System.Text.Json; \ No newline at end of file diff --git a/Management/Models/CanvasModel/EnrollmentTerms/EnrollmentTermModel.cs b/Management/Models/CanvasModel/EnrollmentTerms/EnrollmentTermModel.cs index 2981eb1..2858bf7 100644 --- a/Management/Models/CanvasModel/EnrollmentTerms/EnrollmentTermModel.cs +++ b/Management/Models/CanvasModel/EnrollmentTerms/EnrollmentTermModel.cs @@ -1,6 +1,6 @@ namespace CanvasModel.EnrollmentTerms; -record EnrollmentTermModel +public record EnrollmentTermModel ( [property: JsonPropertyName("id")] ulong Id, [property: JsonPropertyName("name")] string Name, @@ -14,7 +14,7 @@ record EnrollmentTermModel Dictionary? Overrides = null ); -record EnrollmentTermDateOverrideModel +public record EnrollmentTermDateOverrideModel ( [property: JsonPropertyName("start_at")] DateTime? StartAt = null, [property: JsonPropertyName("end_at")] DateTime? EndAt = null diff --git a/Management/Models/CanvasModel/EnrollmentTerms/RedundantEnrollmentTermsResponse.cs b/Management/Models/CanvasModel/EnrollmentTerms/RedundantEnrollmentTermsResponse.cs index b59ffe7..f352cbd 100644 --- a/Management/Models/CanvasModel/EnrollmentTerms/RedundantEnrollmentTermsResponse.cs +++ b/Management/Models/CanvasModel/EnrollmentTerms/RedundantEnrollmentTermsResponse.cs @@ -1,6 +1,6 @@ - namespace CanvasModel.EnrollmentTerms; -record RedundantEnrollmentTermsResponse + +public record RedundantEnrollmentTermsResponse ( [property: JsonPropertyName("enrollment_terms")] IEnumerable EnrollmentTerms diff --git a/Management/Services/CanvasService.cs b/Management/Services/CanvasService.cs index 85390f7..7aa5bb5 100644 --- a/Management/Services/CanvasService.cs +++ b/Management/Services/CanvasService.cs @@ -18,7 +18,10 @@ public class CanvasService var url = $"accounts/10/terms"; var request = new RestRequest(url); - var terms = await PaginatedRequest(request); + var termResponses = await PaginatedRequest(request); + var terms = termResponses + .Select(r => r.EnrollmentTerms) + .SelectMany(s => s).ToArray(); return terms; } @@ -26,20 +29,20 @@ public class CanvasService { var requestCount = 1; request.AddQueryParameter("per_page", "100"); - IEnumerable returnData = new T[] { }; - RestResponse response = await webRequestor.GetAsync(request); - returnData = returnData.Concat(response.Data); - - var nextUrl = getNextUrl(response); + 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; - var nextRequest = new RestRequest(nextUrl); + RestRequest nextRequest = new RestRequest(nextUrl); var nextResponse = await webRequestor.GetAsync(nextRequest); if (nextResponse.Data is not null) - returnData = returnData.Concat(nextResponse.Data); - nextUrl = getNextUrl(nextResponse); + returnData = returnData.Append(nextResponse.Data).ToArray(); + nextUrl = getNextUrl(nextResponse.Headers); } System.Console.WriteLine($"Requesting {typeof(T)} took {requestCount} requests"); @@ -48,7 +51,7 @@ public class CanvasService } - private static string? getNextUrl(RestResponse response) => response.Headers? + private static string? getNextUrl(IEnumerable? headers) => headers? .ToList() .Find(h => h.Name == "Link")? .Value?