consolodated canvas data structure

This commit is contained in:
2024-05-20 19:03:30 -06:00
parent e402ae34cb
commit 6f4fe3663a
17 changed files with 107 additions and 96 deletions

View File

@@ -137,7 +137,7 @@
} }
private CanvasAssignment? assignmentInCanvas => private CanvasAssignment? assignmentInCanvas =>
planner.CanvasAssignments?.FirstOrDefault(a => a.Name == assignmentContext.Assignment?.Name); planner.CanvasData?.Assignments.FirstOrDefault(a => a.Name == assignmentContext.Assignment?.Name);
private string canvasAssignmentUrl => private string canvasAssignmentUrl =>
$"https://snow.instructure.com/courses/{planner.LocalCourse?.Settings.CanvasId}/assignments/{assignmentInCanvas?.Id}"; $"https://snow.instructure.com/courses/{planner.LocalCourse?.Settings.CanvasId}/assignments/{assignmentInCanvas?.Id}";

View File

@@ -17,7 +17,7 @@
if(firstRender) if(firstRender)
{ {
if( if(
planner.CanvasAssignments == null planner.CanvasData == null
&& planner.LocalCourse != null && planner.LocalCourse != null
&& planner.LocalCourse.Settings.CanvasId != null && planner.LocalCourse.Settings.CanvasId != null
) )

View File

@@ -87,7 +87,8 @@
} }
private bool isSyncedWithCanvas => planner private bool isSyncedWithCanvas => planner
.CanvasModules? .CanvasData?
.Modules
.FirstOrDefault( .FirstOrDefault(
cm => cm.Name == Module.Name cm => cm.Name == Module.Name
) != null; ) != null;

View File

@@ -38,7 +38,8 @@
} }
private CanvasAssignment? assignmentInCanvas => planner private CanvasAssignment? assignmentInCanvas => planner
.CanvasAssignments? .CanvasData?
.Assignments
.FirstOrDefault( .FirstOrDefault(
a => a.Name == Assignment.Name a => a.Name == Assignment.Name
); );
@@ -53,8 +54,7 @@
private bool NeedsToBeUpdatedInCanvas => planner.LocalCourse != null private bool NeedsToBeUpdatedInCanvas => planner.LocalCourse != null
&& planner.LocalCourse.Settings.CanvasId != null && planner.LocalCourse.Settings.CanvasId != null
&& planner.CanvasAssignments != null && planner.CanvasData != null
&& planner.CanvasModules != null
&& assignmentInCanvas != null && assignmentInCanvas != null
&& Assignment.NeedsUpdates( && Assignment.NeedsUpdates(
(CanvasAssignment)assignmentInCanvas, (CanvasAssignment)assignmentInCanvas,

View File

@@ -18,8 +18,8 @@
dragContainer.DropCallback = null; dragContainer.DropCallback = null;
} }
private bool existsInCanvas => private bool existsInCanvas =>
planner.CanvasQuizzes != null planner.CanvasData != null
? Quiz.QuizIsCreated(planner.CanvasQuizzes) ? Quiz.QuizIsCreated(planner.CanvasData.Quizzes)
: false; : false;

View File

@@ -32,7 +32,7 @@
private CanvasPage? pageInCanvas => private CanvasPage? pageInCanvas =>
planner.CanvasPages?.FirstOrDefault(a => a.Title == pageContext.Page?.Name); planner.CanvasData?.Pages.FirstOrDefault(a => a.Title == pageContext.Page?.Name);
private string canvasPageUrl => private string canvasPageUrl =>

View File

@@ -62,7 +62,7 @@
} }
StateHasChanged(); StateHasChanged();
if (planner.CanvasQuizzes == null) if (planner.CanvasData == null)
{ {
await planner.LoadCanvasData(); await planner.LoadCanvasData();
} }
@@ -91,7 +91,7 @@
Navigation.NavigateTo("/course/" + planner.LocalCourse?.Settings.Name); Navigation.NavigateTo("/course/" + planner.LocalCourse?.Settings.Name);
} }
private CanvasQuiz? quizInCanvas => planner.CanvasQuizzes?.FirstOrDefault(q => q.Title == quizContext.Quiz?.Name); private CanvasQuiz? quizInCanvas => planner.CanvasData?.Quizzes.FirstOrDefault(q => q.Title == quizContext.Quiz?.Name);
private string canvasQuizUrl => private string canvasQuizUrl =>
$"https://snow.instructure.com/courses/{planner.LocalCourse?.Settings.CanvasId}/quizzes/{quizInCanvas?.Id}"; $"https://snow.instructure.com/courses/{planner.LocalCourse?.Settings.CanvasId}/quizzes/{quizInCanvas?.Id}";

View File

@@ -98,11 +98,11 @@ builder.Services.AddHostedService(sp => sp.GetRequiredService<AkkaService>());
// TODO: need to handle scoped requirements // TODO: need to handle scoped requirements
builder.Services.AddSingleton(sp => // builder.Services.AddSingleton(sp =>
{ // {
var akka = sp.GetRequiredService<AkkaService>(); // var akka = sp.GetRequiredService<AkkaService>();
return new CanvasQueue(akka.CanvasQueueActor ?? throw new Exception("Canvas queue actor not properly created")); // return new CanvasQueueActorWrapper(akka.CoursePlannerActor ?? throw new Exception("Canvas queue actor not properly created"));
}); // });
builder.Services.AddSingleton<IFileStorageManager>(sp => builder.Services.AddSingleton<IFileStorageManager>(sp =>
{ {
var akka = sp.GetRequiredService<AkkaService>(); var akka = sp.GetRequiredService<AkkaService>();

View File

@@ -72,7 +72,7 @@ public class AssignmentEditorContext
await planner.LoadCanvasData(); await planner.LoadCanvasData();
if (planner.CanvasAssignments == null) if (planner.CanvasData == null)
{ {
logger.Log("cannot update assignment in canvas, failed to retrieve current assignments"); logger.Log("cannot update assignment in canvas, failed to retrieve current assignments");
return; return;
@@ -87,7 +87,7 @@ public class AssignmentEditorContext
logger.Log("Cannot update assignment with null local course canvas id"); logger.Log("Cannot update assignment with null local course canvas id");
return; return;
} }
var assignmentInCanvas = planner.CanvasAssignments?.FirstOrDefault(a => a.Id == canvasAssignmentId); var assignmentInCanvas = planner.CanvasData.Assignments?.FirstOrDefault(a => a.Id == canvasAssignmentId);
if (assignmentInCanvas == null) if (assignmentInCanvas == null)
{ {
logger.Log("cannot update assignment in canvas, could not find canvas assignment with id: " + canvasAssignmentId); logger.Log("cannot update assignment in canvas, could not find canvas assignment with id: " + canvasAssignmentId);
@@ -121,7 +121,7 @@ public class AssignmentEditorContext
return; return;
} }
await planner.LoadCanvasData(); await planner.LoadCanvasData();
if (planner.CanvasAssignments == null) if (planner.CanvasData == null)
{ {
logger.Log("cannot add assignment to canvas, failed to retrieve current assignments"); logger.Log("cannot add assignment to canvas, failed to retrieve current assignments");
return; return;
@@ -144,7 +144,7 @@ public class AssignmentEditorContext
var createdAssignmentCanvasId = await planner.LocalCourse.SyncAssignmentToCanvas( var createdAssignmentCanvasId = await planner.LocalCourse.SyncAssignmentToCanvas(
canvasCourseId: (ulong)courseCanvasId, canvasCourseId: (ulong)courseCanvasId,
localAssignment: Assignment, localAssignment: Assignment,
canvasAssignments: planner.CanvasAssignments, canvasAssignments: planner.CanvasData.Assignments,
canvas: canvas canvas: canvas
); );
@@ -179,7 +179,7 @@ public class AssignmentEditorContext
private CanvasModule getCurrentCanvasModule(LocalAssignment assignment, LocalCourse course) private CanvasModule getCurrentCanvasModule(LocalAssignment assignment, LocalCourse course)
{ {
var localModule = getCurrentLocalModule(assignment, course); var localModule = getCurrentLocalModule(assignment, course);
var canvasModule = planner.CanvasModules?.FirstOrDefault(m => m.Name == localModule.Name) var canvasModule = planner.CanvasData?.Modules.FirstOrDefault(m => m.Name == localModule.Name)
?? throw new Exception($"error in assignment context, canvas module with name {localModule.Name} not found in planner"); ?? throw new Exception($"error in assignment context, canvas module with name {localModule.Name} not found in planner");
return canvasModule; return canvasModule;
} }

View File

@@ -1,4 +1,5 @@
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using CanvasModel; using CanvasModel;
using CanvasModel.Assignments; using CanvasModel.Assignments;
using CanvasModel.Courses; using CanvasModel.Courses;
@@ -6,12 +7,25 @@ using CanvasModel.EnrollmentTerms;
using CanvasModel.Modules; using CanvasModel.Modules;
using CanvasModel.Pages; using CanvasModel.Pages;
using CanvasModel.Quizzes; using CanvasModel.Quizzes;
using LocalModels; using LocalModels;
using Management.Services; using Management.Services;
using Management.Services.Canvas; using Management.Services.Canvas;
namespace Management.Planner; namespace Management.Planner;
public record CanvasCourseData
{
public required IEnumerable<CanvasAssignment> Assignments { get; init; }
public required IEnumerable<CanvasAssignmentGroup> AssignmentGroups { get; init; }
public required IEnumerable<CanvasQuiz> Quizzes { get; init; }
public required IEnumerable<CanvasModule> Modules { get; init; }
public required IEnumerable<CanvasPage> Pages { get; init; }
public required Dictionary<CanvasModule, IEnumerable<CanvasModuleItem>> ModulesItems { get; init; }
}
public class CoursePlanner public class CoursePlanner
{ {
private readonly MyLogger<CoursePlanner> logger; private readonly MyLogger<CoursePlanner> logger;
@@ -72,11 +86,6 @@ public class CoursePlanner
} }
} }
public async Task LoadCourseByName(string courseName)
{
}
private void saveCourseToFile(LocalCourse courseAsOfDebounce) private void saveCourseToFile(LocalCourse courseAsOfDebounce)
{ {
_debounceTimer?.Dispose(); _debounceTimer?.Dispose();
@@ -117,23 +126,10 @@ public class CoursePlanner
public event Action? StateHasChanged; public event Action? StateHasChanged;
public IEnumerable<CanvasAssignment>? CanvasAssignments { get; internal set; } public CanvasCourseData? CanvasData { get; internal set; }
public IEnumerable<CanvasAssignmentGroup>? CanvasAssignmentGroups { get; internal set; }
public IEnumerable<CanvasQuiz>? CanvasQuizzes { get; internal set; }
public IEnumerable<CanvasModule>? CanvasModules { get; internal set; }
public IEnumerable<CanvasPage>? CanvasPages { get; internal set; }
public Dictionary<CanvasModule, IEnumerable<CanvasModuleItem>>? CanvasModulesItems { get; internal set; }
public async Task<( public async Task LoadCanvasData()
IEnumerable<CanvasAssignment> CanvasAssignments,
IEnumerable<CanvasModule> CanvasModules,
Dictionary<CanvasModule, IEnumerable<CanvasModuleItem>> CanvasModulesItems,
IEnumerable<CanvasQuiz> canvasQuizzes,
IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups,
IEnumerable<CanvasPage> canvasPages
)> LoadCanvasData()
{ {
using var activity = DiagnosticsConfig.Source.StartActivity("Loading Canvas Data to Course Planner"); using var activity = DiagnosticsConfig.Source.StartActivity("Loading Canvas Data to Course Planner");
LoadingCanvasData = true; LoadingCanvasData = true;
StateHasChanged?.Invoke(); StateHasChanged?.Invoke();
@@ -147,17 +143,26 @@ public class CoursePlanner
var assignmentGroupsTask = canvas.AssignmentGroups.GetAll(canvasId); var assignmentGroupsTask = canvas.AssignmentGroups.GetAll(canvasId);
var coursePagesTask = canvas.Pages.GetAll(canvasId); var coursePagesTask = canvas.Pages.GetAll(canvasId);
CanvasAssignments = await assignmentsTask;
CanvasQuizzes = await quizzesTask;
CanvasModules = await modulesTask;
CanvasAssignmentGroups = await assignmentGroupsTask;
CanvasPages = await coursePagesTask;
CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules); var canvasAssignments = (await assignmentsTask) ?? throw new Exception("Error loading canvas assignments");
var canvasQuizzes = (await quizzesTask) ?? throw new Exception("Error loading canvas quizzes");
var canvasAssignmentGroups = (await assignmentGroupsTask) ?? throw new Exception("Error loading canvas assignment groups");
var canvasPages = (await coursePagesTask) ?? throw new Exception("Error loading canvas pages");
var canvasModules = (await modulesTask) ?? throw new Exception("Error loading canvas modules");
var canvasModulesItems = (await canvas.Modules.GetAllModulesItems(canvasId, canvasModules)) ?? throw new Exception("Error loading canvas module items");
CanvasData = new CanvasCourseData
{
Assignments = canvasAssignments,
Quizzes = canvasQuizzes,
AssignmentGroups = canvasAssignmentGroups,
Pages = canvasPages,
Modules = canvasModules,
ModulesItems = canvasModulesItems,
};
LoadingCanvasData = false; LoadingCanvasData = false;
StateHasChanged?.Invoke(); StateHasChanged?.Invoke();
return (CanvasAssignments, CanvasModules, CanvasModulesItems, CanvasQuizzes, CanvasAssignmentGroups, CanvasPages);
} }
public async Task CreateModule(LocalModule newModule) public async Task CreateModule(LocalModule newModule)
@@ -167,14 +172,20 @@ public class CoursePlanner
var canvasCourseId = var canvasCourseId =
LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module"); LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module");
await canvas.Modules.CreateModule(canvasCourseId, newModule.Name); await canvas.Modules.CreateModule(canvasCourseId, newModule.Name);
CanvasModules = await canvas.Modules.GetModules(canvasCourseId); var canvasModules = await canvas.Modules.GetModules(canvasCourseId);
if (CanvasData != null)
{
CanvasData = CanvasData with
{
Modules = canvasModules
};
}
} }
public void Clear() public void Clear()
{ {
CanvasData = null;
LocalCourse = null; LocalCourse = null;
CanvasAssignments = null;
CanvasModules = null;
} }
public async Task SyncAssignmentGroups() public async Task SyncAssignmentGroups()
@@ -185,12 +196,11 @@ public class CoursePlanner
var canvasCourseId = var canvasCourseId =
LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module"); LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module");
var canvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId);
CanvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId); await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(canvasCourseId, canvasAssignmentGroups, canvas);
await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(canvasCourseId, CanvasAssignmentGroups, canvas); canvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId);
CanvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId);
LocalCourse = LocalCourse with LocalCourse = LocalCourse with
{ {
@@ -198,12 +208,16 @@ public class CoursePlanner
{ {
AssignmentGroups = LocalCourse.Settings.AssignmentGroups.Select(g => AssignmentGroups = LocalCourse.Settings.AssignmentGroups.Select(g =>
{ {
var canvasGroup = CanvasAssignmentGroups.FirstOrDefault(c => c.Name == g.Name); var canvasGroup = canvasAssignmentGroups.FirstOrDefault(c => c.Name == g.Name);
return canvasGroup == null return canvasGroup == null
? g ? g
: g with { CanvasId = canvasGroup.Id }; : g with { CanvasId = canvasGroup.Id };
}) })
} }
}; };
CanvasData = CanvasData with
{
AssignmentGroups = canvasAssignmentGroups
};
} }
} }

View File

@@ -89,7 +89,7 @@ public class PageEditorContext(
return; return;
} }
await planner.LoadCanvasData(); await planner.LoadCanvasData();
if (planner.CanvasPages == null) if (planner.CanvasData == null)
{ {
logger.Log("cannot add page to canvas, failed to retrieve current pages"); logger.Log("cannot add page to canvas, failed to retrieve current pages");
return; return;
@@ -143,7 +143,7 @@ public class PageEditorContext(
await planner.LoadCanvasData(); await planner.LoadCanvasData();
if (planner.CanvasPages == null) if (planner.CanvasData == null)
{ {
logger.Log("cannot update page in canvas, failed to retrieve current pages"); logger.Log("cannot update page in canvas, failed to retrieve current pages");
return; return;
@@ -158,7 +158,7 @@ public class PageEditorContext(
logger.Log("Cannot update page with null local course canvas id"); logger.Log("Cannot update page with null local course canvas id");
return; return;
} }
var assignmentInCanvas = planner.CanvasPages?.FirstOrDefault(p => p.PageId == canvasPageId); var assignmentInCanvas = planner.CanvasData?.Pages.FirstOrDefault(p => p.PageId == canvasPageId);
if (assignmentInCanvas == null) if (assignmentInCanvas == null)
{ {
logger.Log("cannot update page in canvas, could not find canvas page with id: " + canvasPageId); logger.Log("cannot update page in canvas, could not find canvas page with id: " + canvasPageId);
@@ -184,7 +184,7 @@ public class PageEditorContext(
private CanvasModule getCurrentCanvasModule(LocalCoursePage quiz, LocalCourse course) private CanvasModule getCurrentCanvasModule(LocalCoursePage quiz, LocalCourse course)
{ {
var localModule = getCurrentLocalModule(quiz, course); var localModule = getCurrentLocalModule(quiz, course);
var canvasModule = planner.CanvasModules?.FirstOrDefault(m => m.Name == localModule.Name) var canvasModule = planner.CanvasData?.Modules.FirstOrDefault(m => m.Name == localModule.Name)
?? throw new Exception($"error in page context, canvas module with name {localModule.Name} not found in planner"); ?? throw new Exception($"error in page context, canvas module with name {localModule.Name} not found in planner");
return canvasModule; return canvasModule;
} }

View File

@@ -1,6 +1,9 @@
using System.Reflection.Metadata.Ecma335; using System.Reflection.Metadata.Ecma335;
using CanvasModel.Modules; using CanvasModel.Modules;
using LocalModels; using LocalModels;
using Management.Planner; using Management.Planner;
using Management.Services; using Management.Services;
using Management.Services.Canvas; using Management.Services.Canvas;
@@ -91,7 +94,7 @@ public class QuizEditorContext(
return; return;
} }
await planner.LoadCanvasData(); await planner.LoadCanvasData();
if (planner.CanvasQuizzes == null) if (planner.CanvasData == null)
{ {
logger.Log("cannot add quiz to canvas, failed to retrieve current quizzes"); logger.Log("cannot add quiz to canvas, failed to retrieve current quizzes");
return; return;
@@ -142,7 +145,7 @@ public class QuizEditorContext(
private CanvasModule getCurrentCanvasModule(LocalQuiz quiz, LocalCourse course) private CanvasModule getCurrentCanvasModule(LocalQuiz quiz, LocalCourse course)
{ {
var localModule = getCurrentLocalModule(quiz, course); var localModule = getCurrentLocalModule(quiz, course);
var canvasModule = planner.CanvasModules?.FirstOrDefault(m => m.Name == localModule.Name) var canvasModule = planner.CanvasData?.Modules.FirstOrDefault(m => m.Name == localModule.Name)
?? throw new Exception($"error in quiz context, canvas module with name {localModule.Name} not found in planner"); ?? throw new Exception($"error in quiz context, canvas module with name {localModule.Name} not found in planner");
return canvasModule; return canvasModule;
} }

View File

@@ -1,9 +0,0 @@
using Akka.Actor;
using Management.Services.Canvas;
public class CanvasQueue(IActorRef canvasQueueActor)
{
private readonly IActorRef canvasQueueActor = canvasQueueActor;
}

View File

@@ -1,17 +0,0 @@
using Akka.Actor;
using Microsoft.Extensions.DependencyInjection;
public class CanvasQueueActor : ReceiveActor
{
private readonly IServiceProvider serviceProvider;
private readonly IServiceScope scope;
private readonly ILogger<CanvasQueueActor> logger;
public CanvasQueueActor(IServiceProvider serviceProviderArg)
{
serviceProvider = serviceProviderArg;
scope = serviceProvider.CreateScope();
logger = scope.ServiceProvider.GetRequiredService<ILogger<CanvasQueueActor>>();
}
}

View File

@@ -0,0 +1,18 @@
using Akka.Actor;
using Management.Services;
using Microsoft.Extensions.DependencyInjection;
public class CoursePlannerActor: ReceiveActor
{
private readonly IServiceProvider serviceProvider;
private readonly IServiceScope scope;
private readonly MyLogger<CoursePlannerActor> logger;
public CoursePlannerActor(IServiceProvider serviceProviderArg)
{
serviceProvider = serviceProviderArg;
scope = serviceProvider.CreateScope();
logger = scope.ServiceProvider.GetRequiredService<MyLogger<CoursePlannerActor>>();
}
}

View File

@@ -1,15 +1,16 @@
using Akka.Actor; using Akka.Actor;
using LocalModels; using LocalModels;
using Management.Services; using Management.Services;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
public class IStorageActor : ReceiveActor {} public class LocalStorageActor : ReceiveActor
public class LocalStorageActor : IStorageActor
{ {
private readonly IServiceProvider serviceProvider; private readonly IServiceProvider serviceProvider;
private readonly IServiceScope scope; private readonly IServiceScope scope;
private readonly MyLogger<CanvasQueueActor> logger; private readonly MyLogger<LocalStorageActor> logger;
private readonly FileStorageService storage; private readonly FileStorageService storage;
private DateTime? cacheTime { get; set; } = null; private DateTime? cacheTime { get; set; } = null;
@@ -20,7 +21,7 @@ public class LocalStorageActor : IStorageActor
{ {
serviceProvider = serviceProviderArg; serviceProvider = serviceProviderArg;
scope = serviceProvider.CreateScope(); scope = serviceProvider.CreateScope();
logger = scope.ServiceProvider.GetRequiredService<MyLogger<CanvasQueueActor>>(); logger = scope.ServiceProvider.GetRequiredService<MyLogger<LocalStorageActor>>();
storage = scope.ServiceProvider.GetRequiredService<FileStorageService>(); storage = scope.ServiceProvider.GetRequiredService<FileStorageService>();
Receive<EmptyDirectoryAsk>(m => Receive<EmptyDirectoryAsk>(m =>

View File

@@ -18,7 +18,7 @@ public class AkkaService(
private readonly IConfiguration configuration = configuration; private readonly IConfiguration configuration = configuration;
private readonly IServiceProvider serviceProvider = serviceProvider; private readonly IServiceProvider serviceProvider = serviceProvider;
private readonly IHostApplicationLifetime applicationLifetime = appLifetime; private readonly IHostApplicationLifetime applicationLifetime = appLifetime;
public IActorRef? CanvasQueueActor { get; private set; } public IActorRef? CoursePlannerActor { get; private set; }
public IActorRef? StorageActor { get; private set; } public IActorRef? StorageActor { get; private set; }
public Task StartAsync(CancellationToken cancellationToken) public Task StartAsync(CancellationToken cancellationToken)
@@ -30,8 +30,8 @@ public class AkkaService(
actorSystem = ActorSystem.Create("canavas-management-actor-system", mergedSystemSetup); actorSystem = ActorSystem.Create("canavas-management-actor-system", mergedSystemSetup);
var canvasQueueProps = DependencyResolver.For(actorSystem).Props<CanvasQueueActor>(); var canvasQueueProps = DependencyResolver.For(actorSystem).Props<CoursePlannerActor>();
CanvasQueueActor = actorSystem.ActorOf(canvasQueueProps, "canvasQueue"); CoursePlannerActor = actorSystem.ActorOf(canvasQueueProps, "canvasQueue");
var localStorageProps = DependencyResolver.For(actorSystem).Props<LocalStorageActor>(); var localStorageProps = DependencyResolver.For(actorSystem).Props<LocalStorageActor>();
StorageActor = actorSystem.ActorOf(localStorageProps, "localStorage"); StorageActor = actorSystem.ActorOf(localStorageProps, "localStorage");