using HopFrame.Core.Services; using HopFrame.Testing; using Microsoft.FluentUI.AspNetCore.Components; using HopFrame.Testing.Components; using HopFrame.Testing.Models; using HopFrame.Web; using HopFrame.Web.AuditLogging; using Microsoft.EntityFrameworkCore; using Message = HopFrame.Testing.Models.Message; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); builder.Services.AddFluentUIComponents(); builder.Services.AddDbContext(options => { options.UseInMemoryDatabase("testing"); }); builder.Services.AddHopFrame(options => { options.DisplayUserInfo(false); options.AddDbContext(context => { context.Table(table => { table.Property(u => u.Password) .DisplayValue(false); table.Property(u => u.FirstName) .List(false); table.Property(u => u.LastName) .List(false); table.Property(u => u.Id) .IsSortable(false) .SetOrderIndex(3); table.AddVirtualProperty("Name", (user, _) => $"{user.FirstName} {user.LastName}") /*.SetVirtualParser((model, input, _) => { var split = input.Split(' '); model.FirstName = split.FirstOrDefault(); model.LastName = split.LastOrDefault(); })*/ .SetOrderIndex(2); table.SetDisplayName("Benutzer"); table.SetDescription("This table is used for user data store and user authentication"); table.SetViewPolicy("policy"); table.Property(u => u.Posts) .FormatEach((post, _) => post.Caption); }); context.Table() .ShowSearchSuggestions(false); context.Table() .Property(p => p.Author) //.Format((user, _) => $"{user.FirstName} {user.LastName}") .SetDisplayedProperty(u => u.Username) .SetValidator((_, _) => []); context.Table() .Property(p => p.Id) .SetDisplayName("ID"); context.Table() .Property(p => p.CreatedAt); context.Table() .Property(p => p.Content) .SetDisplayLength(100) .IsTextArea(true) /*.Validator(input => { var errors = new List(); if (input is null) errors.Add("Value cannot be null"); if (input?.Length > 10) errors.Add("Value can only be 10 characters long"); return errors; })*/; /*context.Table() .SetOrderIndex(-1) .Ignore(true);*/ }); options.AddCustomView("Counter", "/counter") .SetDescription("A custom view") .SetPolicy("counter.view"); options.AddExporters(); options.AddCustomRepository(g => g.Id, table => { table.SetDisplayName("Guests"); table.Property(g => g.Messages) .ForceRelation(true) .FormatEach((m, _) => m.Content); }); options.AddCustomRepository(m => m.MessageIdentifier, table => { table.SetDisplayName("Messages"); table.Property(m => m.Receiver) .ForceRelation() .Format((u, _) => u.Name); table.Property(m => m.Sender) .ForceRelation() .Format((u, _) => u.Username ?? string.Empty); }); options.AddAuditLogging(builder.Services, contextBuilder => { contextBuilder.UseInMemoryDatabase("audit-logging"); }); }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddScoped(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error", createScopeForErrors: true); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseAntiforgery(); app.MapStaticAssets(); app.MapRazorComponents() .AddInteractiveServerRenderMode() .AddHopFramePages(); app.Run();