diff --git a/Aberwyn/Aberwyn.csproj b/Aberwyn/Aberwyn.csproj index b681382..005d93a 100644 --- a/Aberwyn/Aberwyn.csproj +++ b/Aberwyn/Aberwyn.csproj @@ -9,7 +9,7 @@ Linux - + @@ -56,8 +56,21 @@ + + + + Always + + + Always + + + Always + + + diff --git a/Aberwyn/Areas/Identity/Pages/Account/Login.cshtml b/Aberwyn/Areas/Identity/Pages/Account/Login.cshtml index 64f7b27..61f2bf6 100644 --- a/Aberwyn/Areas/Identity/Pages/Account/Login.cshtml +++ b/Aberwyn/Areas/Identity/Pages/Account/Login.cshtml @@ -14,9 +14,9 @@ - - - + + + @@ -48,36 +48,6 @@ - - - Use another service to log in. - - @{ - if ((Model.ExternalLogins?.Count ?? 0) == 0) - { - - - There are no external authentication services configured. See this article - about setting up this ASP.NET application to support logging in via external services. - - - } - else - { - - - - @foreach (var provider in Model.ExternalLogins!) - { - @provider.DisplayName - } - - - - } - } - - @section Scripts { diff --git a/Aberwyn/Areas/Identity/Pages/Account/Login.cshtml.cs b/Aberwyn/Areas/Identity/Pages/Account/Login.cshtml.cs index bd5b726..7b28fcc 100644 --- a/Aberwyn/Areas/Identity/Pages/Account/Login.cshtml.cs +++ b/Aberwyn/Areas/Identity/Pages/Account/Login.cshtml.cs @@ -61,27 +61,14 @@ namespace Aberwyn.Areas.Identity.Pages.Account /// public class InputModel { - /// - /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used - /// directly from your code. This API may change or be removed in future releases. - /// [Required] - [EmailAddress] - public string Email { get; set; } + [Display(Name = "Användarnamn")] + public string UserName { get; set; } - /// - /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used - /// directly from your code. This API may change or be removed in future releases. - /// [Required] [DataType(DataType.Password)] public string Password { get; set; } - /// - /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used - /// directly from your code. This API may change or be removed in future releases. - /// - [Display(Name = "Remember me?")] public bool RememberMe { get; set; } } @@ -112,7 +99,7 @@ namespace Aberwyn.Areas.Identity.Pages.Account { // This doesn't count login failures towards account lockout // To enable password failures to trigger account lockout, set lockoutOnFailure: true - var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false); + var result = await _signInManager.PasswordSignInAsync(Input.UserName, Input.Password, Input.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { _logger.LogInformation("User logged in."); diff --git a/Aberwyn/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs b/Aberwyn/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs index e71286c..dd70d22 100644 --- a/Aberwyn/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs +++ b/Aberwyn/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs @@ -53,6 +53,11 @@ namespace Aberwyn.Areas.Identity.Pages.Account.Manage /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// + /// + [Required] + [Display(Name = "Användarnamn")] + public string UserName { get; set; } + [Required] [DataType(DataType.Password)] [Display(Name = "Current password")] diff --git a/Aberwyn/Controllers/AdminController.cs b/Aberwyn/Controllers/AdminController.cs index 0be2d3d..7599e0f 100644 --- a/Aberwyn/Controllers/AdminController.cs +++ b/Aberwyn/Controllers/AdminController.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Aberwyn.Models; using Aberwyn.Data; +using Microsoft.EntityFrameworkCore; namespace Aberwyn.Controllers { @@ -100,62 +101,225 @@ namespace Aberwyn.Controllers return RedirectToAction("Index"); } [HttpPost] -[Authorize(Roles = "Admin")] -public IActionResult ImportMealsFromProd() -{ - var prodService = MenuService.CreateWithConfig(_configuration, _env, useProdDb: true); - var devService = new MenuService(_context); // injicerad context anvĂ€nds - - var prodMeals = prodService.GetMealsDetailed(); - - foreach (var meal in prodMeals) - { - // Kopiera utan ID (för att undvika konflikt) och spara - var newMeal = new Meal + [Authorize(Roles = "Admin")] + public IActionResult ImportMealsFromProd() { - Name = meal.Name, - Description = meal.Description, - ProteinType = meal.ProteinType, - Category = meal.Category, - CarbType = meal.CarbType, - RecipeUrl = meal.RecipeUrl, - ImageUrl = meal.ImageUrl, - IsAvailable = meal.IsAvailable, - CreatedAt = meal.CreatedAt, - Instructions = meal.Instructions, - ImageData = meal.ImageData, - ImageMimeType = meal.ImageMimeType, - Ingredients = meal.Ingredients.Select(i => new Ingredient + var prodService = MenuService.CreateWithConfig(_configuration, _env, useProdDb: true); + var devService = new MenuService(_context); // injicerad context anvĂ€nds + + var prodMeals = prodService.GetMealsDetailed(); + + foreach (var meal in prodMeals) { - Quantity = i.Quantity, - Item = i.Item - }).ToList() - }; + // Kopiera utan ID (för att undvika konflikt) och spara + var newMeal = new Meal + { + Name = meal.Name, + Description = meal.Description, + ProteinType = meal.ProteinType, + Category = meal.Category, + CarbType = meal.CarbType, + RecipeUrl = meal.RecipeUrl, + ImageUrl = meal.ImageUrl, + IsAvailable = meal.IsAvailable, + CreatedAt = meal.CreatedAt, + Instructions = meal.Instructions, + ImageData = meal.ImageData, + ImageMimeType = meal.ImageMimeType, + Ingredients = meal.Ingredients.Select(i => new Ingredient + { + Quantity = i.Quantity, + Item = i.Item + }).ToList() + }; - devService.SaveOrUpdateMealWithIngredients(newMeal); - } + devService.SaveOrUpdateMealWithIngredients(newMeal); + } - return Content("Import klar!"); -} -[HttpPost] -[Authorize(Roles = "Admin")] -public IActionResult ImportMenusFromProd() -{ - var prodService = MenuService.CreateWithConfig(_configuration, _env, useProdDb: true); - var devService = new MenuService(_context); + return Content("Import klar!"); + } - var allProdMenus = prodService.GetAllWeeklyMenus(); - var allMeals = devService.GetMeals(); + [HttpPost] + [Authorize(Roles = "Admin")] + public IActionResult ImportMenusFromProd() + { + var prodService = MenuService.CreateWithConfig(_configuration, _env, useProdDb: true); + var devService = new MenuService(_context); + var allProdMenus = prodService.GetAllWeeklyMenus(); + var allMeals = devService.GetMeals(); + + foreach (var menu in allProdMenus) + { + var newMenu = new WeeklyMenu + { + DayOfWeek = menu.DayOfWeek, + WeekNumber = menu.WeekNumber, + Year = menu.Year, + Cook = menu.Cook, + BreakfastMealId = null, + LunchMealId = null, + DinnerMealId = null + }; + + if (!string.IsNullOrEmpty(menu.BreakfastMealName)) + newMenu.BreakfastMealId = allMeals.FirstOrDefault(m => m.Name == menu.BreakfastMealName)?.Id; + + if (!string.IsNullOrEmpty(menu.LunchMealName)) + newMenu.LunchMealId = allMeals.FirstOrDefault(m => m.Name == menu.LunchMealName)?.Id; + + if (!string.IsNullOrEmpty(menu.DinnerMealName)) + newMenu.DinnerMealId = allMeals.FirstOrDefault(m => m.Name == menu.DinnerMealName)?.Id; + + _context.WeeklyMenus.Add(newMenu); + } + + _context.SaveChanges(); + TempData["Message"] = "Import av veckomenyer klar."; + return RedirectToAction("Index"); + } + + [HttpPost] + [Authorize(Roles = "Admin")] + public IActionResult ImportBudgetFromProd() + { + // HĂ€mta connection till produktion + using var prodContext = ApplicationDbContextFactory.CreateWithConfig(_configuration, _env, useProdDb: true); + + // Importera definitioner först + var prodCategoryDefs = prodContext.BudgetCategoryDefinitions.ToList(); + var prodItemDefs = prodContext.BudgetItemDefinitions.ToList(); + + foreach (var def in prodCategoryDefs) + { + if (!_context.BudgetCategoryDefinitions.Any(d => d.Name == def.Name)) + { + _context.BudgetCategoryDefinitions.Add(new BudgetCategoryDefinition + { + Name = def.Name, + Color = def.Color ?? "#cccccc" + }); + + } + } + + foreach (var def in prodItemDefs) + { + if (!_context.BudgetItemDefinitions.Any(d => d.Name == def.Name)) + { + _context.BudgetItemDefinitions.Add(new BudgetItemDefinition { Name = def.Name }); + } + } + + _context.SaveChanges(); // Se till att ID:n finns för FK:n nedan + + // Ladda definitioner i minnet för snabb lookup + var devCategoryDefs = _context.BudgetCategoryDefinitions.ToList(); + var devItemDefs = _context.BudgetItemDefinitions.ToList(); + + // Importera budgetperioder med kategorier och items + var prodPeriods = prodContext.BudgetPeriods + .Include(p => p.Categories) + .ThenInclude(c => c.Items) + .ToList(); + + foreach (var period in prodPeriods) + { + var exists = _context.BudgetPeriods + .Any(p => p.Year == period.Year && p.Month == period.Month); + + if (exists) + continue; + + var newPeriod = new BudgetPeriod + { + Year = period.Year, + Month = period.Month, + Categories = period.Categories.Select(c => new BudgetCategory + { + Name = c.Name, + Color = string.IsNullOrWhiteSpace(c.Color) ? "#cccccc" : c.Color, + Order = c.Order, + BudgetCategoryDefinitionId = devCategoryDefs + .FirstOrDefault(d => d.Name == c.Definition?.Name)?.Id, + Items = c.Items.Select(i => new BudgetItem + { + Name = i.Name, + Amount = i.Amount, + IsExpense = i.IsExpense, + IncludeInSummary = i.IncludeInSummary, + Order = i.Order, + BudgetItemDefinitionId = devItemDefs + .FirstOrDefault(d => d.Name == i.BudgetItemDefinition?.Name)?.Id + }).ToList() + }).ToList() + }; + + _context.BudgetPeriods.Add(newPeriod); + } + + _context.SaveChanges(); + TempData["Message"] = "â Import av budgetdata frĂ„n produktion Ă€r klar."; return RedirectToAction("Index"); } - } - public class AdminUserViewModel - { - public string UserId { get; set; } - public string Email { get; set; } - public List Roles { get; set; } + //Todo + + [HttpGet] + public IActionResult Todo() + { + return View(); + } + + + [HttpGet] + public IActionResult GetTodoTasks() + { + var tasks = _context.TodoTasks + .OrderByDescending(t => t.CreatedAt) + .ToList(); + return Json(tasks); + } + + [HttpPost] + public IActionResult AddTodoTask([FromBody] TodoTask task) + { + if (string.IsNullOrWhiteSpace(task?.Title)) + return BadRequest("Titel krĂ€vs"); + + task.CreatedAt = DateTime.UtcNow; + _context.TodoTasks.Add(task); + _context.SaveChanges(); + + return Json(task); + } + + [HttpPost] + public IActionResult UpdateTodoTask([FromBody] TodoTask task) + { + var existing = _context.TodoTasks.FirstOrDefault(t => t.Id == task.Id); + if (existing == null) + return NotFound(); + + existing.Title = task.Title; + existing.Status = task.Status; + existing.Priority = task.Priority; + + _context.SaveChanges(); + + return Ok(); + } + + + + } + + public class AdminUserViewModel + { + public string UserId { get; set; } + public string Email { get; set; } + public List Roles { get; set; } + } } diff --git a/Aberwyn/Controllers/FoodMenuController.cs b/Aberwyn/Controllers/FoodMenuController.cs index f0143d2..e76b821 100644 --- a/Aberwyn/Controllers/FoodMenuController.cs +++ b/Aberwyn/Controllers/FoodMenuController.cs @@ -202,7 +202,7 @@ namespace Aberwyn.Controllers .GetMenuEntriesByDateRange(DateTime.Now.AddDays(-28), DateTime.Now) .Select(x => new WeeklyMenuViewModel.RecentMenuEntry { - Date = x.Date, + Date = x.CreatedAt, BreakfastMealName = x.BreakfastMealName, LunchMealName = x.LunchMealName, DinnerMealName = x.DinnerMealName diff --git a/Aberwyn/Data/ApplicationDbContext.cs b/Aberwyn/Data/ApplicationDbContext.cs index 27c6bee..e5ece4e 100644 --- a/Aberwyn/Data/ApplicationDbContext.cs +++ b/Aberwyn/Data/ApplicationDbContext.cs @@ -25,9 +25,12 @@ namespace Aberwyn.Data public DbSet PushSubscribers { get; set; } public DbSet PizzaOrders { get; set; } public DbSet AppSettings { get; set; } + public DbSet TodoTasks { get; set; } public DbSet BudgetItemDefinitions { get; set; } public DbSet BudgetCategoryDefinitions { get; set; } - + public DbSet Meals { get; set; } + public DbSet WeeklyMenus { get; set; } + public DbSet Ingredients { get; set; } } } diff --git a/Aberwyn/Data/ApplicationDbContextFactory.cs b/Aberwyn/Data/ApplicationDbContextFactory.cs index 5baf6c4..5916799 100644 --- a/Aberwyn/Data/ApplicationDbContextFactory.cs +++ b/Aberwyn/Data/ApplicationDbContextFactory.cs @@ -13,13 +13,14 @@ namespace Aberwyn.Data var basePath = Directory.GetCurrentDirectory(); var config = new ConfigurationBuilder() .SetBasePath(basePath) - .AddJsonFile("appsettings.json") + .AddJsonFile("appsettings.json", optional: false) + .AddJsonFile("appsettings.Development.json", optional: true) + .AddEnvironmentVariables() .Build(); - var connectionString = config.GetConnectionString("DefaultConnection"); - File.WriteAllText("connection-log.txt", $"Connection string: {connectionString}"); + File.WriteAllText("connection-log.txt", $"Connection string: {connectionString}"); Console.WriteLine($"AnslutningsstrĂ€ng: {connectionString}"); if (string.IsNullOrEmpty(connectionString)) @@ -34,5 +35,22 @@ namespace Aberwyn.Data return new ApplicationDbContext(optionsBuilder.Options); } + public static ApplicationDbContext CreateWithConfig(IConfiguration config, IHostEnvironment env, bool useProdDb = false) + { + var connectionString = useProdDb + ? config.GetConnectionString("ProdConnection") // <--- FIX HĂR + : config.GetConnectionString("DefaultConnection"); + + if (string.IsNullOrWhiteSpace(connectionString)) + throw new InvalidOperationException("Connection string saknas."); + + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 36))); + + return new ApplicationDbContext(optionsBuilder.Options); + } + + + } } diff --git a/Aberwyn/Data/IdentityDataInitializer.cs b/Aberwyn/Data/IdentityDataInitializer.cs index bfda97d..35be21e 100644 --- a/Aberwyn/Data/IdentityDataInitializer.cs +++ b/Aberwyn/Data/IdentityDataInitializer.cs @@ -11,7 +11,7 @@ namespace Aberwyn.Data var userManager = serviceProvider.GetRequiredService>(); var roleManager = serviceProvider.GetRequiredService>(); - string[] roles = { "Admin" }; + string[] roles = { "Admin", "Chef", "Budget" }; foreach (var role in roles) { @@ -19,14 +19,15 @@ namespace Aberwyn.Data await roleManager.CreateAsync(new IdentityRole(role)); } - string adminEmail = "tai@zcz.se"; + string adminUsername = "admin"; + string adminEmail = "admin@localhost"; string password = "Admin123!"; if (await userManager.FindByEmailAsync(adminEmail) == null) { var user = new ApplicationUser { - UserName = adminEmail, + UserName = adminUsername, Email = adminEmail, EmailConfirmed = true }; diff --git a/Aberwyn/Data/MenuService.cs b/Aberwyn/Data/MenuService.cs index 7b7edde..405dc2b 100644 --- a/Aberwyn/Data/MenuService.cs +++ b/Aberwyn/Data/MenuService.cs @@ -159,11 +159,31 @@ public List GetAllWeeklyMenus() } public List GetWeeklyMenu(int weekNumber, int year) { - return _context.WeeklyMenus + var menus = _context.WeeklyMenus .Where(m => m.WeekNumber == weekNumber && m.Year == year) .ToList(); + + var allMeals = _context.Meals.ToDictionary(m => m.Id, m => m.Name); + + foreach (var wm in menus) + { + wm.BreakfastMealName = wm.BreakfastMealId.HasValue && allMeals.TryGetValue(wm.BreakfastMealId.Value, out var breakfast) + ? breakfast + : null; + + wm.LunchMealName = wm.LunchMealId.HasValue && allMeals.TryGetValue(wm.LunchMealId.Value, out var lunch) + ? lunch + : null; + + wm.DinnerMealName = wm.DinnerMealId.HasValue && allMeals.TryGetValue(wm.DinnerMealId.Value, out var dinner) + ? dinner + : null; + } + + return menus; } + public List GetMenuEntriesByDateRange(DateTime startDate, DateTime endDate) { var results = new List(); @@ -186,7 +206,7 @@ public List GetAllWeeklyMenus() var date = ISOWeek.ToDateTime(menu.Year, menu.WeekNumber, dow); if (date.Date >= startDate.Date && date.Date <= endDate.Date) { - menu.Date = date; + menu.CreatedAt = date; results.Add(menu); } } diff --git a/Aberwyn/Dockerfile b/Aberwyn/Dockerfile index 59f5135..142b95b 100644 --- a/Aberwyn/Dockerfile +++ b/Aberwyn/Dockerfile @@ -1,16 +1,23 @@ -#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. - FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base + +RUN apt-get update && \ + apt-get install -y locales && \ + locale-gen sv_SE.UTF-8 + +ENV LANG=sv_SE.UTF-8 +ENV LANGUAGE=sv_SE:sv +ENV LC_ALL=sv_SE.UTF-8 +ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false + WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src -COPY ["Aberwyn/Aberwyn.csproj", "Aberwyn/"] -RUN dotnet restore "Aberwyn/Aberwyn.csproj" +COPY ["Aberwyn.csproj", "."] +RUN dotnet restore "Aberwyn.csproj" COPY . . -WORKDIR "/src/Aberwyn" RUN dotnet build "Aberwyn.csproj" -c Release -o /app/build FROM build AS publish @@ -20,21 +27,3 @@ FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Aberwyn.dll"] - -version: '3.8' -services: - db: - image: mysql:8 - container_name: dev-mysql - ports: - - "3306:3306" - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: aberwyn - MYSQL_USER: aberwyn - MYSQL_PASSWORD: devpass - volumes: - - mysql-data:/var/lib/mysql - -volumes: - mysql-data: diff --git a/Aberwyn/Infrastructure/docker-compose.dev.yml b/Aberwyn/Infrastructure/docker-compose.dev.yml new file mode 100644 index 0000000..fcf3e6d --- /dev/null +++ b/Aberwyn/Infrastructure/docker-compose.dev.yml @@ -0,0 +1,38 @@ +version: '3.8' + +services: + aberwyn-app: + image: aberwyn:latest + build: + context: ../ + dockerfile: Dockerfile + ports: + - "5000:80" + environment: + ASPNETCORE_ENVIRONMENT: Development + DB_NAME: aberwyn_dev + + depends_on: + - mysql + networks: + - aberwyn-net + + mysql: + image: mysql:8 + container_name: aberwyn-mysql-dev + restart: always + environment: + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_DATABASE: aberwyn_dev + MYSQL_USER: aberwyn + MYSQL_PASSWORD: 3edc4RFV + volumes: + - mysql-dev-data:/var/lib/mysql + networks: + - aberwyn-net + +volumes: + mysql-dev-data: + +networks: + aberwyn-net: diff --git a/Aberwyn/Infrastructure/docker-compose.prod.yml b/Aberwyn/Infrastructure/docker-compose.prod.yml new file mode 100644 index 0000000..d9acc43 --- /dev/null +++ b/Aberwyn/Infrastructure/docker-compose.prod.yml @@ -0,0 +1,38 @@ +version: '3.8' + +services: + aberwyn-app: + image: aberwyn:latest + build: + context: ../ + dockerfile: Dockerfile + ports: + - "8080:80" + environment: + ASPNETCORE_ENVIRONMENT: Production + DB_NAME: aberwyn_prod + + depends_on: + - mysql + networks: + - aberwyn-net + + mysql: + image: mysql:8 + container_name: aberwyn-mysql-prod + restart: always + environment: + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_DATABASE: aberwyn_prod + MYSQL_USER: aberwyn + MYSQL_PASSWORD: 3edc4RFV + volumes: + - mysql-prod-data:/var/lib/mysql + networks: + - aberwyn-net + +volumes: + mysql-prod-data: + +networks: + aberwyn-net: diff --git a/Aberwyn/Infrastructure/docker-compose.yml b/Aberwyn/Infrastructure/docker-compose.yml deleted file mode 100644 index 54caf67..0000000 --- a/Aberwyn/Infrastructure/docker-compose.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: '3.8' -services: - dev-db: - image: mysql:8 - container_name: aberwyn-dev-db - ports: - - "3306:3306" - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: aberwyn - MYSQL_USER: aberwyn - MYSQL_PASSWORD: devpass - volumes: - - dev-mysql-data:/var/lib/mysql - -volumes: - dev-mysql-data: diff --git a/Aberwyn/Migrations/20250506132522_CreateIdentitySchema.Designer.cs b/Aberwyn/Migrations/20250506132522_CreateIdentitySchema.Designer.cs deleted file mode 100644 index 25f870f..0000000 --- a/Aberwyn/Migrations/20250506132522_CreateIdentitySchema.Designer.cs +++ /dev/null @@ -1,269 +0,0 @@ -ï»ż// -using System; -using Aberwyn.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace Aberwyn.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - [Migration("20250506132522_CreateIdentitySchema")] - partial class CreateIdentitySchema - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.36") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("Aberwyn.Models.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("varchar(255)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("longtext"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("tinyint(1)"); - - b.Property("LockoutEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("LockoutEnd") - .HasColumnType("datetime(6)"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("longtext"); - - b.Property("PhoneNumber") - .HasColumnType("longtext"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("tinyint(1)"); - - b.Property("SecurityStamp") - .HasColumnType("longtext"); - - b.Property("TwoFactorEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("varchar(255)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("longtext"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("ClaimType") - .HasColumnType("longtext"); - - b.Property("ClaimValue") - .HasColumnType("longtext"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("ClaimType") - .HasColumnType("longtext"); - - b.Property("ClaimValue") - .HasColumnType("longtext"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("varchar(255)"); - - b.Property("ProviderKey") - .HasColumnType("varchar(255)"); - - b.Property("ProviderDisplayName") - .HasColumnType("longtext"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("varchar(255)"); - - b.Property("RoleId") - .HasColumnType("varchar(255)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("varchar(255)"); - - b.Property("LoginProvider") - .HasColumnType("varchar(255)"); - - b.Property("Name") - .HasColumnType("varchar(255)"); - - b.Property("Value") - .HasColumnType("longtext"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Aberwyn/Migrations/20250506132522_CreateIdentitySchema.cs b/Aberwyn/Migrations/20250506132522_CreateIdentitySchema.cs deleted file mode 100644 index a5e2d59..0000000 --- a/Aberwyn/Migrations/20250506132522_CreateIdentitySchema.cs +++ /dev/null @@ -1,259 +0,0 @@ -ï»żusing System; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Aberwyn.Migrations -{ - public partial class CreateIdentitySchema : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterDatabase() - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Name = table.Column(type: "varchar(256)", maxLength: 256, nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - NormalizedName = table.Column(type: "varchar(256)", maxLength: 256, nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - ConcurrencyStamp = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - UserName = table.Column(type: "varchar(256)", maxLength: 256, nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - NormalizedUserName = table.Column(type: "varchar(256)", maxLength: 256, nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - Email = table.Column(type: "varchar(256)", maxLength: 256, nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - NormalizedEmail = table.Column(type: "varchar(256)", maxLength: 256, nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - EmailConfirmed = table.Column(type: "tinyint(1)", nullable: false), - PasswordHash = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - SecurityStamp = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - ConcurrencyStamp = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - PhoneNumber = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - PhoneNumberConfirmed = table.Column(type: "tinyint(1)", nullable: false), - TwoFactorEnabled = table.Column(type: "tinyint(1)", nullable: false), - LockoutEnd = table.Column(type: "datetime(6)", nullable: true), - LockoutEnabled = table.Column(type: "tinyint(1)", nullable: false), - AccessFailedCount = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - RoleId = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - ClaimType = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - ClaimValue = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - UserId = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - ClaimType = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - ClaimValue = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - ProviderKey = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - ProviderDisplayName = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - UserId = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - RoleId = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - LoginProvider = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Name = table.Column(type: "varchar(255)", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Value = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/Aberwyn/Migrations/20250515202922_CreateBudgetSchema.Designer.cs b/Aberwyn/Migrations/20250515202922_CreateBudgetSchema.Designer.cs deleted file mode 100644 index dea295a..0000000 --- a/Aberwyn/Migrations/20250515202922_CreateBudgetSchema.Designer.cs +++ /dev/null @@ -1,375 +0,0 @@ -ï»ż// -using System; -using Aberwyn.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace Aberwyn.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - [Migration("20250515202922_CreateBudgetSchema")] - partial class CreateBudgetSchema - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.36") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("Aberwyn.Models.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("varchar(255)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("longtext"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("tinyint(1)"); - - b.Property("LockoutEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("LockoutEnd") - .HasColumnType("datetime(6)"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("longtext"); - - b.Property("PhoneNumber") - .HasColumnType("longtext"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("tinyint(1)"); - - b.Property("SecurityStamp") - .HasColumnType("longtext"); - - b.Property("TwoFactorEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("BudgetPeriodId") - .HasColumnType("int"); - - b.Property("Color") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("BudgetPeriodId"); - - b.ToTable("BudgetCategories"); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Amount") - .HasColumnType("decimal(65,30)"); - - b.Property("BudgetCategoryId") - .HasColumnType("int"); - - b.Property("IncludeInSummary") - .HasColumnType("tinyint(1)"); - - b.Property("IsExpense") - .HasColumnType("tinyint(1)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Person") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("BudgetCategoryId"); - - b.ToTable("BudgetItems"); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetPeriod", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Month") - .HasColumnType("int"); - - b.Property("Year") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("BudgetPeriods"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("varchar(255)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("longtext"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("ClaimType") - .HasColumnType("longtext"); - - b.Property("ClaimValue") - .HasColumnType("longtext"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("ClaimType") - .HasColumnType("longtext"); - - b.Property("ClaimValue") - .HasColumnType("longtext"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("varchar(255)"); - - b.Property("ProviderKey") - .HasColumnType("varchar(255)"); - - b.Property("ProviderDisplayName") - .HasColumnType("longtext"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("varchar(255)"); - - b.Property("RoleId") - .HasColumnType("varchar(255)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("varchar(255)"); - - b.Property("LoginProvider") - .HasColumnType("varchar(255)"); - - b.Property("Name") - .HasColumnType("varchar(255)"); - - b.Property("Value") - .HasColumnType("longtext"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetCategory", b => - { - b.HasOne("Aberwyn.Models.BudgetPeriod", "BudgetPeriod") - .WithMany("Categories") - .HasForeignKey("BudgetPeriodId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("BudgetPeriod"); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetItem", b => - { - b.HasOne("Aberwyn.Models.BudgetCategory", "BudgetCategory") - .WithMany("Items") - .HasForeignKey("BudgetCategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("BudgetCategory"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetPeriod", b => - { - b.Navigation("Categories"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Aberwyn/Migrations/20250515202922_CreateBudgetSchema.cs b/Aberwyn/Migrations/20250515202922_CreateBudgetSchema.cs deleted file mode 100644 index 961cca1..0000000 --- a/Aberwyn/Migrations/20250515202922_CreateBudgetSchema.cs +++ /dev/null @@ -1,101 +0,0 @@ -ï»żusing Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Aberwyn.Migrations -{ - public partial class CreateBudgetSchema : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "BudgetPeriods", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Year = table.Column(type: "int", nullable: false), - Month = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_BudgetPeriods", x => x.Id); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "BudgetCategories", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Color = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - BudgetPeriodId = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_BudgetCategories", x => x.Id); - table.ForeignKey( - name: "FK_BudgetCategories_BudgetPeriods_BudgetPeriodId", - column: x => x.BudgetPeriodId, - principalTable: "BudgetPeriods", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "BudgetItems", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Person = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Amount = table.Column(type: "decimal(65,30)", nullable: false), - IsExpense = table.Column(type: "tinyint(1)", nullable: false), - IncludeInSummary = table.Column(type: "tinyint(1)", nullable: false), - BudgetCategoryId = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_BudgetItems", x => x.Id); - table.ForeignKey( - name: "FK_BudgetItems_BudgetCategories_BudgetCategoryId", - column: x => x.BudgetCategoryId, - principalTable: "BudgetCategories", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateIndex( - name: "IX_BudgetCategories_BudgetPeriodId", - table: "BudgetCategories", - column: "BudgetPeriodId"); - - migrationBuilder.CreateIndex( - name: "IX_BudgetItems_BudgetCategoryId", - table: "BudgetItems", - column: "BudgetCategoryId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "BudgetItems"); - - migrationBuilder.DropTable( - name: "BudgetCategories"); - - migrationBuilder.DropTable( - name: "BudgetPeriods"); - } - } -} diff --git a/Aberwyn/Migrations/20250515204407_MakePersonNullable.Designer.cs b/Aberwyn/Migrations/20250515204407_MakePersonNullable.Designer.cs deleted file mode 100644 index 388a551..0000000 --- a/Aberwyn/Migrations/20250515204407_MakePersonNullable.Designer.cs +++ /dev/null @@ -1,374 +0,0 @@ -ï»ż// -using System; -using Aberwyn.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace Aberwyn.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - [Migration("20250515204407_MakePersonNullable")] - partial class MakePersonNullable - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.36") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("Aberwyn.Models.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("varchar(255)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("longtext"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("tinyint(1)"); - - b.Property("LockoutEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("LockoutEnd") - .HasColumnType("datetime(6)"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("longtext"); - - b.Property("PhoneNumber") - .HasColumnType("longtext"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("tinyint(1)"); - - b.Property("SecurityStamp") - .HasColumnType("longtext"); - - b.Property("TwoFactorEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("BudgetPeriodId") - .HasColumnType("int"); - - b.Property("Color") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("BudgetPeriodId"); - - b.ToTable("BudgetCategories"); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Amount") - .HasColumnType("decimal(65,30)"); - - b.Property("BudgetCategoryId") - .HasColumnType("int"); - - b.Property("IncludeInSummary") - .HasColumnType("tinyint(1)"); - - b.Property("IsExpense") - .HasColumnType("tinyint(1)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Person") - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("BudgetCategoryId"); - - b.ToTable("BudgetItems"); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetPeriod", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Month") - .HasColumnType("int"); - - b.Property("Year") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("BudgetPeriods"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("varchar(255)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("longtext"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("ClaimType") - .HasColumnType("longtext"); - - b.Property("ClaimValue") - .HasColumnType("longtext"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("ClaimType") - .HasColumnType("longtext"); - - b.Property("ClaimValue") - .HasColumnType("longtext"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("varchar(255)"); - - b.Property("ProviderKey") - .HasColumnType("varchar(255)"); - - b.Property("ProviderDisplayName") - .HasColumnType("longtext"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("varchar(255)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("varchar(255)"); - - b.Property("RoleId") - .HasColumnType("varchar(255)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("varchar(255)"); - - b.Property("LoginProvider") - .HasColumnType("varchar(255)"); - - b.Property("Name") - .HasColumnType("varchar(255)"); - - b.Property("Value") - .HasColumnType("longtext"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetCategory", b => - { - b.HasOne("Aberwyn.Models.BudgetPeriod", "BudgetPeriod") - .WithMany("Categories") - .HasForeignKey("BudgetPeriodId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("BudgetPeriod"); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetItem", b => - { - b.HasOne("Aberwyn.Models.BudgetCategory", "BudgetCategory") - .WithMany("Items") - .HasForeignKey("BudgetCategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("BudgetCategory"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Aberwyn.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetCategory", b => - { - b.Navigation("Items"); - }); - - modelBuilder.Entity("Aberwyn.Models.BudgetPeriod", b => - { - b.Navigation("Categories"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Aberwyn/Migrations/20250515204407_MakePersonNullable.cs b/Aberwyn/Migrations/20250515204407_MakePersonNullable.cs deleted file mode 100644 index edab9b1..0000000 --- a/Aberwyn/Migrations/20250515204407_MakePersonNullable.cs +++ /dev/null @@ -1,43 +0,0 @@ -ï»żusing Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Aberwyn.Migrations -{ - public partial class MakePersonNullable : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Person", - table: "BudgetItems", - type: "longtext", - nullable: true, - oldClrType: typeof(string), - oldType: "longtext") - .Annotation("MySql:CharSet", "utf8mb4") - .OldAnnotation("MySql:CharSet", "utf8mb4"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.UpdateData( - table: "BudgetItems", - keyColumn: "Person", - keyValue: null, - column: "Person", - value: ""); - - migrationBuilder.AlterColumn( - name: "Person", - table: "BudgetItems", - type: "longtext", - nullable: false, - oldClrType: typeof(string), - oldType: "longtext", - oldNullable: true) - .Annotation("MySql:CharSet", "utf8mb4") - .OldAnnotation("MySql:CharSet", "utf8mb4"); - } - } -} diff --git a/Aberwyn/Migrations/20250519213736_AddOrderToBudgetCategory.Designer.cs b/Aberwyn/Migrations/20250519213736_AddOrderToBudgetCategory.Designer.cs deleted file mode 100644 index 63e2e0d..0000000 --- a/Aberwyn/Migrations/20250519213736_AddOrderToBudgetCategory.Designer.cs +++ /dev/null @@ -1,380 +0,0 @@ -ï»ż// -using System; -using Aberwyn.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace Aberwyn.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - [Migration("20250519213736_AddOrderToBudgetCategory")] - partial class AddOrderToBudgetCategory - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.36") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("Aberwyn.Models.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("varchar(255)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("longtext"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("tinyint(1)"); - - b.Property("LockoutEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("LockoutEnd") - .HasColumnType("datetime(6)"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("varchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("longtext"); - - b.Property("PhoneNumber") - .HasColumnType("longtext"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("tinyint(1)"); - - b.Property
- There are no external authentication services configured. See this article - about setting up this ASP.NET application to support logging in via external services. -
- @foreach (var provider in Model.ExternalLogins!) - { - @provider.DisplayName - } -