Coder Social home page Coder Social logo

migrap.aspnetcore.hateoas's Introduction

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; }
}

migrap.aspnetcore.hateoas's People

Contributors

migrap avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.