using System.Net;
using AutopilotMonitor.Functions.Helpers;
using AutopilotMonitor.Functions.Services.Notifications;
using AutopilotMonitor.Functions.Services.Push;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
namespace AutopilotMonitor.Functions.Functions.Push;
///
/// Device management from the portal: list (own devices for everyone on the tier, every device
/// of the scope for its admins), remove (wipe push, then the row is gone) and test. Tenant routes
/// under push/devices… (TenantAdminOrOperator), platform routes under
/// global/push/devices… (GlobalAdminOnly).
///
public class PushDevicesFunctions
{
private readonly PushPairingService _pairing;
private readonly ILogger _logger;
public PushDevicesFunctions(PushPairingService pairing, ILogger logger)
{
_pairing = pairing;
_logger = logger;
}
[Function("ListPushDevices")]
public Task List(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "push/devices")] HttpRequestData req)
=> ListCoreAsync(req, PushFunctionSupport.TenantContext(req));
[Function("DeletePushDevice")]
public Task Delete(
[HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "push/devices/{deviceId}")] HttpRequestData req,
string deviceId)
=> DeleteCoreAsync(req, deviceId, PushFunctionSupport.TenantContext(req));
[Function("TestPushDevice")]
public Task Test(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "push/devices/{deviceId}/test")] HttpRequestData req,
string deviceId)
=> TestCoreAsync(req, deviceId, PushFunctionSupport.TenantContext(req));
[Function("ListPlatformPushDevices")]
public Task ListPlatform(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "global/push/devices")] HttpRequestData req)
=> ListCoreAsync(req, PushFunctionSupport.PlatformContext(req));
[Function("DeletePlatformPushDevice")]
public Task DeletePlatform(
[HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "global/push/devices/{deviceId}")] HttpRequestData req,
string deviceId)
=> DeleteCoreAsync(req, deviceId, PushFunctionSupport.PlatformContext(req));
[Function("TestPlatformPushDevice")]
public Task TestPlatform(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "global/push/devices/{deviceId}/test")] HttpRequestData req,
string deviceId)
=> TestCoreAsync(req, deviceId, PushFunctionSupport.PlatformContext(req));
private async Task ListCoreAsync(HttpRequestData req, (NotificationScope Scope, PushCaller Caller) ctx)
{
try
{
return await req.OkAsync(await _pairing.ListAsync(ctx.Scope, ctx.Caller));
}
catch (Exception ex)
{
return await req.InternalServerErrorAsync(_logger, ex, "ListPushDevices");
}
}
private async Task DeleteCoreAsync(HttpRequestData req, string deviceId, (NotificationScope Scope, PushCaller Caller) ctx)
{
try
{
if (!PushFunctionSupport.IsPlausibleId(deviceId))
return await req.NotFoundAsync("Device not found.");
var error = await _pairing.DeleteAsync(ctx.Scope, deviceId, ctx.Caller);
if (error != PushOpError.None)
return await PushFunctionSupport.ErrorAsync(req, error, "Device not found.");
return req.CreateResponse(HttpStatusCode.NoContent);
}
catch (Exception ex)
{
return await req.InternalServerErrorAsync(_logger, ex, "DeletePushDevice");
}
}
private async Task TestCoreAsync(HttpRequestData req, string deviceId, (NotificationScope Scope, PushCaller Caller) ctx)
{
try
{
if (!PushFunctionSupport.IsPlausibleId(deviceId))
return await req.NotFoundAsync("Device not found.");
var result = await _pairing.TestAsync(ctx.Scope, deviceId, ctx.Caller);
return result.Ok
? await req.OkAsync(result.Value!)
: await PushFunctionSupport.ErrorAsync(req, result.Error, "Device not found.");
}
catch (Exception ex)
{
return await req.InternalServerErrorAsync(_logger, ex, "TestPushDevice");
}
}
}