using Serilog.Context;

namespace WebApi.Middleware;

public class RequestIdMiddleware
{
    private readonly RequestDelegate _next;

    public RequestIdMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var requestId = context.Request.Headers["X-Request-ID"].FirstOrDefault() ?? Guid.NewGuid().ToString("N");
        
        context.Items["RequestId"] = requestId;
        
        using (LogContext.PushProperty("RequestId", requestId))
        {
            await _next(context);
        }
    }
}

public static class RequestIdExtensions
{
    public static string? GetRequestId(this HttpContext context)
    {
        return context.Items["RequestId"] as string;
    }
    
    public static IApplicationBuilder UseRequestId(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestIdMiddleware>();
    }
}