blob: 929541b4d3ec4f9244d344b12c5b080223073c92 [file] [log] [blame]
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using BaSys40.Models.Core.AssetAdministrationShell.Generics;
using BaSys40.Utils.ResultHandling;
using BaSys40.API.ServiceProvider;
using BaSys40.Models.Core.AssetAdministrationShell.Implementations;
using BaSys40.Models.Core.AssetAdministrationShell;
using BaSys40.Models.Connectivity;
using static BaSys40.Utils.ResultHandling.Utils;
using System.Linq;
namespace BaSys40.Component.REST.Controllers
{
/// <summary>
/// All Asset Administration Shell Services provided by the component
/// </summary>
public class AssetAdministrationShellServices : Controller, IAssetAdministrationShellServiceProvider
{
private readonly IAssetAdministrationShellServiceProvider assetAdministrationShellServiceProvider;
public IServiceDescriptor ServiceDescriptor { get; }
public IAssetAdministrationShell AssetAdministrationShell => assetAdministrationShellServiceProvider.GetBinding();
public AssetAdministrationShellServices(IAssetAdministrationShellServiceProvider assetAdministrationShellServiceProvider)
{
this.assetAdministrationShellServiceProvider = assetAdministrationShellServiceProvider;
ServiceDescriptor = assetAdministrationShellServiceProvider.ServiceDescriptor;
}
public void BindTo(IAssetAdministrationShell element)
{
assetAdministrationShellServiceProvider.BindTo(element);
}
public IAssetAdministrationShell GetBinding()
{
return assetAdministrationShellServiceProvider.GetBinding();
}
#region REST-Interface AssetAdministrationShell
/// <summary>
/// Retrieves the Asset Administration Shell
/// </summary>
/// <returns></returns>
/// <response code="200">Success</response>
/// <response code="502">Bad Gateway - Asset Administration Shell not available</response>
[HttpGet("aas", Name = "GetAAS")]
[ProducesResponseType(typeof(Result<AssetAdministrationShellDescriptor>), 200)]
public IActionResult GetAAS()
{
var result = GetBinding();
if (result != null)
{
var objResult = new ObjectResult(new Result<AssetAdministrationShellDescriptor>(true, new AssetAdministrationShellDescriptor(result, GetEndpoint())));
return objResult;
}
return StatusCode(502);
}
public HttpEndpoint GetEndpoint()
{
var host = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}{HttpContext.Request.Path}";
return new HttpEndpoint(host);
}
#region Submodel - REST-Calls
/// <summary>
/// Adds a new Submodel to an existing Asset Administration Shell
/// </summary>
/// <param name="submodel">The Submodel's description object</param>
/// <returns></returns>
/// <response code="201">Submodel created successfully</response>
/// <response code="400">Bad Request</response>
/// <response code="502">Bad Gateway</response>
[HttpPost("aas/submodels", Name = "PostSubmodel")]
[ProducesResponseType(typeof(IResult<ISubmodel>), 201)]
public IActionResult PostSubmodel([FromBody] ISubmodel submodel)
{
var result = CreateSubmodel(submodel);
return EvaluateResult(result, CrudOperation.Create);
}
/// <summary>
/// Retrieves a specific Submodel from a specific Asset Administration Shell
/// </summary>
/// <param name="submodelId">The Submodel's unique id</param>
/// <returns></returns>
/// <response code="200">Submodel retrieved successfully</response>
/// <response code="404">No Submodel found</response>
/// <response code="502">Bad Gateway</response>
[HttpGet("aas/submodels/{submodelId}", Name = "GetSubmodelServiceProviderBinding")]
[ProducesResponseType(typeof(IResult<ISubmodel>), 200)]
public IActionResult GetSubmodelServiceProviderBinding(string submodelId)
{
var submodelProvider = GetSubmodelServiceProvider(submodelId);
if (submodelProvider == null)
return NotFound(new Result(false, new Message(MessageType.Information, "Submodel not found", "404")));
return new OkObjectResult(new Result<ISubmodel>(true, submodelProvider.GetBinding()));
}
/// <summary>
/// Deletes a specific Submodel from the Asset Administration Shell
/// </summary>
/// <param name="submodelId">The Submodel's idShort</param>
/// <returns></returns>
/// <response code="204">Submodel deleted successfully</response>
/// <response code="400">Bad Request</response>
/// <response code="502">Bad Gateway</response>
[HttpDelete("aas/submodels/{submodelId}", Name = "DelSubmodel")]
[ProducesResponseType(typeof(IResult), 204)]
public IActionResult DelSubmodel(string submodelId)
{
var result = DeleteSubmodel(submodelId);
return EvaluateResult(result, CrudOperation.Delete);
}
/// <summary>
/// Retrieves all Submodels from the current Asset Administration Shell
/// </summary>
/// <returns></returns>
/// <response code="200">Returns a list of found Submodels</response>
/// <response code="404">No Submodels found</response>
/// <response code="502">Bad Gateway</response>
[HttpGet("aas/submodels", Name = "GetSubmodels")]
[ProducesResponseType(typeof(IResult<ElementContainer<ISubmodel>>), 200)]
public IActionResult GetSubmodels()
{
var submodelProviders = GetSubmodelServiceProviders();
if (submodelProviders?.Count() == 0)
return NotFound(new Result(false, new Message(MessageType.Information, "No Submodels found", "404")));
ElementContainer<ISubmodel> submodels = new ElementContainer<ISubmodel>();
foreach (var provider in submodelProviders)
{
var submodel = provider.GetBinding();
submodels.Add(submodel);
}
return new OkObjectResult(new Result<ElementContainer<ISubmodel>>(true, submodels));
}
#endregion
#endregion
#region Interface Implementation AssetAdministrationShellServiceProvider
public void RegisterSubmodelServiceProvider(string id, ISubmodelServiceProvider submodelServiceProvider)
{
assetAdministrationShellServiceProvider.RegisterSubmodelServiceProvider(id, submodelServiceProvider);
}
public ISubmodelServiceProvider GetSubmodelServiceProvider(string id)
{
return assetAdministrationShellServiceProvider.GetSubmodelServiceProvider(id);
}
public IResult<ISubmodel> CreateSubmodel(ISubmodel submodel)
{
return assetAdministrationShellServiceProvider.CreateSubmodel(submodel);
}
public IResult<ISubmodel> RetrieveSubmodel(string submodelId)
{
return assetAdministrationShellServiceProvider.RetrieveSubmodel(submodelId);
}
public IResult<ElementContainer<ISubmodel>> RetrieveSubmodels()
{
return assetAdministrationShellServiceProvider.RetrieveSubmodels();
}
public IResult DeleteSubmodel(string submodelId)
{
return assetAdministrationShellServiceProvider.DeleteSubmodel(submodelId);
}
public IEnumerable<ISubmodelServiceProvider> GetSubmodelServiceProviders()
{
return assetAdministrationShellServiceProvider.GetSubmodelServiceProviders();
}
#endregion
#region Helper Methods
#endregion
}
}