using System.Reflection; using Data; using Microsoft.Extensions.Logging; using Microsoft.EntityFrameworkCore; namespace Infrastructure.Interceptors; public class DryRunInterceptor : IDryRunInterceptor { private readonly ILogger _logger; private readonly DataContext _dataContext; public DryRunInterceptor(ILogger logger, DataContext dataContext) { _logger = logger; _dataContext = dataContext; } public void Intercept(Action action) { MethodInfo methodInfo = action.Method; var config = _dataContext.GeneralConfigs.First(); if (config.DryRun) { _logger.LogInformation("[DRY RUN] skipping method: {name}", methodInfo.Name); return; } action(); } public async Task InterceptAsync(Delegate action, params object[] parameters) { MethodInfo methodInfo = action.Method; var config = await _dataContext.GeneralConfigs.FirstAsync(); if (config.DryRun) { _logger.LogInformation("[DRY RUN] skipping method: {name}", methodInfo.Name); return; } object? result = action.DynamicInvoke(parameters); if (result is Task task) { await task; } } public async Task InterceptAsync(Delegate action, params object[] parameters) { MethodInfo methodInfo = action.Method; var config = await _dataContext.GeneralConfigs.FirstAsync(); if (config.DryRun) { _logger.LogInformation("[DRY RUN] skipping method: {name}", methodInfo.Name); return default; } object? result = action.DynamicInvoke(parameters); if (result is Task task) { return await task; } return default; } }