using Microsoft.AspNetCore.Mvc; using DomainResults.Mvc; using MaksIT.LetsEncryptServer.Services; using MaksIT.Models.LetsEncryptServer.CertsFlow.Requests; namespace MaksIT.LetsEncryptServer.Controllers { /// /// Certificates flow controller, used for granular testing purposes /// [ApiController] [Route("api/certs")] public class CertsFlowController : ControllerBase { private readonly ICertsFlowService _certsFlowService; public CertsFlowController( ICertsFlowService certsFlowService ) { _certsFlowService = certsFlowService; } /// /// Initialize certificate flow session /// /// sessionId [HttpPost("configure-client")] public async Task ConfigureClient([FromBody] ConfigureClientRequest requestData) { var result = await _certsFlowService.ConfigureClientAsync(requestData); return result.ToActionResult(); } /// /// Retrieves terms of service /// /// Session ID /// Terms of service [HttpGet("{sessionId}/terms-of-service")] public IActionResult TermsOfService(Guid sessionId) { var result = _certsFlowService.GetTermsOfService(sessionId); return result.ToActionResult(); } /// /// When a new certificate session is created, create or retrieve cache data by accountId /// /// Session ID /// Account ID /// Request data /// Account ID [HttpPost("{sessionId}/init/{accountId?}")] public async Task Init(Guid sessionId, Guid? accountId, [FromBody] InitRequest requestData) { var result = await _certsFlowService.InitAsync(sessionId, accountId, requestData); return result.ToActionResult(); } /// /// After account initialization, create a new order request /// /// Session ID /// Request data /// New order response [HttpPost("{sessionId}/order")] public async Task NewOrder(Guid sessionId, [FromBody] NewOrderRequest requestData) { var result = await _certsFlowService.NewOrderAsync(sessionId, requestData); return result.ToActionResult(); } /// /// Complete challenges for the new order /// /// Session ID /// Challenges completion response [HttpPost("{sessionId}/complete-challenges")] public async Task CompleteChallenges(Guid sessionId) { var result = await _certsFlowService.CompleteChallengesAsync(sessionId); return result.ToActionResult(); } /// /// Get order status before certificate retrieval /// /// Session ID /// Request data /// Order status [HttpGet("{sessionId}/order-status")] public async Task GetOrder(Guid sessionId, [FromBody] GetOrderRequest requestData) { var result = await _certsFlowService.GetOrderAsync(sessionId, requestData); return result.ToActionResult(); } /// /// Download certificates to local cache /// /// Session ID /// Request data /// Certificates download response [HttpPost("{sessionId}/certificates/download")] public async Task GetCertificates(Guid sessionId, [FromBody] GetCertificatesRequest requestData) { var result = await _certsFlowService.GetCertificatesAsync(sessionId, requestData); return result.ToActionResult(); } /// /// Apply certificates from local cache to remote server /// /// Session ID /// Request data /// Certificates application response [HttpPost("{sessionId}/certificates/apply")] public async Task ApplyCertificates(Guid sessionId, [FromBody] GetCertificatesRequest requestData) { var result = await _certsFlowService.ApplyCertificatesAsync(sessionId, requestData); return result.ToActionResult(); } } }