using Microsoft.AspNetCore.Mvc; namespace SeriLoog.Controllers; [ApiController] [Route("api/[controller]")] public sealed class DemoController : ControllerBase { private readonly ILogger _logger; private static readonly string[] Users = { "alphons", "marieke", "jeroen", "sanne", "kees" }; private static readonly string[] Orders = { "ORD-1001", "ORD-1002", "ORD-1003", "ORD-1004" }; private static readonly Random Rng = new(); public DemoController(ILogger logger) { _logger = logger; } [HttpPost("generate")] public IActionResult Generate([FromQuery] int count = 25) { count = Math.Clamp(count, 1, 500); for (var i = 0; i < count; i++) { var user = Users[Rng.Next(Users.Length)]; var order = Orders[Rng.Next(Orders.Length)]; var durationMs = Rng.Next(5, 2000); switch (Rng.Next(0, 8)) { case 0: _logger.LogTrace("Cache lookup for key {CacheKey} took {DurationMs}ms", $"user:{user}", durationMs); break; case 1: _logger.LogDebug("Processing order {OrderId} for user {User}", order, user); break; case 2: case 3: _logger.LogInformation("User {User} placed order {OrderId} worth {Amount:C}", user, order, Rng.Next(10, 500)); break; case 4: _logger.LogWarning("Order {OrderId} for {User} is taking longer than expected ({DurationMs}ms)", order, user, durationMs); break; case 5: try { throw new InvalidOperationException($"Payment gateway timeout for order {order}"); } catch (Exception ex) { _logger.LogError(ex, "Payment failed for order {OrderId} and user {User}", order, user); } break; case 6: try { throw new ApplicationException($"Unhandled exception while shipping {order}"); } catch (Exception ex) { _logger.LogCritical(ex, "Fatal error shipping order {OrderId}", order); } break; default: _logger.LogInformation("Health check ok at {CheckedAt}", DateTimeOffset.UtcNow); break; } } return Ok(new { generated = count }); } }