mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-26 07:38:33 -06:00
referencing courses directly from canvas
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
using CanvasModel.EnrollmentTerms;
|
||||
|
||||
public interface IConfigurationManagement
|
||||
{
|
||||
SemesterCalendarConfig? SemesterCalendar { get; set; }
|
||||
|
||||
void SetConfiguration(EnrollmentTermModel canvasTerm, DayOfWeek[] daysOfWeek);
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
public interface IModuleManager
|
||||
{
|
||||
IEnumerable<CourseModule> Modules { get; set; }
|
||||
public void AddModule(CourseModule newModule);
|
||||
public void AddAssignment(int moduleIndex, LocalAssignment assignment);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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[] { };
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user