using Dapr; using EntitlementBLL.Interfaces; using EntitlementDAL.DTOs; using Microsoft.AspNetCore.Mvc; namespace EntitlementSL.Subscriptions; // idms.engagement.activated → provisions the subscription (idempotent on IdmsEngagementRef). [ApiController] public class EngagementActivatedSubscriber : ControllerBase { private readonly IProvisioningService _ProvisioningService; private readonly ILogger _Logger; public EngagementActivatedSubscriber(IProvisioningService provisioningService, ILogger logger) { _ProvisioningService = provisioningService; _Logger = logger; } [Topic("goodbooks-pubsub", "idms.engagement.activated")] [HttpPost("/lic/Subscriptions/EngagementActivated")] public async Task HandleAsync([FromBody] EngagementActivatedEvent evt, CancellationToken ct) { try { var req = new ProvisionSubscriptionRequest { ClientId = evt.ClientId, PlanId = evt.PlanId, IdmsEngagementRef = evt.EngagementRef, TrialFlag = evt.TrialFlag, StartDate = evt.ActivatedOn, LicenseValidTill = evt.LicenseValidTill, SupportValidTill = evt.SupportValidTill }; var result = await _ProvisioningService.ProvisionSubscriptionAsync(req, ct); _Logger.LogInformation( "Engagement activated: ClientId {ClientId} EngagementRef {EngagementRef} -> SubscriptionId {SubscriptionId} (AlreadyExisted={AlreadyExisted})", evt.ClientId, evt.EngagementRef, result.SubscriptionId, result.AlreadyExisted); return Ok(); } catch (Exception ex) { _Logger.LogError(ex, "EngagementActivatedSubscriber failed for ClientId {ClientId}", evt.ClientId); return StatusCode(500, ex.Message); } } public record EngagementActivatedEvent( int ClientId, int PlanId, string EngagementRef, bool TrialFlag, DateTime ActivatedOn, DateTime LicenseValidTill, DateTime SupportValidTill); }