Skip to content

RonildoSouza/Simple.Hateoas

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 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,
    [FromServices] IEntityAppServiceMock entityAppServiceMock,
    [FromRoute] Guid 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}", (
    [FromServices] IEntityAppServiceMock entityAppServiceMock,
    [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

Contributors

Languages