diff --git a/src/PostIt.Tests/BlogApiTestFakes.cs b/src/PostIt.Tests/BlogApiTestFakes.cs index 9ec10f89..755ce105 100644 --- a/src/PostIt.Tests/BlogApiTestFakes.cs +++ b/src/PostIt.Tests/BlogApiTestFakes.cs @@ -1,6 +1,7 @@ using PostIt.Models; using PostIt.Services; using PostIt.ViewModels; +using Yavsc.Models; namespace PostIt.Tests; diff --git a/src/PostIt/PostIt/App.axaml.cs b/src/PostIt/PostIt/App.axaml.cs index 1e0afeaf..b5740f2f 100644 --- a/src/PostIt/PostIt/App.axaml.cs +++ b/src/PostIt/PostIt/App.axaml.cs @@ -24,7 +24,7 @@ public partial class App : Application /// binding sink with a cross-thread exception inside /// DataValidationErrors.SetErrors. /// - public IServiceProvider? Services { get; private set; } + public IServiceProvider? ServiceProvider { get; private set; } private MainWindow window; public App() { @@ -91,19 +91,17 @@ public partial class App : Application services.AddSingleton(sessionStatus); services.AddTransient(); - var provider = services.BuildServiceProvider(); + ServiceProvider = services.BuildServiceProvider(); // Bind the canonical Settings to the static accessor so any // code path that can't easily take a constructor parameter // (designer surfaces, Avalonia data templates) still gets // the same instance the rest of the app is using. Idempotent: // re-binding from a second App boot (tests) is a no-op. - Settings.BindToServiceProvider(provider); - - Services = provider; + Settings.BindToServiceProvider(ServiceProvider); DataTemplates.Clear(); - DataTemplates.Add(new ViewLocator(provider)); + DataTemplates.Add(new ViewLocator(ServiceProvider)); // Wire the Settings singleton onto the SettingsPage singleton // once, at composition time. The page is registered as a @@ -113,7 +111,7 @@ public partial class App : Application // DataContext, and the TwoWay bindings inside the page keep // mutating the same in-memory Settings instance that the rest // of the app reads (OidcClientOptions construction, etc.). - provider.GetRequiredService().DataContext = settings; + ServiceProvider.GetRequiredService().DataContext = settings; // Settings.DarkMode was previously a dead field: it round- // tripped through the settings file and the SettingsPage @@ -134,8 +132,8 @@ public partial class App : Application if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - var homePage = provider.GetRequiredService(); - homePage.DataContext = provider.GetRequiredService(); + var homePage = ServiceProvider.GetRequiredService(); + homePage.DataContext = ServiceProvider.GetRequiredService(); window = new MainWindow(); window.SessionBanner.DataContext = sessionStatus; @@ -155,8 +153,8 @@ public partial class App : Application { var w = (MainWindow)((IClassicDesktopStyleApplicationLifetime)ApplicationLifetime!).MainWindow!; var nav = w.NavRoot; - var hp = provider.GetRequiredService(); - hp.DataContext = provider.GetRequiredService(); + var hp = ServiceProvider.GetRequiredService(); + hp.DataContext = ServiceProvider.GetRequiredService(); _ = nav.PopToRootAsync(); }; @@ -187,7 +185,7 @@ public partial class App : Application sessionStatus.OpenSettingsRequested += () => { var w = (MainWindow)((IClassicDesktopStyleApplicationLifetime)ApplicationLifetime!).MainWindow!; - var settingsPage = provider.GetRequiredService(); + var settingsPage = ServiceProvider.GetRequiredService(); var stack = w.NavRoot.NavigationStack; if (stack.Count > 0 && ReferenceEquals(stack[stack.Count - 1], settingsPage)) { @@ -196,13 +194,13 @@ public partial class App : Application _ = w.NavRoot.PushAsync(settingsPage); }; - window.Opened += async (_, _) => await BootAsync(provider, api); + window.Opened += async (_, _) => await BootAsync(ServiceProvider, api); } else if (ApplicationLifetime is ISingleViewApplicationLifetime singleView) { singleView.MainView = new MainWindow { - DataContext = provider.GetRequiredService() + DataContext = ServiceProvider.GetRequiredService() }; } } @@ -243,8 +241,8 @@ public partial class App : Application public static async Task PushMainPageAsync() { var app = (App)Current; - var mainVm = app.Services.GetRequiredService(); - var mainPage = app.Services.GetRequiredService(); + var mainVm = app.ServiceProvider.GetRequiredService(); + var mainPage = app.ServiceProvider.GetRequiredService(); mainPage.DataContext = mainVm; await app.window.FindControl("NavRoot").PushAsync(mainPage).ConfigureAwait(true); } diff --git a/src/PostIt/PostIt/Models/BlogPost.cs b/src/PostIt/PostIt/Models/BlogPost.cs index 7867eb02..e62fcea2 100644 --- a/src/PostIt/PostIt/Models/BlogPost.cs +++ b/src/PostIt/PostIt/Models/BlogPost.cs @@ -1,16 +1,37 @@ using System; +using Yavsc.Abstract.Identity; +using Yavsc.Abstract.Identity.Security; +using Yavsc.Blogspot; namespace PostIt.Models; -public class BlogPost +public class BlogPost : IBlogPost { - public long Id { get; set; } - public string Title { get; set; } = string.Empty; - public string? Article { get; set; } - public string? Photo { get; set; } - public string? AuthorId { get; set; } - public DateTime DateCreated { get; set; } - public string? UserCreated { get; set; } - public DateTime DateModified { get; set; } - public string? UserModified { get; set; } + public string AuthorId { get; set; } + + public IApplicationUser Author { get; set; } + + public string Article { get; set ; } + public string Photo { get; set ; } + public long Id { get; set ; } + public DateTime DateCreated { get; set ; } + public string UserCreated { get; set ; } + public DateTime DateModified { get; set ; } + public string UserModified { get; set ; } + public string Title { get; set ; } + + public bool AuthorizeCircle(long circleId) + { + throw new NotImplementedException(); + } + + public ICircleAuthorization[] GetACL() + { + throw new NotImplementedException(); + } + + public string[] GetTags() + { + throw new NotImplementedException(); + } } diff --git a/src/PostIt/PostIt/ViewModels/HomePageViewModel.cs b/src/PostIt/PostIt/ViewModels/HomePageViewModel.cs index c11e396a..876f862c 100644 --- a/src/PostIt/PostIt/ViewModels/HomePageViewModel.cs +++ b/src/PostIt/PostIt/ViewModels/HomePageViewModel.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; using PostIt; using PostIt.Services; namespace PostIt.ViewModels; @@ -7,6 +8,7 @@ public class HomePageViewModel : ViewModelBase { public YavscApiClient Api { get; } public Settings Settings { get; } + public SessionStatusViewModel SessionStatus { get; } private string _welcomeText = "Welcome to PostIt!"; public string WelcomeText @@ -18,10 +20,12 @@ public class HomePageViewModel : ViewModelBase public override bool CanNavigateNext { get => true; protected set => throw new System.NotImplementedException(); } public override bool CanNavigatePrevious { get => false; protected set => throw new System.NotImplementedException(); } - public HomePageViewModel(YavscApiClient api, Settings settings) + public HomePageViewModel(YavscApiClient api, Settings settings, SessionStatusViewModel sessionStatus) { Api = api; Settings = settings; + SessionStatus = sessionStatus; + } public RelayCommand OpenBlogs { get; set; } = new RelayCommand(() => App.PushMainPageAsync()); /// @@ -33,5 +37,8 @@ public class HomePageViewModel : ViewModelBase /// (thread-safe dispatcher marshalling on PropertyChanged) — a /// designer-only duplicate instance is therefore harmless. /// - public HomePageViewModel() : this(null!, new Settings()) { } + public HomePageViewModel() : this(null!, new Settings(), new SessionStatusViewModel()) + { + + } } diff --git a/src/PostIt/PostIt/Views/MainPage.axaml.cs b/src/PostIt/PostIt/Views/MainPage.axaml.cs index 1535d2f4..6a907a01 100644 --- a/src/PostIt/PostIt/Views/MainPage.axaml.cs +++ b/src/PostIt/PostIt/Views/MainPage.axaml.cs @@ -28,7 +28,7 @@ public partial class MainPage : ContentPage // Resolve via the App's DI container so the page gets // the canonical services (Api client, settings, ...). var app = Application.Current as App; - var services = app?.Services; + var services = app?.ServiceProvider; if (services is null) return; var page = services.GetRequiredService(); diff --git a/src/Yavsc.Abstract/Blogspot/IBlog.cs b/src/Yavsc.Abstract/Blogspot/IBlog.cs deleted file mode 100644 index 86efc8e3..00000000 --- a/src/Yavsc.Abstract/Blogspot/IBlog.cs +++ /dev/null @@ -1,19 +0,0 @@ - - - -using Yavsc.Abstract.Identity; - -namespace Yavsc -{ - public interface IBlogPostPayLoad - { - string Article { get; set; } - string Photo { get; set; } - - } - public interface IBlogPost : IBlogPostPayLoad, ITrackedEntity, IIdentified, ITitle - { - string AuthorId { get; set; } - IApplicationUser Author { get; } - } -} diff --git a/src/Yavsc.Abstract/Blogspot/IBlogPost.cs b/src/Yavsc.Abstract/Blogspot/IBlogPost.cs new file mode 100644 index 00000000..691e03f2 --- /dev/null +++ b/src/Yavsc.Abstract/Blogspot/IBlogPost.cs @@ -0,0 +1,15 @@ + + + +using Yavsc.Abstract.Identity; +using Yavsc.Abstract.Identity.Security; +using Yavsc.Interfaces; + +namespace Yavsc.Blogspot +{ + public interface IBlogPost : IBlogPostPayLoad, ICircleAuthorized, ITaggable, ITrackedEntity, IIdentified, ITitle + { + string AuthorId { get; set; } + IApplicationUser Author { get; } + } +} diff --git a/src/Yavsc.Abstract/Blogspot/IBlogPostPayLoad.cs b/src/Yavsc.Abstract/Blogspot/IBlogPostPayLoad.cs new file mode 100644 index 00000000..d8aeb4fe --- /dev/null +++ b/src/Yavsc.Abstract/Blogspot/IBlogPostPayLoad.cs @@ -0,0 +1,9 @@ +namespace Yavsc.Blogspot +{ + public interface IBlogPostPayLoad + { + string Article { get; set; } + string Photo { get; set; } + + } +} diff --git a/src/Yavsc.Blogs/Controllers/BlogApiController.cs b/src/Yavsc.Blogs/Controllers/BlogApiController.cs index 69b37e60..23d71742 100644 --- a/src/Yavsc.Blogs/Controllers/BlogApiController.cs +++ b/src/Yavsc.Blogs/Controllers/BlogApiController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Yavsc.Blogspot; using Yavsc.Models.Blog; using Yavsc.Server.Exceptions; using Yavsc.Server.Helpers; diff --git a/src/Yavsc.Server/Models/Blog/BlogPost.cs b/src/Yavsc.Server/Models/Blog/BlogPost.cs index eb58cb62..e1b44603 100644 --- a/src/Yavsc.Server/Models/Blog/BlogPost.cs +++ b/src/Yavsc.Server/Models/Blog/BlogPost.cs @@ -3,15 +3,14 @@ using System.ComponentModel.DataAnnotations.Schema; using Newtonsoft.Json; using Yavsc.Abstract.Identity; using Yavsc.Abstract.Identity.Security; -using Yavsc.Interfaces; using Yavsc.Models.Access; using Yavsc.Models.Relationship; +using Yavsc.Blogspot; namespace Yavsc.Models.Blog { - - public class BlogPost : - IBlogPost, ICircleAuthorized, ITaggable + + public class BlogPost : IBlogPost { [Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Display(Name = "Identifiant du post")] diff --git a/src/Yavsc.Server/Services/BlogSpotService.cs b/src/Yavsc.Server/Services/BlogSpotService.cs index a8b52d0d..dc02cde2 100644 --- a/src/Yavsc.Server/Services/BlogSpotService.cs +++ b/src/Yavsc.Server/Services/BlogSpotService.cs @@ -10,6 +10,7 @@ using Yavsc.Server.Helpers; using Yavsc.Services; using Yavsc.ViewModels.Auth; using Microsoft.AspNetCore.Http; +using Yavsc.Blogspot; public class BlogSpotService {