From 353bd6df8294d49b2599b7aa3791eaa0a9ecf388 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Fri, 3 May 2024 15:03:12 -0600 Subject: [PATCH] removed akka.net --- Management.Web/AkkaService.cs | 62 ------------------- Management.Web/IActorBridge.cs | 7 --- Management.Web/Management.Web.csproj | 2 - .../Pages/CanvasRequestsQueue.razor | 53 ---------------- Management.Web/Program.cs | 8 --- Management.Web/_Imports.razor | 1 - Management/Actors/CanvasApiActor.cs | 50 --------------- Management/Actors/CanvasSupervisor.cs | 15 ----- .../Actors/Messages/CanvasModulesMesasge.cs | 12 ---- .../Actors/Messages/GetModulesMessage.cs | 11 ---- .../Actors/Messages/ITraceableMessage.cs | 8 --- Management/DiagnosticsConfig.cs | 15 ----- Management/Management.csproj | 2 - README.md | 25 ++++++++ docker-compose.yml | 4 +- 15 files changed, 27 insertions(+), 248 deletions(-) delete mode 100644 Management.Web/AkkaService.cs delete mode 100644 Management.Web/IActorBridge.cs delete mode 100644 Management/Actors/CanvasApiActor.cs delete mode 100644 Management/Actors/CanvasSupervisor.cs delete mode 100644 Management/Actors/Messages/CanvasModulesMesasge.cs delete mode 100644 Management/Actors/Messages/GetModulesMessage.cs delete mode 100644 Management/Actors/Messages/ITraceableMessage.cs diff --git a/Management.Web/AkkaService.cs b/Management.Web/AkkaService.cs deleted file mode 100644 index 1441df7..0000000 --- a/Management.Web/AkkaService.cs +++ /dev/null @@ -1,62 +0,0 @@ - -using Akka.Actor; -using Akka.DependencyInjection; -namespace Management.Actors; - - -public class AkkaService : IHostedService, IActorBridge -{ - private ActorSystem? _actorSystem; - private readonly IConfiguration _configuration; - private readonly IServiceProvider _serviceProvider; - private IActorRef? _canvasApiActor; - private readonly IHostApplicationLifetime _applicationLifetime; - - public AkkaService(IServiceProvider serviceProvider, IHostApplicationLifetime appLifetime, IConfiguration configuration) - { - _serviceProvider = serviceProvider; - _applicationLifetime = appLifetime; - _configuration = configuration; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - var bootstrap = BootstrapSetup.Create(); - var dependencyInjectionSetup = DependencyResolverSetup.Create(_serviceProvider); - - var mergedSystemSetup = bootstrap.And(dependencyInjectionSetup); - - _actorSystem = ActorSystem.Create("canvas-managment-actors", mergedSystemSetup); - - // start top level supervisor actor - - // working here https://getakka.net/articles/actors/dependency-injection.html#integrating-with-microsoftextensionsdependencyinjection - var apiActorProps = DependencyResolver.For(_actorSystem).Props(); - _canvasApiActor = _actorSystem.ActorOf(apiActorProps, "canvas-api"); - - // crash if the actor system crashes, awaiting never returns... -#pragma warning disable CA2016 // Forward the 'CancellationToken' parameter to methods - _actorSystem.WhenTerminated.ContinueWith(tr => - { - _applicationLifetime.StopApplication(); - }); -#pragma warning restore CA2016 // Forward the 'CancellationToken' parameter to methods - - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; - - - // add more methods to interact with actor processes, make them part of an interface - // these are the most generic forwarding of messages - public void Tell(object message) - { - _canvasApiActor.Tell(message); - } - - public Task Ask(object message) - { - return _canvasApiActor.Ask(message); - } -} diff --git a/Management.Web/IActorBridge.cs b/Management.Web/IActorBridge.cs deleted file mode 100644 index d3ec6c6..0000000 --- a/Management.Web/IActorBridge.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Management.Actors; - -public interface IActorBridge -{ - void Tell(object message); - Task Ask(object message); -} diff --git a/Management.Web/Management.Web.csproj b/Management.Web/Management.Web.csproj index 35e39ea..4213e61 100644 --- a/Management.Web/Management.Web.csproj +++ b/Management.Web/Management.Web.csproj @@ -5,8 +5,6 @@ - - diff --git a/Management.Web/Pages/CanvasRequestsQueue.razor b/Management.Web/Pages/CanvasRequestsQueue.razor index d320d9f..6350d8c 100644 --- a/Management.Web/Pages/CanvasRequestsQueue.razor +++ b/Management.Web/Pages/CanvasRequestsQueue.razor @@ -1,64 +1,11 @@ @page "/test" @rendermode InteractiveServer -@using Microsoft.AspNetCore.SignalR.Client - @inject CanvasService canvas @inject CoursePlanner planner @inject FileStorageManager fileStorageManager -@inject IActorBridge bridge @inject NavigationManager Navigation @code { - private HubConnection? hubConnection; - public string? CourseName = "1400"; - @* private bool loading = true; *@ - protected override async Task OnInitializedAsync() - { - if (planner.LocalCourse == null) - { - System.Diagnostics.Activity.Current = null; - using var activity = DiagnosticsConfig.Source?.StartActivity("Loading Course"); - activity?.AddTag("CourseName", CourseName); - var courses = await fileStorageManager.LoadSavedCourses(); - planner.LocalCourse = courses.First(c => c.Settings.Name == CourseName); - } - - - @* Console.WriteLine(Navigation.BaseUri + "SignalRHub"); *@ - hubConnection = new HubConnectionBuilder() - .WithUrl(Navigation.BaseUri + "SignalRHub") - .WithAutomaticReconnect() - .Build(); - - - hubConnection.On("SentFromActor", () => - { - Console.WriteLine("recieved from actor"); - }); - - await hubConnection.StartAsync(); - - base.OnInitialized(); - @* loading = false; *@ - } - - private async Task SendAkkaMessage() - { - System.Diagnostics.Activity.Current = null; - using var activity = DiagnosticsConfig.Source?.StartActivity("sending akka message from blazor"); - - if (planner.LocalCourse != null && planner.LocalCourse.Settings.CanvasId != null && hubConnection?.ConnectionId != null) - { - ulong id = (ulong)planner.LocalCourse.Settings.CanvasId; - - var message = new GetModulesMessage(0, id, (string)hubConnection.ConnectionId, activity?.TraceId, ParentSpan: - activity?.SpanId); - var response = await bridge.Ask(message); - Console.WriteLine(response); - } - } } - - diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index f4795ec..fb927bd 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -11,7 +11,6 @@ global using Management.Services.Canvas; global using Management.Web.Shared; global using Management.Web.Shared.Components; using dotenv.net; -using Management.Actors; using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Hosting.Server.Features; using Microsoft.AspNetCore.ResponseCompression; @@ -93,13 +92,6 @@ builder.Services.AddScoped(); builder.Services.AddSingleton(); - -// exposing actor service to controllers -builder.Services.AddSingleton(); - -// starting actor service while enabling it to use dependency injection -builder.Services.AddHostedService(sp => (AkkaService)sp.GetRequiredService()); - builder.Services.AddResponseCompression(opts => { opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "application/octet-stream" }); diff --git a/Management.Web/_Imports.razor b/Management.Web/_Imports.razor index 9627494..fef9935 100644 --- a/Management.Web/_Imports.razor +++ b/Management.Web/_Imports.razor @@ -8,5 +8,4 @@ @using Microsoft.JSInterop @using Management.Web @using Management.Web.Shared -@using Management.Actors @using static Microsoft.AspNetCore.Components.Web.RenderMode diff --git a/Management/Actors/CanvasApiActor.cs b/Management/Actors/CanvasApiActor.cs deleted file mode 100644 index 5d16213..0000000 --- a/Management/Actors/CanvasApiActor.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Diagnostics; -using System.Net.Http.Headers; -using Akka.Actor; -using Akka.DependencyInjection; -using Management.Services.Canvas; -using Microsoft.AspNetCore.SignalR; -using Microsoft.Extensions.DependencyInjection; -namespace Management.Actors; - - -// RecieveActor configures messages in constructor -// UntypedActor configures messages in an onrecieved function -public class CanvasApiActor : ReceiveActor -{ - private readonly IServiceScope _scope; - private readonly ILogger _logger; - private readonly IHubContext _hub; - public CanvasApiActor(IServiceProvider serviceProvider) // props go here - { - _scope = serviceProvider.CreateScope(); - _logger = _scope.ServiceProvider.GetRequiredService>(); - _hub = _scope.ServiceProvider.GetRequiredService>(); - - _logger.LogInformation("creating canvas actor"); - - var canvasService = _scope.ServiceProvider.GetRequiredService(); - ReceiveAsync(async m => - { - using var activity = m.Activity("canvas actor getting modules from canvas api"); - - var modules = await canvasService.Modules.GetModules(m.CanvasCourseId); - Sender.Tell(new CanvasModulesMessage(m.RequestId, m.CanvasCourseId, modules, activity?.TraceId, activity?.SpanId)); - - await _hub.Clients.Client(m.ClientConnectionId).SendAsync("SentFromActor"); - }); - } - - - protected override void PostStop() - { - _scope.Dispose(); - base.PostStop(); - } - - // used to wrap the arguments in a comprehension for future instanciation of the actor - // does this work with DI? - // public static Props Props(CanvasService canvasService) => - // Akka.Actor.Props.Create(() => new CanvasApiActor(canvasService)); - -} diff --git a/Management/Actors/CanvasSupervisor.cs b/Management/Actors/CanvasSupervisor.cs deleted file mode 100644 index f15ac7e..0000000 --- a/Management/Actors/CanvasSupervisor.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Akka.Actor; -using Akka.DependencyInjection; - -namespace Management.Actors; - -public class CanvasSupervisor : ReceiveActor -{ - // private IActorRef canvasApiActor; - - // public CanvasSupervisor() - // { - // // DependencyResolver - - // } -} diff --git a/Management/Actors/Messages/CanvasModulesMesasge.cs b/Management/Actors/Messages/CanvasModulesMesasge.cs deleted file mode 100644 index 2de9de3..0000000 --- a/Management/Actors/Messages/CanvasModulesMesasge.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Diagnostics; -using CanvasModel.Modules; - -namespace Management.Actors; - -public sealed record CanvasModulesMessage( - long RequestId, - ulong CanvasCourseId, - IEnumerable CanvasModules, - ActivityTraceId? ParentTrace, - ActivitySpanId? ParentSpan -) : ITraceableMessage; diff --git a/Management/Actors/Messages/GetModulesMessage.cs b/Management/Actors/Messages/GetModulesMessage.cs deleted file mode 100644 index 05987ac..0000000 --- a/Management/Actors/Messages/GetModulesMessage.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Diagnostics; - -namespace Management.Actors; - -public sealed record GetModulesMessage( - long RequestId, - ulong CanvasCourseId, - string ClientConnectionId, - ActivityTraceId? ParentTrace, - ActivitySpanId? ParentSpan -) : ITraceableMessage; diff --git a/Management/Actors/Messages/ITraceableMessage.cs b/Management/Actors/Messages/ITraceableMessage.cs deleted file mode 100644 index b82be03..0000000 --- a/Management/Actors/Messages/ITraceableMessage.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Diagnostics; - -public interface ITraceableMessage -{ - public ActivitySpanId? ParentSpan { get; } - public ActivityTraceId? ParentTrace { get; } -} - diff --git a/Management/DiagnosticsConfig.cs b/Management/DiagnosticsConfig.cs index 6fc5726..2417dcc 100644 --- a/Management/DiagnosticsConfig.cs +++ b/Management/DiagnosticsConfig.cs @@ -5,19 +5,4 @@ public static class DiagnosticsConfig { public const string SourceName = "canvas-management-source"; public readonly static ActivitySource Source = new(SourceName); - - public static Activity? Activity(this ITraceableMessage message, string activityName) - { - if (message.ParentTrace != null && message.ParentSpan != null) - { - ActivityContext parentContext = new ActivityContext( - (ActivityTraceId)message.ParentTrace, - (ActivitySpanId)message.ParentSpan, - ActivityTraceFlags.Recorded - ); - - return Source?.StartActivity(activityName, ActivityKind.Internal, parentContext); - } - return Source?.StartActivity(activityName); - } } diff --git a/Management/Management.csproj b/Management/Management.csproj index 6aaefdb..23d6e0b 100644 --- a/Management/Management.csproj +++ b/Management/Management.csproj @@ -7,8 +7,6 @@ - - diff --git a/README.md b/README.md index cae199d..26ab2be 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,28 @@ matching questions - different delimiter (-n in answer messes things up) - add distractors + + +on calendar month, displays days that are on the same week as a month change (if month ends on monday, still show tues-sat) + +file uploads +- image compression? +- scrape html, when image embedded, upload to canvas and add img tag to canvas asset in html before sending image + +add grade percentage support in page + +wait until week two before colapsing previous month? + +better ux around course settings (assignment groups, term for start/end) + +display queue of canvas requests + +allow multiple courses to be edited concurrently in different browser tabs + +have lock date mimic an offset after drag and drop changes due date + +make the ux easier to change course pages + +schedule planning view? just outline concepts? (maybe some non-canvas scheduled thing that only shows up in planner? like a note, could be de-emphasized in webpage) + +holiday schedule diff --git a/docker-compose.yml b/docker-compose.yml index 178b0d9..55330d8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,8 +22,8 @@ services: - ~/projects/faculty/1430/2024-fall-alex/modules:/app/storage/fall_ux - ~/projects/faculty/4850_AdvancedFE/2024-fall-alex/modules:/app/storage/fall_advanced_frontend - ~/projects/faculty/1810/2024-fall-alex/modules:/app/storage/fall_intro_to_web - - ~/projects/faculty/1420/2024-fall/modules:/app/storage/fall_1420 - - ~/projects/faculty/1425/2024-fall/modules:/app/storage/fall_1425 + - ~/projects/faculty/1420/2024-fall/Modules:/app/storage/fall_1420 + - ~/projects/faculty/1425/2024-fall/Modules:/app/storage/fall_1425