From 4985dc4179c4229d00534495f3d8295e617b0d8c Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Tue, 22 Jul 2025 17:03:33 -0500 Subject: [PATCH] Started the Split Split Json data models coming from REST Api, from the Database models storing them in a SQLite database. Work to re-engineer endpoints to use Database objects, and copy/update data from the json objects. More work is needed. --- FreeTubeSync.sln.DotSettings.user | 3 + FreeTubeSync/Database/DataContext.cs | 19 +- FreeTubeSync/Database/MapData.cs | 36 +++ FreeTubeSync/EndPoints/HistoryEndpoint.cs | 20 +- FreeTubeSync/EndPoints/PlaylistEndpoint.cs | 51 +++- FreeTubeSync/EndPoints/ProfileEndpoint.cs | 63 ++++- .../EndPoints/SearchHistoryEndpoint.cs | 20 +- FreeTubeSync/EndPoints/SettingEndpoint.cs | 22 +- FreeTubeSync/IRepository.cs | 6 +- .../20250722190700_SwitchToSplit.Designer.cs | 246 ++++++++++++++++++ .../20250722190700_SwitchToSplit.cs | 28 ++ .../Migrations/DataContextModelSnapshot.cs | 37 ++- FreeTubeSync/Model/Database/History.cs | 23 ++ FreeTubeSync/Model/Database/Playlist.cs | 14 + FreeTubeSync/Model/Database/Profile.cs | 13 + FreeTubeSync/Model/Database/SearchHistory.cs | 10 + FreeTubeSync/Model/Database/Setting.cs | 10 + FreeTubeSync/Model/Database/Subscription.cs | 11 + FreeTubeSync/Model/Database/Video.cs | 17 ++ FreeTubeSync/Model/History.cs | 43 --- FreeTubeSync/Model/Json/HistoryJson.cs | 23 ++ FreeTubeSync/Model/Json/PlaylistJson.cs | 14 + FreeTubeSync/Model/Json/ProfileJson.cs | 13 + FreeTubeSync/Model/Json/SearchHistoryJson.cs | 10 + FreeTubeSync/Model/Json/SettingJson.cs | 10 + FreeTubeSync/Model/Json/SubscriptionJson.cs | 11 + FreeTubeSync/Model/Json/VideoJson.cs | 18 ++ FreeTubeSync/Model/Playlist.cs | 39 --- FreeTubeSync/Model/Profile.cs | 36 --- FreeTubeSync/Model/SearchHistory.cs | 17 -- FreeTubeSync/Model/Setting.cs | 30 --- FreeTubeSync/Model/Subscription.cs | 19 -- FreeTubeSync/Model/Video.cs | 31 --- FreeTubeSync/Repository.cs | 15 +- FreeTubeSync/SpecialResponses/Mappings.cs | 20 -- .../SpecialResponses/SettingResponse.cs | 9 - 36 files changed, 684 insertions(+), 323 deletions(-) create mode 100644 FreeTubeSync.sln.DotSettings.user create mode 100644 FreeTubeSync/Database/MapData.cs create mode 100644 FreeTubeSync/Migrations/20250722190700_SwitchToSplit.Designer.cs create mode 100644 FreeTubeSync/Migrations/20250722190700_SwitchToSplit.cs create mode 100644 FreeTubeSync/Model/Database/History.cs create mode 100644 FreeTubeSync/Model/Database/Playlist.cs create mode 100644 FreeTubeSync/Model/Database/Profile.cs create mode 100644 FreeTubeSync/Model/Database/SearchHistory.cs create mode 100644 FreeTubeSync/Model/Database/Setting.cs create mode 100644 FreeTubeSync/Model/Database/Subscription.cs create mode 100644 FreeTubeSync/Model/Database/Video.cs delete mode 100644 FreeTubeSync/Model/History.cs create mode 100644 FreeTubeSync/Model/Json/HistoryJson.cs create mode 100644 FreeTubeSync/Model/Json/PlaylistJson.cs create mode 100644 FreeTubeSync/Model/Json/ProfileJson.cs create mode 100644 FreeTubeSync/Model/Json/SearchHistoryJson.cs create mode 100644 FreeTubeSync/Model/Json/SettingJson.cs create mode 100644 FreeTubeSync/Model/Json/SubscriptionJson.cs create mode 100644 FreeTubeSync/Model/Json/VideoJson.cs delete mode 100644 FreeTubeSync/Model/Playlist.cs delete mode 100644 FreeTubeSync/Model/Profile.cs delete mode 100644 FreeTubeSync/Model/SearchHistory.cs delete mode 100644 FreeTubeSync/Model/Setting.cs delete mode 100644 FreeTubeSync/Model/Subscription.cs delete mode 100644 FreeTubeSync/Model/Video.cs delete mode 100644 FreeTubeSync/SpecialResponses/Mappings.cs delete mode 100644 FreeTubeSync/SpecialResponses/SettingResponse.cs diff --git a/FreeTubeSync.sln.DotSettings.user b/FreeTubeSync.sln.DotSettings.user new file mode 100644 index 0000000..6675bb5 --- /dev/null +++ b/FreeTubeSync.sln.DotSettings.user @@ -0,0 +1,3 @@ + + ForceIncluded + ForceIncluded \ No newline at end of file diff --git a/FreeTubeSync/Database/DataContext.cs b/FreeTubeSync/Database/DataContext.cs index e4810d1..a4d16de 100644 --- a/FreeTubeSync/Database/DataContext.cs +++ b/FreeTubeSync/Database/DataContext.cs @@ -1,4 +1,4 @@ -using FreeTubeSync.Model; +using FreeTubeSync.Model.Database; using Microsoft.EntityFrameworkCore; namespace FreeTubeSync.Database; @@ -12,25 +12,8 @@ public class DataContext : DbContext protected override void OnModelCreating(ModelBuilder modelBuilder) { - modelBuilder.Entity() - .ToTable("Settings") - .HasKey(s => s._id); - - modelBuilder.Entity() - .Property(s => s.ValueJson) - .HasColumnName("Value") - .IsRequired(); - - modelBuilder.Entity() - .ToTable("Profiles") - .HasKey(s => s._id); - modelBuilder.Entity() .Navigation(e => e.subscriptions).AutoInclude(); - - modelBuilder.Entity() - .ToTable("Playlists") - .HasKey(s => s._id); modelBuilder.Entity() .Navigation(e => e.videos).AutoInclude(); diff --git a/FreeTubeSync/Database/MapData.cs b/FreeTubeSync/Database/MapData.cs new file mode 100644 index 0000000..f6dc079 --- /dev/null +++ b/FreeTubeSync/Database/MapData.cs @@ -0,0 +1,36 @@ +using System.Collections; + +namespace FreeTubeSync.Database; + +public static class MapData +{ + public static void MapFrom(this object obj1, object obj2) + { + var props = new Dictionary(); + var t1Type = obj1.GetType(); + var t2Type = obj2.GetType(); + + var properties = t1Type.GetProperties(); + foreach (var property in properties) + { + props[property.Name] = property.GetValue(obj1); + } + properties = t2Type.GetProperties(); + foreach (var property in properties) + { + if (props[property.Name] is not IEnumerable) + property.SetValue(obj2, props[property.Name]); + } + } + + public static void MapTo(this IEnumerable obj1, IList obj2) + where T1 : class where T2 : class, new() + { + foreach (var obj in obj1) + { + var newObj = new T2(); + newObj.MapFrom(obj); + obj2.Add(newObj); + } + } +} \ No newline at end of file diff --git a/FreeTubeSync/EndPoints/HistoryEndpoint.cs b/FreeTubeSync/EndPoints/HistoryEndpoint.cs index d57c233..93dac26 100644 --- a/FreeTubeSync/EndPoints/HistoryEndpoint.cs +++ b/FreeTubeSync/EndPoints/HistoryEndpoint.cs @@ -1,4 +1,6 @@ -using FreeTubeSync.Model; +using FreeTubeSync.Database; +using FreeTubeSync.Model.Database; +using FreeTubeSync.Model.Json; namespace FreeTubeSync.EndPoints; @@ -11,17 +13,23 @@ public static class HistoryEndpoint group.MapGet("/", async (IRepository repository, CancellationToken ct) => { var results = await repository.GetAllAsync(ct); - return Results.Ok(results); + var jsonResults = new List(); + results.MapTo(jsonResults); + return Results.Ok(jsonResults); }); - group.MapPost("/", async (IRepository repository, CancellationToken ct, History history) => + group.MapPost("/", async (IRepository repository, CancellationToken ct, HistoryJson historyJson) => { - var results = await repository.GetByIdAsync(history._id, ct); + var results = await repository.GetByIdAsync(historyJson._id, ct); if (results == null) - await repository.AddAsync(history, ct); + { + results = new History(); + results.MapFrom(historyJson); + await repository.AddAsync(results, ct); + } else { - results.Update(history); + results.MapFrom(historyJson); await repository.UpdateAsync(results, ct); } return Results.Ok(); diff --git a/FreeTubeSync/EndPoints/PlaylistEndpoint.cs b/FreeTubeSync/EndPoints/PlaylistEndpoint.cs index 383d8da..293792a 100644 --- a/FreeTubeSync/EndPoints/PlaylistEndpoint.cs +++ b/FreeTubeSync/EndPoints/PlaylistEndpoint.cs @@ -1,4 +1,6 @@ -using FreeTubeSync.Model; +using FreeTubeSync.Database; +using FreeTubeSync.Model.Database; +using FreeTubeSync.Model.Json; namespace FreeTubeSync.EndPoints; @@ -10,18 +12,53 @@ public static class PlaylistEndpoint group.MapGet("/", async (IRepository repository, CancellationToken ct) => { - var results = await repository.GetAllAsync(ct); - return Results.Ok(results); + var results = (await repository.GetAllAsync(ct)).ToList(); + var jsonResults = new List(); + results.MapTo(jsonResults); + for (var i = 0; i < jsonResults.Count; i++) + results[i].videos.MapTo(jsonResults[i].videos); + + return Results.Ok(jsonResults); }); - group.MapPost("/", async (IRepository repository, CancellationToken ct, Playlist playlist) => + group.MapPost("/", async (IRepository repository, IRepository