140 lines
4.8 KiB
C#
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";
|
|
}
|
|
} |