sqrtspace-dotnet/samples/SampleWebApi/Data/DataSeeder.cs
2025-07-20 03:41:39 -04:00

140 lines
4.8 KiB
C#

using SampleWebApi.Models;
namespace SampleWebApi.Data;
public static class DataSeeder
{
private static readonly Random _random = new Random();
private static readonly string[] _categories = { "Electronics", "Books", "Clothing", "Home & Garden", "Sports", "Toys", "Food & Beverage" };
private static readonly string[] _productAdjectives = { "Premium", "Essential", "Professional", "Deluxe", "Standard", "Advanced", "Basic" };
private static readonly string[] _productNouns = { "Widget", "Gadget", "Tool", "Device", "Kit", "Set", "Pack", "Bundle" };
public static async Task SeedAsync(SampleDbContext context)
{
// Check if data already exists
if (context.Products.Any())
{
return;
}
// Create customers
var customers = GenerateCustomers(1000);
await context.Customers.AddRangeAsync(customers);
await context.SaveChangesAsync();
// Create products
var products = GenerateProducts(10000);
await context.Products.AddRangeAsync(products);
await context.SaveChangesAsync();
// Create orders with items
var orders = GenerateOrders(customers, products, 50000);
await context.Orders.AddRangeAsync(orders);
await context.SaveChangesAsync();
}
private static List<Customer> GenerateCustomers(int count)
{
var customers = new List<Customer>();
for (int i = 1; i <= count; i++)
{
customers.Add(new Customer
{
Id = $"CUST{i:D6}",
Name = $"Customer {i}",
Email = $"customer{i}@example.com",
RegisteredAt = DateTime.UtcNow.AddDays(-_random.Next(1, 730))
});
}
return customers;
}
private static List<Product> GenerateProducts(int count)
{
var products = new List<Product>();
for (int i = 1; i <= count; i++)
{
var category = _categories[_random.Next(_categories.Length)];
var adjective = _productAdjectives[_random.Next(_productAdjectives.Length)];
var noun = _productNouns[_random.Next(_productNouns.Length)];
products.Add(new Product
{
Id = i,
Name = $"{adjective} {noun} {i}",
Description = $"High-quality {adjective.ToLower()} {noun.ToLower()} for {category.ToLower()} enthusiasts",
Category = category,
Price = (decimal)(_random.NextDouble() * 990 + 10), // $10 to $1000
StockQuantity = _random.Next(0, 1000),
CreatedAt = DateTime.UtcNow.AddDays(-_random.Next(1, 365)),
UpdatedAt = DateTime.UtcNow.AddDays(-_random.Next(0, 30))
});
}
return products;
}
private static List<Order> GenerateOrders(List<Customer> customers, List<Product> products, int count)
{
var orders = new List<Order>();
for (int i = 1; i <= count; i++)
{
var customer = customers[_random.Next(customers.Count)];
var orderDate = DateTime.UtcNow.AddDays(-_random.Next(0, 365));
var itemCount = _random.Next(1, 10);
var orderItems = new List<OrderItem>();
decimal totalAmount = 0;
// Add random products to the order
var selectedProducts = products
.OrderBy(x => _random.Next())
.Take(itemCount)
.ToList();
foreach (var product in selectedProducts)
{
var quantity = _random.Next(1, 5);
var itemTotal = product.Price * quantity;
totalAmount += itemTotal;
orderItems.Add(new OrderItem
{
ProductId = product.Id,
Quantity = quantity,
UnitPrice = product.Price,
TotalPrice = itemTotal
});
}
orders.Add(new Order
{
Id = i,
CustomerId = customer.Id,
OrderDate = orderDate,
TotalAmount = totalAmount,
Status = GetRandomOrderStatus(orderDate),
Items = orderItems
});
}
return orders;
}
private static string GetRandomOrderStatus(DateTime orderDate)
{
var daysSinceOrder = (DateTime.UtcNow - orderDate).Days;
if (daysSinceOrder < 1)
return "Pending";
else if (daysSinceOrder < 3)
return _random.Next(2) == 0 ? "Processing" : "Pending";
else if (daysSinceOrder < 7)
return _random.Next(3) == 0 ? "Shipped" : "Processing";
else
return _random.Next(10) == 0 ? "Cancelled" : "Delivered";
}
}