referencing courses directly from canvas

This commit is contained in:
2023-07-15 23:19:39 -06:00
parent 5ece8b9d36
commit ed1963c67b
27 changed files with 370 additions and 249 deletions

View File

@@ -1,6 +1,7 @@
using CanvasModel.EnrollmentTerms;
using CanvasModel.Courses;
public class ConfigurationManagement : IConfigurationManagement
public class CoursePlanner
{
public void SetConfiguration(
EnrollmentTermModel canvasTerm,
@@ -18,8 +19,8 @@ public class ConfigurationManagement : IConfigurationManagement
}
public SemesterCalendarConfig? SemesterCalendar { get; set; } = null;
public IModuleManager ModuleManager {get; private set;} = new ModuleManager();
public IEnumerable<CourseModule> Modules { get; set; } = new CourseModule[] { };
public IEnumerable<LocalAssignment> Assignments { get; set; } = new LocalAssignment[] { };
public CourseModel? Course { get; set; } = null;
}

View File

@@ -1,8 +0,0 @@
using CanvasModel.EnrollmentTerms;
public interface IConfigurationManagement
{
SemesterCalendarConfig? SemesterCalendar { get; set; }
void SetConfiguration(EnrollmentTermModel canvasTerm, DayOfWeek[] daysOfWeek);
}

View File

@@ -1,6 +0,0 @@
public interface IModuleManager
{
IEnumerable<CourseModule> Modules { get; set; }
public void AddModule(CourseModule newModule);
public void AddAssignment(int moduleIndex, LocalAssignment assignment);
}

View File

@@ -1,22 +0,0 @@
public class ModuleManager : IModuleManager
{
public IEnumerable<CourseModule> Modules { get; set; } = new CourseModule[] { };
public void AddAssignment(int moduleIndex, LocalAssignment assignment)
{
var newAssignments = Modules.ElementAt(moduleIndex).Assignments.Append(assignment);
var newModule = Modules.ElementAt(moduleIndex) with { Assignments = newAssignments };
if (newModule == null)
throw new Exception($"cannot get module at index {moduleIndex}");
Modules = Modules
.Take(moduleIndex)
.Append(newModule)
.Concat(Modules.Skip(moduleIndex + 1));
}
public void AddModule(CourseModule newModule)
{
Modules = Modules.Append(newModule);
}
}

View File

@@ -1,31 +1,29 @@
public record RubricItem(
int Points,
string Label
);
public record RubricItem(int Points, string Label);
public enum SubmissionType
{
online_quiz,
none,
on_paper,
discussion_topic,
external_tool,
online_upload,
online_text_entry,
online_url,
media_recording,
student_annotation,
online_quiz,
none,
on_paper,
discussion_topic,
external_tool,
online_upload,
online_text_entry,
online_url,
media_recording,
student_annotation,
}
public record LocalAssignment
{
public string name { get; init; } = "";
public string description { get; init; } = "";
public bool published { get; init; }
public bool lock_at_due_date { get; init; }
public IEnumerable<RubricItem> rubric { get; init; } = new RubricItem[] { };
public DateTime? lock_at { get; init; }
public DateTime due_at { get; init; }
public int points_possible { get; init; }
public IEnumerable<SubmissionType> submission_types { get; init; } = new SubmissionType[] { };
}
public string id { get; init; } = "";
public string name { get; init; } = "";
public string description { get; init; } = "";
public bool published { get; init; }
public bool lock_at_due_date { get; init; }
public IEnumerable<RubricItem> rubric { get; init; } = new RubricItem[] { };
public DateTime? lock_at { get; init; }
public DateTime due_at { get; init; }
public int points_possible { get; init; }
public IEnumerable<SubmissionType> submission_types { get; init; } = new SubmissionType[] { };
}

View File

@@ -13,6 +13,7 @@ public class CanvasService : ICanvasService
private const string BaseUrl = "https://snow.instructure.com/api/v1/";
private readonly IWebRequestor webRequestor;
private string courseid { get; }
public CanvasService(IWebRequestor webRequestor)
{
courseid = "774898";
@@ -25,20 +26,40 @@ public class CanvasService : ICanvasService
var request = new RestRequest(url);
var termResponses = await PaginatedRequest<RedundantEnrollmentTermsResponse>(request);
var terms = termResponses
.Select(r => r.EnrollmentTerms)
.SelectMany(s => s).ToArray();
var terms = termResponses.Select(r => r.EnrollmentTerms).SelectMany(s => s).ToArray();
return terms;
}
public async Task<IEnumerable<CourseModel>> GetCourses(ulong termId)
{
var url = $"courses";
var request = new RestRequest(url);
var coursesResponse = await PaginatedRequest<IEnumerable<CourseModel>>(request);
return coursesResponse.SelectMany(c => c).Where(c => c.EnrollmentTermId == termId).ToArray();
}
public async Task<CourseModel> GetCourse(ulong courseId)
{
var url = $"course/${courseId}";
var request = new RestRequest(url);
var response = await webRequestor.GetAsync<CourseModel>(request);
if (response.Data == null)
{
System.Console.WriteLine(response.Content);
System.Console.WriteLine(response.ResponseUri);
throw new Exception("error getting course from canvas");
}
return response.Data;
}
private async Task<IEnumerable<T>> PaginatedRequest<T>(RestRequest request)
{
var requestCount = 1;
request.AddQueryParameter("per_page", "100");
RestResponse<T> response = await webRequestor.GetAsync<T>(request);
var returnData = response.Data != null
? new T[] { response.Data }
: new T[] { };
var returnData = response.Data != null ? new T[] { response.Data } : new T[] { };
var nextUrl = getNextUrl(response.Headers);
while (nextUrl is not null)
@@ -56,34 +77,33 @@ public class CanvasService : ICanvasService
return returnData;
}
private static string? getNextUrl(IEnumerable<HeaderParameter>? headers) => headers?
.ToList()
.Find(h => h.Name == "Link")?
.Value?
.ToString()?
.Split(",")
private static string? getNextUrl(IEnumerable<HeaderParameter>? headers) =>
headers
?.ToList()
.Find(h => h.Name == "Link")
?.Value?.ToString()
?.Split(",")
.Where(url => url.Contains("rel=\"next\""))
.FirstOrDefault()?
.Split(";")
.FirstOrDefault()?
.TrimEnd('>')
.FirstOrDefault()
?.Split(";")
.FirstOrDefault()
?.TrimEnd('>')
.TrimStart('<')
.Replace(" ", "")
.Replace(BaseUrl, "");
public async Task<IEnumerable<EnrollmentTermModel>> GetCurrentTermsFor(DateTime? _queryDate = null)
public async Task<IEnumerable<EnrollmentTermModel>> GetCurrentTermsFor(
DateTime? _queryDate = null
)
{
DateTime queryDate = _queryDate ?? DateTime.Now;
var terms = await GetTerms();
var currentTerms = terms.Where(t =>
t.EndAt != null
&& t.EndAt > queryDate
&& t.EndAt < queryDate.AddYears(1)
).Take(3);
var currentTerms = terms
.Where(t => t.EndAt != null && t.EndAt > queryDate && t.EndAt < queryDate.AddYears(1))
.Take(3);
return currentTerms;
}
}
}

View File

@@ -5,21 +5,24 @@ public class WebRequestor : IWebRequestor
private const string BaseUrl = "https://snow.instructure.com/api/v1/";
private string token;
private RestClient client;
private string courseid { get; }
public WebRequestor()
{
token = Environment.GetEnvironmentVariable("CANVAS_TOKEN") ?? throw new Exception("CANVAS_TOKEN not in environment");
token =
Environment.GetEnvironmentVariable("CANVAS_TOKEN")
?? throw new Exception("CANVAS_TOKEN not in environment");
client = new RestClient(BaseUrl);
client.AddDefaultHeader("Authorization", $"Bearer {token}");
courseid = "774898";
}
public async Task<RestResponse<T[]>> GetManyAsync<T>(RestRequest request)
{
return await client.ExecuteGetAsync<T[]>(request);
}
public async Task<RestResponse<T>> GetAsync<T>(RestRequest request)
{
return await client.ExecuteGetAsync<T>(request);
}
}
}