From 5c90db4ccb032436669bef8ebe42bb4cdff13b99 Mon Sep 17 00:00:00 2001 From: JohanTran Date: Sun, 24 May 2026 20:11:49 +0200 Subject: [PATCH] feat(database):add database seeding --- backend/Program.cs | 6 ++ backend/SeedData.cs | 137 +++++++++++++++++++++++++++++++++++++++++ backend/backend.csproj | 1 + 3 files changed, 144 insertions(+) create mode 100644 backend/SeedData.cs diff --git a/backend/Program.cs b/backend/Program.cs index 4ffc08c..d0a8039 100644 --- a/backend/Program.cs +++ b/backend/Program.cs @@ -1,3 +1,4 @@ +using backend; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); @@ -8,6 +9,11 @@ var app = builder.Build(); +using (var scope = app.Services.CreateScope()) +{ + SeedData.Seed(scope.ServiceProvider); +} + app.MapGet("/", () => "Hello World!"); app.UseHttpsRedirection(); diff --git a/backend/SeedData.cs b/backend/SeedData.cs new file mode 100644 index 0000000..5269de4 --- /dev/null +++ b/backend/SeedData.cs @@ -0,0 +1,137 @@ +using Bogus; +using backend.types; +using Microsoft.EntityFrameworkCore; + +namespace backend +{ + public static class SeedData + { + public static async void Seed(IServiceProvider serviceProvider) + { + using var scope = serviceProvider.CreateScope(); + var context = scope.ServiceProvider.GetRequiredService(); + + if (context.Airplanes.Any()) return; + + await context.Database.MigrateAsync(); + + var fakeTech = new Faker() + .RuleFor(t => t.Name, f => f.Person.FirstName + " " + f.Person.LastName) + .RuleFor(t => t.Status, _ => PersonnelStatus.Inactive) + .RuleFor(t => t.Role, _ => UserRole.Technician); + + var fakeOperator = new Faker() + .RuleFor(o => o.Name, f => f.Person.FirstName + " " + f.Person.LastName) + .RuleFor(o => o.Status, _ => PersonnelStatus.Inactive) + .RuleFor(o => o.Role, _ => UserRole.Operator); + + var fakeSupervisor = new Faker() + .RuleFor(s => s.Name, f => f.Person.FirstName + " " + f.Person.LastName) + .RuleFor(s => s.Status, _ => PersonnelStatus.Inactive) + .RuleFor(s => s.Role, _ => UserRole.Supervisor); + + var fakeFuel = new Faker() + .RuleFor(f => f.Sku, f => $"FUEL-{f.Random.Int(0, 100000)}") + .RuleFor(f => f.Name, f => f.Commerce.ProductName()) + .RuleFor(f => f.Amount, f => f.Random.Int(100, 5000)) + .RuleFor(f => f.Type, _ => ResourceType.Fuel) + .RuleFor(f => f.Unit, _ => UnitType.L); + + var fakeAmmo = new Faker() + .RuleFor(a => a.Sku, f => $"AMMO-{f.Random.Int(0, 100000)}") + .RuleFor(a => a.Name, f => f.Commerce.ProductName()) + .RuleFor(a => a.Amount, f => f.Random.Int(100, 2000)) + .RuleFor(a => a.Type, _ => ResourceType.Ammunition) + .RuleFor(a => a.Unit, _ => UnitType.rounds); + + var fakeBattery = new Faker() + .RuleFor(b => b.Sku, f => $"BAT-{f.Random.Int(0, 100000)}") + .RuleFor(b => b.Name, f => f.Commerce.ProductName()) + .RuleFor(b => b.Amount, f => f.Random.Int(1, 10)) + .RuleFor(b => b.Type, _ => ResourceType.Battery) + .RuleFor(b => b.Unit, _ => UnitType.kWh); + + var fakeSite = new Faker(); + + var fakeOrder = new Faker() + .RuleFor(o => o.OrderTitle, f => $"Order #{f.Random.Int(0, 100000)}") + .RuleFor(o => o.Status, f => f.PickRandom()) + .RuleFor(o => o.Description, f => f.Lorem.Sentence()) + .RuleFor(t => t.Comments, f => f.Lorem.Sentence()) + .RuleFor(o => o.StartedAt, f => f.Date.Soon().ToUniversalTime()) + .RuleFor(o => o.CreatedAt, f => f.Date.Past().ToUniversalTime()) + .RuleFor(o => o.UpdatedAt, f => f.Date.Recent().ToUniversalTime()); + + var fakeTask = new Faker() + .RuleFor(t => t.Status, f => f.PickRandom()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()) + .RuleFor(t => t.Comments, f => f.Lorem.Sentence()) + .RuleFor(t => t.StartedAt, f => f.Date.Soon().ToUniversalTime()) + .RuleFor(t => t.CreatedAt, f => f.Date.Past().ToUniversalTime()) + .RuleFor(t => t.UpdatedAt, f => f.Date.Recent().ToUniversalTime()) + .RuleFor(t => t.Type, f => f.PickRandom()) + .RuleFor(t => t.Duration, f => f.Date.Timespan()) + .RuleFor(t => t.Deadline, f => f.Date.Future().ToUniversalTime()); + + var fakeAirplanes = new Faker() + .RuleFor(a => a.Ammunition, f => fakeAmmo.Generate(1)) + .RuleFor(a => a.Fuel, f => fakeFuel.Generate(1)) + .RuleFor(a => a.Battery, f => fakeBattery.Generate(1)); + + var fakeResource = new Faker() + .RuleFor(r => r.Amount, f => f.Random.Int(1, 10)) + .RuleFor(r => r.Buffer, f => new ResourceBuffer + { + MaxReqAmount = f.Random.Int(10, 50), + OptimalReqAmount = f.Random.Int(5, 30), + MinReqAmount = f.Random.Int(1, 15) + }); + + var airplanes = fakeAirplanes.Generate(4); + var orders = new List(); + var tasks = new List(); + var resourceRequirements = new List(); + var resources = new List(); + for (int i = 0; i < airplanes.Count; i++) + { + var order = fakeOrder.Generate(); + var task = fakeTask.Generate(); + var resource = fakeFuel.Generate(); + var resourceRequirement = fakeResource.Generate(); + + var airplane = airplanes[i]; + + task.MaintenanceOrder = order; + task.Airplane = airplane; + + resourceRequirement.Task = task; + resourceRequirement.Resource = resource; + + order.Tasks.Add(task); + + orders.Add(order); + tasks.Add(task); + + resources.Add(resource); + resourceRequirements.Add(resourceRequirement); + } + + var sites = fakeSite.Generate(5); + var operators = fakeOperator.Generate(2); + var supervisors = fakeSupervisor.Generate(2); + var techs = fakeTech.Generate(2); + + context.Sites.AddRange(sites); + context.Airplanes.AddRange(airplanes); + context.Orders.AddRange(orders); + context.Tasks.AddRange(tasks); + context.Resources.AddRange(resources); + context.ResourceRequirements.AddRange(resourceRequirements); + context.Personnel.AddRange(operators); + context.Personnel.AddRange(supervisors); + context.Personnel.AddRange(techs); + + await context.SaveChangesAsync(); + } + } +} \ No newline at end of file diff --git a/backend/backend.csproj b/backend/backend.csproj index 16bdeeb..51ef84b 100644 --- a/backend/backend.csproj +++ b/backend/backend.csproj @@ -8,6 +8,7 @@ + runtime; build; native; contentfiles; analyzers; buildtransitive