From 41e29dfdce9bd76d5b10964c0c0936247c6d28ca Mon Sep 17 00:00:00 2001 From: begzhanmaxamatxanov Date: Sun, 10 Nov 2024 15:11:52 +0500 Subject: [PATCH] Implement data initialization for entities --- .../ExpenseTracker.Infrastructure.csproj | 1 + .../Persistence/SeedData/DatabaseSeeder.cs | 170 ++++++++++++++++++ ExpenseTracker/ExpenseTracker/Program.cs | 2 + 3 files changed, 173 insertions(+) create mode 100644 ExpenseTracker/ExpenseTracker.Infrastructure/Persistence/SeedData/DatabaseSeeder.cs diff --git a/ExpenseTracker/ExpenseTracker.Infrastructure/ExpenseTracker.Infrastructure.csproj b/ExpenseTracker/ExpenseTracker.Infrastructure/ExpenseTracker.Infrastructure.csproj index 36393ec..a62b907 100644 --- a/ExpenseTracker/ExpenseTracker.Infrastructure/ExpenseTracker.Infrastructure.csproj +++ b/ExpenseTracker/ExpenseTracker.Infrastructure/ExpenseTracker.Infrastructure.csproj @@ -29,6 +29,7 @@ + diff --git a/ExpenseTracker/ExpenseTracker.Infrastructure/Persistence/SeedData/DatabaseSeeder.cs b/ExpenseTracker/ExpenseTracker.Infrastructure/Persistence/SeedData/DatabaseSeeder.cs new file mode 100644 index 0000000..2299cae --- /dev/null +++ b/ExpenseTracker/ExpenseTracker.Infrastructure/Persistence/SeedData/DatabaseSeeder.cs @@ -0,0 +1,170 @@ +using Bogus; +using ExpenseTracker.Domain.Entities; +using ExpenseTracker.Domain.Enums; + +namespace ExpenseTracker.Infrastructure.Persistence.SeedData +{ + public static class DatabaseSeeder + { + private readonly static Faker _faker = new(); + + public static void SeedAllData(ExpenseTrackerDbContext context) + { + try + { + SeedUsers(context); + SeedWallets(context); + SeedCategories(context); + SeedTransfers(context); + SeedWalletShares(context); + SeedNotifications(context); + } + catch (Exception ex) + { + Console.WriteLine($"Database seeding error: {ex.Message}"); + } + } + + private static void SeedUsers(ExpenseTrackerDbContext context) + { + if (context.Users.Any()) return; + + for (int i = 0; i < 10; i++) + { + var user = new ApplicationUser + { + Id = Guid.NewGuid(), + UserName = _faker.Internet.UserName(), + Email = _faker.Internet.Email(), + FirstName = _faker.Name.FirstName(), + LastName = _faker.Name.LastName(), + Birthdate = _faker.Date.Past(30, DateTime.Now.AddYears(-18)), + Notifications = new List() + }; + + context.Users.Add(user); + } + + context.SaveChanges(); + } + + private static void SeedWallets(ExpenseTrackerDbContext context) + { + if (context.Wallets.Any()) return; + + var users = context.Users.ToList(); + + for (int i = 0; i < 5; i++) + { + var wallet = new Wallet + { + Name = $"{_faker.Finance.AccountName()} Wallet", + Description = _faker.Lorem.Sentence(), + Balance = _faker.Finance.Amount(100, 10000), + IsMain = i == 0, // Можно задать первый кошелек как основной + Owner = _faker.PickRandom(users) + }; + + context.Wallets.Add(wallet); + } + + context.SaveChanges(); + } + + private static void SeedCategories(ExpenseTrackerDbContext context) + { + if (context.Categories.Any()) return; + + var users = context.Users.ToList(); + + for (int i = 0; i < 20; i++) + { + var category = new Category + { + Name = _faker.Commerce.Department(), + Description = _faker.Commerce.ProductDescription(), + Type = _faker.PickRandom(), + User = _faker.PickRandom(users) + }; + + context.Categories.Add(category); + } + + context.SaveChanges(); + } + + private static void SeedTransfers(ExpenseTrackerDbContext context) + { + if (context.Transfers.Any()) return; + + var wallets = context.Wallets.ToList(); + var categories = context.Categories.ToList(); + + for (int i = 0; i < 50; i++) + { + var transfer = new Transfer + { + Notes = _faker.Lorem.Sentence(), + Amount = _faker.Finance.Amount(-500, 500), + Date = _faker.Date.Past(), + Wallet = _faker.PickRandom(wallets), + Category = _faker.PickRandom(categories) + }; + + context.Transfers.Add(transfer); + } + + context.SaveChanges(); + } + + private static void SeedWalletShares(ExpenseTrackerDbContext context) + { + if (context.WalletShares.Any()) return; + + var wallets = context.Wallets.ToList(); + var users = context.Users.ToList(); + + foreach (var wallet in wallets) + { + for (int i = 0; i < 3; i++) + { + var share = new WalletShare + { + Date = _faker.Date.Past(), + AccessType = _faker.PickRandom(), + IsAccepted = _faker.Random.Bool(), + Wallet = wallet, + User = _faker.PickRandom(users.Where(u => u.Id != wallet.OwnerId).ToList()) + }; + + context.WalletShares.Add(share); + } + } + + context.SaveChanges(); + } + + private static void SeedNotifications(ExpenseTrackerDbContext context) + { + if (context.Notifications.Any()) return; + + var users = context.Users.ToList(); + + for (int i = 0; i < 30; i++) + { + var notification = new Notification + { + Title = _faker.Lorem.Sentence(), + Body = _faker.Lorem.Paragraph(), + RedirectUrl = _faker.Internet.Url(), + IsRead = _faker.Random.Bool(), + User = _faker.PickRandom(users) + }; + + context.Notifications.Add(notification); + } + + context.SaveChanges(); + } + } +} diff --git a/ExpenseTracker/ExpenseTracker/Program.cs b/ExpenseTracker/ExpenseTracker/Program.cs index b3a77b0..9b8b68b 100644 --- a/ExpenseTracker/ExpenseTracker/Program.cs +++ b/ExpenseTracker/ExpenseTracker/Program.cs @@ -1,6 +1,7 @@ using ExpenseTracker.Application.Hubs; using ExpenseTracker.Extensions; using ExpenseTracker.Infrastructure.Persistence; +using ExpenseTracker.Infrastructure.Persistence.SeedData; var builder = WebApplication.CreateBuilder(args); @@ -27,6 +28,7 @@ app.UseDeveloperExceptionPage(); using var scope = app.Services.CreateScope(); var context = scope.ServiceProvider.GetRequiredService(); + DatabaseSeeder.SeedAllData(context); } app.UseHttpsRedirection();