using Dapr; using GB5Shared.DTO.Framework.Login; using Microsoft.AspNetCore.Mvc; using MMBLL.StockValuation; using MMDAL.DTO.StockValuation; using Newtonsoft.Json; namespace MMSL.Subscriptions; [ApiController] public class StockValuationJobSubscriber : ControllerBase { private readonly IStockValuationBLL _bll; private readonly ILogger _logger; public StockValuationJobSubscriber( IStockValuationBLL bll, ILogger logger) { _bll = bll; _logger = logger; } [Topic("pubsub", "mm.stockvaluation.batch-requested")] [HttpPost("/MM/Subscriptions/StockValuationBatch")] public async Task HandleBatchRequestedAsync( [FromBody] StockValuationJobDTO job, CancellationToken ct) { _logger.LogInformation( "Batch valuation job {RunId} received for period {From}-{To}", job.StockValuationRunId, job.Filter.FromDate, job.Filter.ToDate); try { var login = JsonConvert.DeserializeObject(job.LoginToken) ?? throw new InvalidOperationException("LoginToken could not be deserialized."); await _bll.RunBatchAsync(job.Filter, job.StockValuationRunId, login, ct); return Ok(); } catch (Exception ex) { _logger.LogError(ex, "Batch valuation job {RunId} failed in subscriber", job.StockValuationRunId); return StatusCode(500, ex.Message); } } [Topic("pubsub", "mm.stockvaluation.recosting-required")] [HttpPost("/MM/Subscriptions/StockValuationRecosting")] public async Task HandleRecostingRequiredAsync( [FromBody] StockValuationFilterDTO filter, CancellationToken ct) { _logger.LogInformation( "Perpetual recosting requested for OUID {OUID} from {From} to {To}", filter.OUIDs?.FirstOrDefault(), filter.FromDate, filter.ToDate); try { // Reconstruct a minimal LoginDTO from the filter's TriggeredByUserId. // Full login context is not available in Dapr events — use a system-level login. var login = new LoginDTO { UserId = filter.TriggeredByUserId, WorkOUId = filter.OUIDs?.FirstOrDefault() ?? 0 }; await _bll.RunPerpetualRerunAsync(filter, login, ct); return Ok(); } catch (Exception ex) { _logger.LogError(ex, "Perpetual recosting failed for OUID {OUID}", filter.OUIDs?.FirstOrDefault()); return StatusCode(500, ex.Message); } } }