Skip to content

DevInstinct/Migrap.AspNetCore.Hateoas

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Migrap.AspNetCore.Hateoas

HATEOAS (Hypermedia as the Engine of Application State) framework for ASP.NET Core.

Current implementation(s):

  • Siren
  • JsonApi
public class Startup {
    public void ConfigureServices(IServiceCollection services) {
        services.AddMvc(options => {
        }).AddSirenOptions(options => {
            options.StateConverters.Add(new ArticleSirenStateConverterProvider());
        });            
    }

    public void Configure(IApplicationBuilder app) {
        app.Use((context, next) => {
            if(context.Request.Path.StartsWithSegments("/ping")) {
                return context.Response.WriteAsync("pong");
            }
            return next();
        });

        app.UseMvc();
    }
}

[Route("[controller]")]
public class ArticlesController : Controller {
    [HttpGet()]
    public IEnumerable<Article> Get() {
        return new List<Article> {
            new Article {
                Id ="1",
                Title = "JSON API paints my bikeshed!",
                Body = "The shortest article. Ever.",
                Created =1432306588,
                Updated =1432306589
            },
            new Article {
                Id ="2",
                Title = "JSON API paints my homework!",
                Body = "The shortest article. Ever... again",
                Created =1432306588,
                Updated =1432306589
            }
        };
    }
}

public class ArticleSirenStateConverterProvider : IStateConverterProvider {
    public IStateConverter CreateConverter(StateConverterProviderContext context) {
        if(context == null) {
            throw new ArgumentNullException(nameof(context));
        }

        if(typeof(Article).IsAssignableFrom(context.ObjectType) || typeof(IEnumerable<Article>).IsAssignableFrom(context.ObjectType)) {
            return new ArticleSirenStateConverter();
        }

        return null;
    }
}

public class ArticleSirenStateConverter : IStateConverter {
    public Task<object> ConvertAsync(StateConverterContext context) {
        var articles = (context.Object as IEnumerable<Article>);

        var path = context.HttpContext.Request.GetDisplayUrl();

        var properties = new {
            count = articles.Count()
        };
            
        var document = new Migrap.AspNetCore.Hateoas.Siren.Core.Document {
            Class = new Class { "article", "collection" },
            Properties = properties,
            Href = path,
        };

        var entities = articles.Select(a => {
            return new Entity {
                Class = new Class { "article" },
                Properties = a,
                Href = $"{path}/{a.Id}",
            };
        });

        document.Entities.Add(entities);

        return Task.FromResult<object>(document);
    }
}    

public class Article {
    public Article() {
    }

    public Article(string id, string title, string body, long created, long updated) {
        Id = id;
        Title = title;
        Body = body;
        Created = created;
        Updated = updated;
    }

    public string Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public long Created { get; set; }
    public long Updated { get; set; }
}

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 100.0%