using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tiku.Api.Contracts; using Tiku.Application.PlatformAdmin; using Tiku.Application.Security; using Tiku.Application.Tenancy; using Tiku.Domain.Growth; using Tiku.Domain.Tenancy; namespace Tiku.Api.Controllers; [ApiController] [Authorize(Policy = TikuPolicies.PlatformBackofficeBootstrap)] [Produces("application/json")] [Route("api/platform-admin/tenant-capabilities/crm")] public sealed class PlatformAdminCrmController( IPlatformCrmAdminService crmService, ICurrentUser currentUser) : ControllerBase { [HttpGet("configs")] [Authorize(Policy = BackendPermissions.PlatformCrmRead)] public Task> Configs([FromQuery] PlatformCapabilityQueryDto query, CancellationToken cancellationToken) => crmService.GetConfigsAsync(Actor(), query.ToQuery(), cancellationToken); [HttpPut("configs")] [Authorize(Policy = BackendPermissions.PlatformCrmWrite)] public Task UpsertConfig(UpsertPlatformCrmConfigDto request, CancellationToken cancellationToken) => crmService.UpsertConfigAsync(Actor(), request.ToCommand(), cancellationToken); [HttpGet("leads")] [Authorize(Policy = BackendPermissions.PlatformCrmRead)] public Task> Leads([FromQuery] PlatformCapabilityQueryDto query, CancellationToken cancellationToken) => crmService.GetLeadsAsync(Actor(), query.ToQuery(), cancellationToken); [HttpPost("leads/retry")] [Authorize(Policy = BackendPermissions.PlatformCrmWrite)] public Task RetryLead(RetryPlatformCrmLeadDto request, CancellationToken cancellationToken) => crmService.RetryLeadAsync(Actor(), request.ToCommand(), cancellationToken); [HttpGet("logs")] [Authorize(Policy = BackendPermissions.PlatformCrmRead)] public Task> Logs([FromQuery] PlatformCrmLogQueryDto query, CancellationToken cancellationToken) => crmService.GetLogsAsync(Actor(), query.TenantId, query.QueueId, query.Limit, cancellationToken); private PlatformCapabilityActor Actor() => currentUser.UserId is { } userId ? new PlatformCapabilityActor(userId) : throw new PlatformCapabilityException("Platform actor was not resolved.", "platform_access_denied"); } [ApiController] [Authorize(Policy = TikuPolicies.PlatformBackofficeBootstrap)] [Produces("application/json")] [Route("api/platform-admin/tenant-capabilities/sms")] public sealed class PlatformAdminSmsController( IPlatformSmsAdminService smsService, ICurrentUser currentUser) : ControllerBase { [HttpGet("channels")] [Authorize(Policy = BackendPermissions.PlatformSmsRead)] public Task> Channels([FromQuery] PlatformCapabilityQueryDto query, CancellationToken cancellationToken) => smsService.GetChannelsAsync(Actor(), query.ToQuery(), cancellationToken); [HttpPut("channels")] [Authorize(Policy = BackendPermissions.PlatformSmsWrite)] public Task UpsertChannel(UpsertPlatformSmsChannelDto request, CancellationToken cancellationToken) => smsService.UpsertChannelAsync(Actor(), request.ToCommand(), cancellationToken); [HttpPost("channels/{id:guid}/disable")] [Authorize(Policy = BackendPermissions.PlatformSmsWrite)] public Task DisableChannel(Guid id, CancellationToken cancellationToken) => smsService.DisableChannelAsync(Actor(), id, cancellationToken); [HttpGet("templates")] [Authorize(Policy = BackendPermissions.PlatformSmsRead)] public Task> Templates([FromQuery] PlatformCapabilityQueryDto query, CancellationToken cancellationToken) => smsService.GetTemplatesAsync(Actor(), query.ToQuery(), cancellationToken); [HttpPut("templates")] [Authorize(Policy = BackendPermissions.PlatformSmsWrite)] public Task UpsertTemplate(UpsertPlatformSmsTemplateDto request, CancellationToken cancellationToken) => smsService.UpsertTemplateAsync(Actor(), request.ToCommand(), cancellationToken); [HttpPost("templates/{id:guid}/submit-review")] [Authorize(Policy = BackendPermissions.PlatformSmsWrite)] public Task SubmitTemplateReview(Guid id, CancellationToken cancellationToken) => smsService.SubmitTemplateReviewAsync(Actor(), id, cancellationToken); [HttpPost("templates/{id:guid}/disable")] [Authorize(Policy = BackendPermissions.PlatformSmsWrite)] public Task DisableTemplate(Guid id, CancellationToken cancellationToken) => smsService.DisableTemplateAsync(Actor(), id, cancellationToken); [HttpGet("logs")] [Authorize(Policy = BackendPermissions.PlatformSmsRead)] public Task> Logs([FromQuery] PlatformCapabilityQueryDto query, CancellationToken cancellationToken) => smsService.GetLogsAsync(Actor(), query.ToQuery(), cancellationToken); private PlatformCapabilityActor Actor() => currentUser.UserId is { } userId ? new PlatformCapabilityActor(userId) : throw new PlatformCapabilityException("Platform actor was not resolved.", "platform_access_denied"); } [ApiController] [Authorize(Policy = TikuPolicies.PlatformBackofficeBootstrap)] [Produces("application/json")] [Route("api/platform-admin/tenant-capabilities/payments")] public sealed class PlatformAdminTenantPaymentSettingsController( IPlatformTenantPaymentAdminService paymentService, ICurrentUser currentUser) : ControllerBase { [HttpGet("apps")] [Authorize(Policy = BackendPermissions.PlatformPaymentRead)] public Task> Apps([FromQuery] PlatformCapabilityQueryDto query, CancellationToken cancellationToken) => paymentService.GetAppsAsync(Actor(), query.ToQuery(), cancellationToken); [HttpPut("apps")] [Authorize(Policy = BackendPermissions.PlatformPaymentWrite)] public Task UpsertApp(UpsertPlatformTenantPaymentAppDto request, CancellationToken cancellationToken) => paymentService.UpsertAppAsync(Actor(), request.TenantId, request.ToCommand(), cancellationToken); [HttpGet("events")] [Authorize(Policy = BackendPermissions.PlatformPaymentRead)] public Task> Events([FromQuery] PlatformCapabilityQueryDto query, CancellationToken cancellationToken) => paymentService.GetEventsAsync(Actor(), query.ToQuery(), cancellationToken); private PlatformCapabilityActor Actor() => currentUser.UserId is { } userId ? new PlatformCapabilityActor(userId) : throw new PlatformCapabilityException("Platform actor was not resolved.", "platform_access_denied"); }