From e96a3ef09faaf654544da0fd076cebc78406b8c9 Mon Sep 17 00:00:00 2001 From: Michele Date: Fri, 6 Nov 2020 23:53:37 +0000 Subject: [PATCH] persistence, mediator --- .vscode/launch.json | 15 ++++++- Sledgemapper.Api/.vscode/launch.json | 34 ++++++++++++++ Sledgemapper.Api/.vscode/tasks.json | 42 +++++++++++++++++ Sledgemapper.Api/Data/MyDbContext.cs | 51 +++++++++++++++++++++ Sledgemapper.Api/Hubs/SledgemapperHub.cs | 35 ++++++++++++--- Sledgemapper.Api/Models/MapLog.cs | 30 +++++++++++++ Sledgemapper.Api/Models/Snapshot.cs | 18 ++++++++ Sledgemapper.Api/MyDatabase.db | Bin 0 -> 28672 bytes Sledgemapper.Api/MyDatabase.db-shm | Bin 0 -> 32768 bytes Sledgemapper.Api/MyDatabase.db-wal | Bin 0 -> 1590352 bytes Sledgemapper.Api/Program.cs | 24 +++++++++- Sledgemapper.Api/Sledgemapper.Api.csproj | 6 +++ Sledgemapper.Api/Startup.cs | 8 ++++ Sledgemapper.Api/sledgemapper.db | Bin 0 -> 20480 bytes Sledgemapper/Sledgemapper.cs | 55 ++++++++++++----------- 15 files changed, 284 insertions(+), 34 deletions(-) create mode 100644 Sledgemapper.Api/.vscode/launch.json create mode 100644 Sledgemapper.Api/.vscode/tasks.json create mode 100644 Sledgemapper.Api/Data/MyDbContext.cs create mode 100644 Sledgemapper.Api/Models/MapLog.cs create mode 100644 Sledgemapper.Api/Models/Snapshot.cs create mode 100644 Sledgemapper.Api/MyDatabase.db create mode 100644 Sledgemapper.Api/MyDatabase.db-shm create mode 100644 Sledgemapper.Api/MyDatabase.db-wal create mode 100644 Sledgemapper.Api/sledgemapper.db diff --git a/.vscode/launch.json b/.vscode/launch.json index cce2780..89a6521 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -2,7 +2,7 @@ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", + "version": "0.2.0", "configurations": [ { "name": "Docker .NET Core Attach (Preview)", @@ -18,7 +18,18 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build sledgemapper", - "program": "${workspaceFolder}/Sledgemapper/bin/Debug/netcoreapp3.1/sledgemapper.dll", + "program": "${workspaceFolder}/Sledgemapper/bin/Debug/net5.0/sledgemapper.dll", + "args": [], + "cwd": "${workspaceFolder}/Sledgemapper", + "console": "internalConsole", + "stopAtEntry": false + }, + { + "name": "Sledgemapper.API", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build sledgemapper.api", + "program": "${workspaceFolder}/Sledgemapper.Api/bin/Debug/net5.0/sledgemapper.api.dll", "args": [], "cwd": "${workspaceFolder}/Sledgemapper", "console": "internalConsole", diff --git a/Sledgemapper.Api/.vscode/launch.json b/Sledgemapper.Api/.vscode/launch.json new file mode 100644 index 0000000..53d95e4 --- /dev/null +++ b/Sledgemapper.Api/.vscode/launch.json @@ -0,0 +1,34 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "${workspaceFolder}/bin/Debug/net5.0/Sledgemapper.Api.dll", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "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", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/Sledgemapper.Api/.vscode/tasks.json b/Sledgemapper.Api/.vscode/tasks.json new file mode 100644 index 0000000..81fe924 --- /dev/null +++ b/Sledgemapper.Api/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Sledgemapper.Api.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/Sledgemapper.Api.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "${workspaceFolder}/Sledgemapper.Api.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Sledgemapper.Api/Data/MyDbContext.cs b/Sledgemapper.Api/Data/MyDbContext.cs new file mode 100644 index 0000000..a01d2ba --- /dev/null +++ b/Sledgemapper.Api/Data/MyDbContext.cs @@ -0,0 +1,51 @@ +using System; +using System.Security.AccessControl; +using Microsoft.EntityFrameworkCore; +using Sledgemapper.Api.Models; +using System.Reflection; +namespace Sledgemapper.Api.Data +{ + public static class DbInitializer + { + public static void Initialize(MyDbContext context) + { + context.Database.EnsureCreated(); + } + } + + + + + public class MyDbContext : DbContext + { + public DbSet MapLogs { get; set; } + + public MyDbContext(DbContextOptions options):base(options) + {} + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + // optionsBuilder. + // options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName); + // optionsBuilder.UseSqlite("Filename=SledgemapperDatabase.db", options => + // { + // options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName); + // }); + optionsBuilder.UseSqlite("Filename=MyDatabase.db"); + + base.OnConfiguring(optionsBuilder); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + // Map table names + modelBuilder.Entity().ToTable("MapLog", "dbo"); + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.MapLogId); + //entity.HasIndex(e => {e.SessionName, e.Timestamp}); + }); + base.OnModelCreating(modelBuilder); + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Hubs/SledgemapperHub.cs b/Sledgemapper.Api/Hubs/SledgemapperHub.cs index 5a1dfd5..a0b3ffa 100644 --- a/Sledgemapper.Api/Hubs/SledgemapperHub.cs +++ b/Sledgemapper.Api/Hubs/SledgemapperHub.cs @@ -1,3 +1,4 @@ +using System.Security.AccessControl; using Microsoft.AspNetCore.SignalR; using System.Collections.Generic; using System.Linq; @@ -6,14 +7,19 @@ using System.Collections.Concurrent; using Sledgemapper.Shared.Entities; using Sledgemapper.Clients; using MediatR; - +using System; +using Sledgemapper.Api.Data; +using System.Text.Json; +using System.Text.Json.Serialization; namespace SignalRChat.Hubs { public class SledgemapperHub : Hub { -private readonly IMediator _mediator; + private readonly IMediator _mediator; + private readonly MyDbContext _dbcontext; - public SledgemapperHub(IMediator mediator) => _mediator = mediator; + // public SledgemapperHub(IMediator mediator) => _mediator = mediator; + public SledgemapperHub(MyDbContext dbcontext, IMediator _mediator) =>{ _dbcontext = dbcontext; _mediator=mediator}; private static Dictionary _sessions = new Dictionary(); public List Colors = new List{"CC0000", "CC3300", @@ -27,12 +33,23 @@ private readonly IMediator _mediator; public async Task NewTile(string sessionName, Tile tile) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + + var existingTile = _sessions[sessionName].Map.TryGetValue(tile.ToString(), out var t); if (existingTile) { _sessions[sessionName].Map.TryRemove(t.ToString(), out var rtile); } _sessions[sessionName].Map.TryAdd(tile.ToString(), tile); + + var jsonString = JsonSerializer.Serialize(tile); + +_dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog{ + Operation="N", SessionName=sessionName, Type="T", Timestamp=timestamp, Object=jsonString +}); +await _dbcontext.SaveChangesAsync(); + await Clients.Group(sessionName).NewTile(tile); } @@ -49,12 +66,19 @@ private readonly IMediator _mediator; public async Task NewOverlay(string sessionName, Overlay tile) { + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); var existingTile = _sessions[sessionName].Overlays.TryGetValue(tile.ToString(), out var t); if (existingTile) { _sessions[sessionName].Overlays.TryRemove(t.ToString(), out var rtile); } _sessions[sessionName].Overlays.TryAdd(tile.ToString(), tile); + var jsonString = JsonSerializer.Serialize(tile); + +_dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog{ + Operation="N", SessionName=sessionName, Type="O", Timestamp=timestamp, Object=jsonString +}); +await _dbcontext.SaveChangesAsync(); await Clients.Group(sessionName).NewOverlay(tile); } @@ -85,6 +109,7 @@ private readonly IMediator _mediator; session.Players.Add(player); _sessions.Add(sessionName, session); + await Groups.AddToGroupAsync(Context.ConnectionId, sessionName); return session; } @@ -123,8 +148,8 @@ private readonly IMediator _mediator; _sessions[sessionName].Map = map.Map; _sessions[sessionName].Overlays = map.Overlays; _sessions[sessionName].Walls = map.Walls; - - await Clients.Group(sessionName).UpdateMap( _sessions[sessionName]); + + await Clients.Group(sessionName).UpdateMap(_sessions[sessionName]); } } } \ No newline at end of file diff --git a/Sledgemapper.Api/Models/MapLog.cs b/Sledgemapper.Api/Models/MapLog.cs new file mode 100644 index 0000000..d743479 --- /dev/null +++ b/Sledgemapper.Api/Models/MapLog.cs @@ -0,0 +1,30 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Models +{ + + public class MapLog + { + [Key] + public int MapLogId { get; set; } + + [Required] + public string SessionName { get; set; } + + [Required] + [MaxLength(1)] + public string Operation { get; set; } + + [Required] + [MaxLength(256)] + public string Type { get; set; } + + [Required] + [MaxLength(256)] + public string Object { get; set; } + + [Required] + public double Timestamp { get; set; } + } +} diff --git a/Sledgemapper.Api/Models/Snapshot.cs b/Sledgemapper.Api/Models/Snapshot.cs new file mode 100644 index 0000000..0b83e97 --- /dev/null +++ b/Sledgemapper.Api/Models/Snapshot.cs @@ -0,0 +1,18 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Models +{ + + public class Snapshot + { + [Key] + public int SnapshotId { get; set; } + + [Required] + public string Object { get; set; } + + [Required] + public double Timestamp { get; set; } + } +} diff --git a/Sledgemapper.Api/MyDatabase.db b/Sledgemapper.Api/MyDatabase.db new file mode 100644 index 0000000000000000000000000000000000000000..06b37ec19754bacdca5ff408f89e1103d1a7e1f8 GIT binary patch literal 28672 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 F{{!ZWpbh{4 literal 0 HcmV?d00001 diff --git a/Sledgemapper.Api/MyDatabase.db-shm b/Sledgemapper.Api/MyDatabase.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..17fbfc183dfcc01ab12ed52a5da7617e1d396c10 GIT binary patch literal 32768 zcmeI*b#TyT7{~GNuM}vD6)(^NrNt>)+?`^@T?>U4D_-2@%G`Zp?#^7;*10Pi+nD>9 zJ4@Eyt^e*W)# z6%^%Wrxzvf%u7w%w|j5We>^^{9Y$F9V5unH`|rA3uvsx!%4!aHh$*@LIOl(!ga6Z^ zw0C@ow{!9P7o|gK=Y$ex=VIq59ZEZg{dd@p9*#L^w!;Dzuz&?DU;ztQzycPqfCVgI z0Sj2b0v51<1uS3z3s}Gc7O;Q?EMNf(Sik}nuz&?DU;ztQzycPqfCVgI0Sj2b0v51< z1uS3z3s}Gc7ATVf{kf2z85@2)?XW-@6Bxin{K7at{blUF`*K481#@JS59S<-59Z0J zLN%&WliJj!9t}vL5vionl;*UgH5s&{1D)thSGv=a-t=W4gBeN|BN#$S}Q~C)Ipup zSzXm#J=I%%)n5ZOSVNVi5gMgzjn_m?)>KW`OwHC@%~P%xDqoAWR0Ue0Ra&D$t=C3v z)>dtIf8!U>0v51<1uS3z3s~R~3d9gg1>#7cGF3^W2DPX|67@-@A&qH5I?ZT7E85VO z_H-nZE_9;@z34-~L)cQE$^uaf3}Ohw7|uvWGlp?YU=mZ9#tddLhaBd!fIJqlgk>ye zC97G>IySJ0Eo@^4M{+dBay%z;GN*7FXK)tha2^*#-B8!FK;#0Ka2Z!{C0BDT*K;E` zb1S!VCwFrX_wfJ^@d$f(oFbm$8J^<>Ug8yA;|<>8ZT9gV`}vTM`IOK3lCSxe@A!eA zB5$V)S|ECX-}r;Sf`QK%#j1khl%UG0szlXLE!9zy>ML0d)mTlGu4ZbXR%)ZRYOjvU zR2Owq5A{+X_0s?i(hv>PaE;Vxjq!M1^tZ|tBNv#UNt&W*nxR>mqa4lG0_ACumS~xl zYo%6et=4ISHff8tDg0l7!vYqtfCVgI0Sj2b0v51<1uS3z3s}Gc7O;Q?EMNf(Sik}n Muz&?DaJUHk4Rt5cPXGV_ literal 0 HcmV?d00001 diff --git a/Sledgemapper.Api/MyDatabase.db-wal b/Sledgemapper.Api/MyDatabase.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..301b54e7cb88410fab07dcdb38da5a6b1c29cc51 GIT binary patch literal 1590352 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

Pw?f*OEdY`+g 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 HAHn|veb-9) literal 0 HcmV?d00001 diff --git a/Sledgemapper.Api/Program.cs b/Sledgemapper.Api/Program.cs index 58d16e6..a9f9ce2 100644 --- a/Sledgemapper.Api/Program.cs +++ b/Sledgemapper.Api/Program.cs @@ -4,8 +4,10 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Sledgemapper.Api.Data; namespace SignalRChat { @@ -13,7 +15,9 @@ namespace SignalRChat { public static void Main(string[] args) { - CreateHostBuilder(args).Build().Run(); + var host = CreateHostBuilder(args).Build(); + CreateDbIfNotExists(host); +host.Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => @@ -22,5 +26,23 @@ namespace SignalRChat { webBuilder.UseStartup(); }); + + private static void CreateDbIfNotExists(IHost host) + { + using (var scope = host.Services.CreateScope()) + { + var services = scope.ServiceProvider; + try + { + var context = services.GetRequiredService(); + DbInitializer.Initialize(context); + } + catch (Exception ex) + { + var logger = services.GetRequiredService>(); + logger.LogError(ex, "An error occurred creating the DB."); + } + } + } } } diff --git a/Sledgemapper.Api/Sledgemapper.Api.csproj b/Sledgemapper.Api/Sledgemapper.Api.csproj index 1f3ab63..fb38178 100644 --- a/Sledgemapper.Api/Sledgemapper.Api.csproj +++ b/Sledgemapper.Api/Sledgemapper.Api.csproj @@ -6,6 +6,12 @@ + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + diff --git a/Sledgemapper.Api/Startup.cs b/Sledgemapper.Api/Startup.cs index 278683d..866ad10 100644 --- a/Sledgemapper.Api/Startup.cs +++ b/Sledgemapper.Api/Startup.cs @@ -10,6 +10,9 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using SignalRChat.Hubs; using MediatR.Pipeline; +using Sledgemapper.Api.Data; +using Microsoft.EntityFrameworkCore; + namespace SignalRChat { public class Startup @@ -17,6 +20,7 @@ namespace SignalRChat public Startup(IConfiguration configuration) { Configuration = configuration; + } public IConfiguration Configuration { get; } @@ -27,6 +31,10 @@ namespace SignalRChat services.AddRazorPages(); services.AddSignalR(); // services.AddMediatR(typeof(Startup)); + services.AddDbContext(options => options.UseSqlite("Data Source=sledgemapper.db")); + // services.AddEntityFrameworkSqlite().AddDbContext(); + + } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. diff --git a/Sledgemapper.Api/sledgemapper.db b/Sledgemapper.Api/sledgemapper.db new file mode 100644 index 0000000000000000000000000000000000000000..f0e9dd6f046088b1eee1f6bd5b4364414ac3331e GIT binary patch literal 20480 zcmeI&!EV|x7zc10XuBb0?1s3kR!*&2Ap+eHx6vxwP(xslPUWygDR@;TAT%-3dR(>F znY3rw6YR8S*l}NgOn~44ivFKsu#NpW{y`1_y6-JtN%1)dN1hTD_MCCfUJJn(OHtXQ zl0@9jBn^7zOZ9El6f2$yE%%pYv`_5WuiOvqCshy-fB*y_009U<00Izz00eeUpq<&z zpPcZX@@|GQx*O81mK({tsT}v$n|l`>v+kI}sh?Y>SQ~pZ_D1rQW*$ErrVsLk0{>o^ zzxj^G;nHX<0$BXg3DBXxNVV*6awo4{6TC+b&Dt6|d$P1ANx7b&|kiu_<~)5+<=F|R4zB4sk7HIbpGXv~(^o%_kw zsW)F_Uu~P`k7T60(L@)-X8m7R%N~Eb<_Gy|l|Qs*LauARY5KSGvxwgLkqW~5jh(4g zzl~#-IFp>Q=*r&LIkzNQ(oMA5VKA8X)dv~ItZQj$YmL-?{$rIhe>{+17atLCs)AYD z-MEfxZ0t_crS>Gg+%zgY_nXmyfB*y_009U<00Izz00bZa0SG|gkqW%v=~}*ADwhnS z^r~DjjF)GwKlYXH4J$>XSj*DBc1Rwwb2tWV=5P$## LAOHafECl`m-T~(1 literal 0 HcmV?d00001 diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 1bd415d..3c958a8 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -13,7 +13,7 @@ using System.IO; using System.Linq; using System; using System.Collections.Concurrent; -using Sledgemapper.Entities; +using Sledgemapper.Shared.Entities; namespace Sledgemapper { @@ -58,13 +58,12 @@ namespace Sledgemapper Window.AllowUserResizing = true; Players = new List(); connection = new HubConnectionBuilder() - .WithAutomaticReconnect() -#if DEBUG - .WithUrl("http://localhost:5000/ChatHub") -#else - .WithUrl("http://hub.michelescandura.com:5000/ChatHub") -#endif - .Build(); + // .WithAutomaticReconnect() + + .WithUrl("http://localhost:5000/SledgemapperHub") + + // .WithUrl("http://hub.michelescandura.com:5000/SledgemapperHub") + .Build(); connection.On("UpdateMap", (map) => { @@ -262,7 +261,11 @@ namespace Sledgemapper } successful = session != null; } - catch { } + catch (Exception ex) + + { + + } if (successful) { _session = textbox.Text; @@ -276,8 +279,8 @@ namespace Sledgemapper window.Closed += (s, a) => { - // Called when window is closed - }; + // Called when window is closed + }; window.ShowModal(_desktop); }; @@ -297,8 +300,8 @@ namespace Sledgemapper RowSpacing = 3, }; - // Set partitioning configuration - grid.ColumnsProportions.Add(new Proportion(ProportionType.Auto)); + // Set partitioning configuration + grid.ColumnsProportions.Add(new Proportion(ProportionType.Auto)); grid.ColumnsProportions.Add(new Proportion(ProportionType.Fill)); grid.RowsProportions.Add(new Proportion(ProportionType.Auto)); grid.RowsProportions.Add(new Proportion(ProportionType.Auto)); @@ -318,15 +321,15 @@ namespace Sledgemapper content.Widgets.Add(grid); - // var content = new VerticalStackPanel(); - // var textbox = new TextBox(); - // TextButton button = new TextButton - // { - // Text = "Start", - // HorizontalAlignment = HorizontalAlignment.Center - // }; - button.Click += async (s, e) => - { + // var content = new VerticalStackPanel(); + // var textbox = new TextBox(); + // TextButton button = new TextButton + // { + // Text = "Start", + // HorizontalAlignment = HorizontalAlignment.Center + // }; + button.Click += async (s, e) => + { if (string.IsNullOrWhiteSpace(textbox.Text)) { return; @@ -353,14 +356,14 @@ namespace Sledgemapper window.Close(); } }; - //content.Widgets.Add(textbox); - content.Widgets.Add(button); + //content.Widgets.Add(textbox); + content.Widgets.Add(button); window.Content = content; window.Closed += (s, a) => { - // Called when window is closed - }; + // Called when window is closed + }; window.ShowModal(_desktop); };