DeviceBridge/Controllers/MethodsController.cs (45 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 MethodsController : BaseController
{
private readonly IDataSubscriptionService _dataSubscriptionService;
public MethodsController(Logger logger, IDataSubscriptionService dataSubscriptionService)
: base(logger)
{
_dataSubscriptionService = dataSubscriptionService;
}
/// <summary>
/// Gets the current direct methods subscription for a device.
/// </summary>
/// <response code="200">The current direct methods subscription.</response>
/// <response code="404">If a subscription doesn't exist.</response>
[HttpGet]
[Route("sub")]
[NotFoundResultFilter]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<DeviceSubscriptionWithStatus>> GetMethodsSubscription(string deviceId, CancellationToken cancellationToken = default)
{
return await _dataSubscriptionService.GetDataSubscription(Logger, deviceId, DeviceSubscriptionType.Methods, cancellationToken);
}
/// <summary>
/// Creates or updates the current direct methods subscription for a device.
/// </summary>
/// <remarks>
/// When the device receives a direct method invocation from IoTHub, the service will send an event to the desired callback URL.
///
/// Example event:
/// {
/// "eventType": "string",
/// "deviceId": "string",
/// "deviceReceivedAt": "2020-12-04T01:06:14.251Z",
/// "methodName": "string",
/// "requestData": {}
/// }
///
/// The callback may return an optional response body, which will be sent to IoTHub as the method response:
///
/// Example callback response:
/// {
/// "status": 200,
/// "payload": {}
/// }
/// .
/// </remarks>
/// <response code="200">The created or updated C2D message subscription.</response>
[HttpPut]
[Route("sub")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<DeviceSubscriptionWithStatus>> CreateOrUpdateMethodsSubscription(string deviceId, SubscriptionCreateOrUpdateBody body, CancellationToken cancellationToken = default)
{
return await _dataSubscriptionService.CreateOrUpdateDataSubscription(Logger, deviceId, DeviceSubscriptionType.Methods, body.CallbackUrl, cancellationToken);
}
/// <summary>
/// Deletes the current direct methods subscription for a device.
/// </summary>
/// <response code="204">Subscription deleted successfully.</response>
[HttpDelete]
[Route("sub")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
public async Task<ActionResult> DeleteMethodsSubscription(string deviceId, CancellationToken cancellationToken = default)
{
await _dataSubscriptionService.DeleteDataSubscription(Logger, deviceId, DeviceSubscriptionType.Methods, cancellationToken);
return NoContent();
}
}
}