Introduction

Firestorm Stems is a library built on top of the Firestorm Engine to provide a neat way to describe your RESTful API structure.

Stems are classes that contain the members used in your API. Members are decorated with Attributes that describe their usage.

C# Stems

Stems describe how to handle an object of a specific type. Types can be Entities, business objects or DTOs. See Best Practices.

These example Stems describe the relationship between Artist and Album objects.

public class ArtistsStem : Stem<Artist>
{
    [Get, Identifier]
    public static Expression Id => Expression(a => a.Id);

    [Get, Set]
    public static Expression Name => Expression(a => a.Name);

    [Get]
    [Substem(typeof(AlbumSubstem))]
    public static Expression Albums => Expression(a => a.Albums);
}

public class AlbumsStem : Stem<Album>
{
    [Get, Identifier]
    public static Expression Id => Expression(a => a.Id);

    [Get, Set]
    public static Expression Title => Expression(a => a.Title);

    [Get, Set]
    public static Expression ReleaseDate => Expression(a => a.ReleaseDate);

    [Get]
    public static Expression IsStreamable => Expression(a => a.Streams.Any(s => s.IsAvailable));
}

JSON REST API

The consumer can request certain fields in the artists collection.

GET /artists?fields=id,name,albums


200 OK

[
    {
        "id": 123,
        "name": "Noisia",
        "albums": [
            { "id": 4321 },    
            { "id": 6344 },    
            { "id": 7653 }
        ]
    },            
    {
        "id": 981,
        "name": "Periphery",
        "albums": [
            { "id": 33276 },    
            { "id": 65478 }
        ]
    },
]

Or a list of albums by a specific artist.

GET /artists/123/albums?fields=id,title&streamable=true&sort=release_date


200 OK

[
    {
        "id": 4321,
        "title": "Split the Atom"
    },
    {
        "id": 6344,
        "title": "Purpose"
    },            
    {
        "id": 7653,
        "title": "Outer Edges"
    }
]

Add an album.

POST /artists/123/albums

{
    "title": "Outer Edges Remixes"
}


201 Created

{
    "id": 9476
}

And more. You can read more about the requests and responses here.