using System.Security.Claims; using LctMonolith.Models; using LctMonolith.Services; using LctMonolith.Services.Contracts; using LctMonolith.Services.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace LctMonolith.Controllers; /// /// Endpoints for listing and managing missions. /// [ApiController] [Route("api/missions")] [Authorize] public class MissionsController : ControllerBase { private readonly IMissionService _missionService; public MissionsController(IMissionService missionService) { _missionService = missionService; } private Guid GetUserId() => Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!); /// Returns missions currently available to the authenticated user. [HttpGet] public async Task>> GetAvailable(CancellationToken ct) { var userId = GetUserId(); var list = await _missionService.GetAvailableMissionsAsync(userId, ct); return Ok(list); } /// Create a mission (HR functionality – for now any authenticated user). [HttpPost] public async Task> Create(CreateMissionModel model, CancellationToken ct) { var mission = await _missionService.CreateMissionAsync(model, ct); return CreatedAtAction(nameof(GetAvailable), new { id = mission.Id }, mission); } /// Update mission status for current user (submit/complete/etc.). [HttpPatch("{missionId:guid}/status")] public async Task UpdateStatus(Guid missionId, UpdateMissionStatusRequest req, CancellationToken ct) { var userId = GetUserId(); var result = await _missionService.UpdateStatusAsync(userId, missionId, req.Status, req.SubmissionData, ct); return Ok(new { result.MissionId, result.Status, result.UpdatedAt }); } }