DeviceBridge/Controllers/ConnectionStatusController.cs (61 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. using System.Threading; using System.Threading.Tasks; using DeviceBridge.Models; using DeviceBridge.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NLog; namespace DeviceBridge.Controllers { [Route("devices/{deviceId}/[controller]")] [ApiController] public class ConnectionStatusController : BaseController { private readonly IConnectionStatusSubscriptionService _connectionStatusSubscriptionService; private readonly IConnectionManager _connectionManager; public ConnectionStatusController(Logger logger, IConnectionStatusSubscriptionService connectionStatusSubscriptionService, IConnectionManager connectionManager) : base(logger) { _connectionStatusSubscriptionService = connectionStatusSubscriptionService; _connectionManager = connectionManager; } /// <summary> /// Gets that latest connection status for a device. /// </summary> /// <remarks> /// For a detailed description of each status, see https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.devices.client.connectionstatus?view=azure-dotnet. /// </remarks> /// <response code="200">The latest connection status and reason.</response> /// <response code="404">If the connection status is not known (i.e., the device hasn't attempted to connect).</response> [HttpGet] [Route("")] [NotFoundResultFilter] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult<DeviceStatusResponseBody> GetCurrentConnectionStatus(string deviceId) { var deviceStatus = _connectionManager.GetDeviceStatus(deviceId); return (deviceStatus != null) ? new DeviceStatusResponseBody() { Status = deviceStatus?.status.ToString(), Reason = deviceStatus?.reason.ToString(), } : null; } /// <summary> /// Gets the current connection status change subscription for a device. /// </summary> /// <response code="200">The current connection status subscription.</response> /// <response code="404">If a subscription doesn't exist.</response> [HttpGet] [Route("sub")] [NotFoundResultFilter] [ProducesResponseType(StatusCodes.Status200OK)] public async Task<ActionResult<DeviceSubscription>> GetConnectionStatusSubscription(string deviceId, CancellationToken cancellationToken = default) { return await _connectionStatusSubscriptionService.GetConnectionStatusSubscription(Logger, deviceId, cancellationToken); } /// <summary> /// Creates or updates the current connection status change subscription for a device. /// </summary> /// <remarks> /// When the internal connection status of a device changes, the service will send an event to the desired callback URL. /// /// Example event: /// { /// "eventType": "string", /// "deviceId": "string", /// "deviceReceivedAt": "2020-12-04T01:06:14.251Z", /// "status": "string", /// "reason": "string" /// } /// /// For a detailed description of each status, see https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.devices.client.connectionstatus?view=azure-dotnet. /// </remarks> /// <response code="200">The created or updated connection status subscription.</response> [HttpPut] [Route("sub")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task<ActionResult<DeviceSubscription>> CreateOrUpdateConnectionStatusSubscription(string deviceId, SubscriptionCreateOrUpdateBody body, CancellationToken cancellationToken = default) { return await _connectionStatusSubscriptionService.CreateOrUpdateConnectionStatusSubscription(Logger, deviceId, body.CallbackUrl, cancellationToken); } /// <summary> /// Deletes the current connection status change subscription for a device. /// </summary> /// <response code="204">Subscription deleted successfully.</response> [HttpDelete] [Route("sub")] [ProducesResponseType(StatusCodes.Status204NoContent)] public async Task<ActionResult> DeleteConnectionStatusSubscription(string deviceId, CancellationToken cancellationToken = default) { await _connectionStatusSubscriptionService.DeleteConnectionStatusSubscription(Logger, deviceId, cancellationToken); return NoContent(); } } }