Initial push
This commit is contained in:
140
samples/SampleWebApi/Data/DataSeeder.cs
Normal file
140
samples/SampleWebApi/Data/DataSeeder.cs
Normal file
@@ -0,0 +1,140 @@
|
||||
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";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user