using System; using System.Text.Json; using Expedience.Api.Encryption; using Expedience.Infrastructure; using Expedience.Infrastructure.Concurrency; using MassTransit; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Expedience.Api.Controllers { [Route("api/[controller]")] [ApiController] public class ExpedienceController : ControllerBase { private readonly ILogger _logger; private readonly IPublishEndpoint _publisher; private readonly IDecryptor _decrypytor; private readonly IDistributedLock _distributedLock; private readonly IServiceScopeFactory _serviceScopeFactory; public ExpedienceController(ILogger logger, IPublishEndpoint publisher, IDecryptor decrypytor, IDistributedLock distributedLock, IServiceScopeFactory serviceScopeFactory) { _logger = logger; _publisher = publisher; _decrypytor = decrypytor; _distributedLock = distributedLock; _serviceScopeFactory = serviceScopeFactory; } [HttpPost("DutyCompletion")] public async Task PostDutyCompletionResult(List encryptedPayloads) { var utcNow = DateTime.UtcNow; try { foreach (var payload in encryptedPayloads) { var decryptedData = _decrypytor.Decrypt(payload); var completionResult = JsonSerializer.Deserialize(decryptedData)!; completionResult.UploadDateUtc = utcNow; await _publisher.Publish(completionResult); } } catch (Exception ex) { _logger.LogError(ex, "Error publishing completion result: {errorMessage}", ex.Message); } return Ok(); } [HttpGet("UserName/{worldId}/{userHash}")] public async Task GetUserName(int worldId, string userHash, CancellationToken cancellationToken) { try { using var scope = _serviceScopeFactory.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); var user = await dbContext.Users.FirstOrDefaultAsync(x => x.UserHash == userHash && x.WorldId == worldId, cancellationToken); if (user != null) return Ok(user.UserName); else return NotFound(); } catch (Exception ex) { _logger.LogError(ex, "Error obtaining user name for World Id {worldId} and hash {userHash}: {errorMessage}", worldId, userHash, ex.Message); } return StatusCode(500); } } }