using Fitness_core_BE.DTOs.PaymentsEnablement; using Fitness_core_BE.Exceptions; using Fitness_core_BE.Helpers; using Fitness_core_BE.Interfaces.Services; using Fitness_core_BE.Models.IOs; using Microsoft.AspNetCore.Mvc; using static Fitness_core_BE.Helpers.JwtMiddleware; using static Fitness_core_BE.Helpers.ApiResponseHelper; namespace Fitness_core_BE.Controllers { [ApiController] [Route("api/admin")] [CustomMiddleware] [TenantResolution] public class AdminController : ControllerBase { private readonly IPayoutKycReviewService _kycReview; private readonly IAdminClientDirectoryService _clientDirectory; private readonly UserRoleHelper _userRoleHelper; private readonly IAdminSuggestionService _suggestions; public AdminController( IPayoutKycReviewService kycReview, IAdminClientDirectoryService clientDirectory, UserRoleHelper userRoleHelper, IAdminSuggestionService suggestions) { _kycReview = kycReview; _clientDirectory = clientDirectory; _userRoleHelper = userRoleHelper; _suggestions = suggestions; } [HttpGet("payout-kyc")] public async Task>>> ListKyc([FromQuery] string? status) { return Response(await _kycReview.ListAsync(status)); } [HttpGet("payout-kyc/{clientId:guid}")] public async Task>> GetKyc(Guid clientId) { return Response(await _kycReview.GetByClientIdAsync(clientId)); } [HttpPatch("payout-kyc/{clientId:guid}/status")] public async Task>> ReviewKyc(Guid clientId, [FromBody] ReviewPayoutKycRequest request) { return Response(await _kycReview.ReviewAsync(clientId, request, HttpContext)); } [HttpGet("clients")] public async Task>>> ListClients([FromQuery] ClientDirectoryQuery query) { return Response(await _clientDirectory.ListAsync(query)); } [HttpGet("clients/{id:guid}")] public async Task>> GetClient(Guid id) { return Response(await _clientDirectory.GetByIdAsync(id)); } [HttpPost("clients/{id:guid}/pairing-code")] public async Task>> GeneratePairingCode(Guid id) { return Response(await _clientDirectory.GeneratePairingCodeAsync(id)); } [HttpPost("clients/{id:guid}/resend-welcome-email")] public async Task>> ResendWelcomeEmail(Guid id) { await _clientDirectory.ResendWelcomeEmailAsync(id, HttpContext); return Response(new { sent = true }); } [HttpGet("clients/{id:guid}/access-devices")] public async Task>> GetAccessDevices(Guid id) { return Response(await _clientDirectory.GetDevicesAsync(id)); } // Platform plans are global templates (no FKClientId). Mobile customers see them // in Suggestions in addition to templates created by their own gym. [HttpGet("suggestions")] public async Task>> ListSuggestions() => Response(await _suggestions.ListAsync()); [HttpPost("suggestions/workouts")] public async Task>> CreateWorkoutSuggestion([FromBody] AdminWorkoutSuggestionRequest request) => Response(await _suggestions.CreateWorkoutAsync(request, HttpContext)); [HttpPost("suggestions/meals")] public async Task>> CreateMealSuggestion([FromBody] AdminMealSuggestionRequest request) => Response(await _suggestions.CreateMealAsync(request, HttpContext)); } }