using System.Net;
using System.Web;
using AutopilotMonitor.Functions.Helpers;
using AutopilotMonitor.Shared.DataAccess;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
namespace AutopilotMonitor.Functions.Functions.Progress;
///
/// Dedicated Progress Portal endpoints.
/// These routes are exempt from MemberAuthorizationMiddleware so any authenticated tenant user
/// can monitor enrollment sessions without needing an Admin or Operator role.
///
public class ProgressPortalFunction
{
private readonly ILogger _logger;
private readonly ISessionRepository _sessionRepo;
public ProgressPortalFunction(
ILogger logger,
ISessionRepository sessionRepo)
{
_logger = logger;
_sessionRepo = sessionRepo;
}
///
/// GET /api/progress/sessions
/// Returns sessions for the authenticated user's tenant.
///
[Function("ProgressGetSessions")]
public async Task GetSessions(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "progress/sessions")] HttpRequestData req)
{
_logger.LogInformation("ProgressGetSessions processing request");
try
{
// Authentication + AuthenticatedUser authorization enforced by PolicyEnforcementMiddleware
var tenantId = req.GetRequestContext().TenantId;
_logger.LogInformation("ProgressGetSessions: Fetching sessions for tenant {TenantId}", tenantId);
var page = await _sessionRepo.GetSessionsAsync(tenantId, maxResults: 100);
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(new
{
success = true,
count = page.Sessions.Count,
sessions = page.Sessions
});
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error in ProgressGetSessions");
var errorResponse = req.CreateResponse(HttpStatusCode.InternalServerError);
await errorResponse.WriteAsJsonAsync(new
{
success = false,
message = "Internal server error",
count = 0,
sessions = Array.Empty