Skip to content

A simple implementation of HATEOAS for ASP.NET Core Web API to apply semantic links in models returned from your API.

License

Notifications You must be signed in to change notification settings

RonildoSouza/Simple.Hateoas

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A simple implementation of HATEOAS for .NET Web API to apply semantic links in models returned from your API.

Build, Tests and Publish

Using Instructions

1 - Install Simple.Hateoas

dotnet add package Simple.Hateoas --version 2.0.0 

2 - Register Simple.Hateoas

public class Startup
{
    // ...
    public void ConfigureServices(IServiceCollection services)
    {
        // ...
        services.AddSimpleHateoas();
    }
    // ...
}

OR (Minimal API)

/// Program.cs

// ...
builder.Services.AddSimpleHateoas();
// ...

3 - Create your Hateoas Link Builder class

using Simple.Hateoas.Models;
using YourProject.Dtos

namespace YourProject.HateoasLinkBuilders
{
    public class EntityDtoHateoasLinkBuilder : IHateoasLinkBuilder<EntityDto>
    {
        private readonly IPermissionServiceMock _permissionServiceMock;

        public EntityDtoHateoasLinkBuilder(IPermissionServiceMock permissionServiceMock)
        {
            _permissionServiceMock = permissionServiceMock;
        }

        public HateoasResult<EntityDto> AddLinks(HateoasResult<EntityDto> hateoasResult)
        {
            hateoasResult
               .AddSelfLink("GetEntity", c => new { id = c.Id })
               .AddLink("DeleteEntity", HttpMethod.Delete, c => new { id = c.Id }, _ => _permissionServiceMock.UserLoggedIsAdmin());

            return hateoasResult;
        }
    }
}

4 - Create and return your Hateoas Result

using Microsoft.AspNetCore.Mvc;
using YourProject.Dtos;
using YourProject.HateoasLinkBuilders;

namespace YourProject.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class EntitiesController : ControllerBase
    {
        private readonly IEntityAppServiceMock _entityAppServiceMock;
        private readonly IHateoas _hateoas;

        public EntitiesController(IHateoas hateoas, IEntityAppServiceMock entityAppServiceMock)
        {
            _hateoas = hateoas;
            _entityAppServiceMock = entityAppServiceMock;
        }

        [HttpGet("{id}", Name = "GetEntity")]
        [ProducesResponseType(typeof(HateoasResult<EntityDto>), (int)HttpStatusCode.OK)]
        public IActionResult Get(Guid id)
        {
            var entityDto = _entityAppServiceMock.GetById(id);
            var hateoasResult = _hateoas.Create(entityDto);

            return Ok(hateoasResult);
        }        

        [HttpDelete("{id}", Name = "DeleteEntity")]
        [ProducesResponseType((int)HttpStatusCode.OK)]
        public IActionResult Delete(Guid id)
        {
            _entityAppServiceMock.RemoveById(id);
            return Ok();
        }
    }
}

OR (Minimal API)

app.MapGet("/{id}", (
    [FromServices] IHateoas hateoas,
    [FromRoute] inGuidt id) =>
{
    var entityDto = _entityAppServiceMock.GetById(id);
    var hateoasResult = hateoas.Create(entityDto);

    return Results.Ok(hateoasResult);
})
.WithName("GetEntity")
.Produces<HateoasResult<EntityDto>>(StatusCodes.Status200OK)
.WithOpenApi();

app.MapDelete("/{id}", ([FromRoute] Guid id) =>
{
    _entityAppServiceMock.RemoveById(id);
    return Results.Ok();
})
.WithName("DeleteEntity")
.Produces(StatusCodes.Status200OK)
.WithOpenApi();

About

A simple implementation of HATEOAS for ASP.NET Core Web API to apply semantic links in models returned from your API.

Topics

Resources

License

Stars

Watchers

Forks

Languages