FabienHenon/jsonapi/2.0.0

NOTE: the latest version is 2.3.1

JsonApi.Resource

JsonApi.Resource exposes the Resource type and functions to get and set information for your resources.

Type

type alias Resource =
ResourceInfo

The Resource represents a resource. It is passed to your resource decoders, but you can also use it to encode resources to json api, via a Document. It contains useful information for decoding and encoding your resource: resource id, links, attributes, relationships, ...

Example of json api resource:

{
    "data": [
        {
            "type": "users",
            "id": "13608770-76dd-47e5-a1c4-4d0d9c2483ad",
            "links": {
                "self": "http://link-to-user",
                "profile": "http://link-to-user-profile"
            },
            "attributes": {
                "firstname": "John",
                "lastname": "Doe",
                "gender": "male"
            },
            "relationships": {}
        }
    ]
}

And how to build it with the JsonApi.Resource module:

build "users"
    |> withId "13608770-76dd-47e5-a1c4-4d0d9c2483ad"
    |> withLinks
        (Dict.fromList
            [ ( "self", "http://link-to-user" )
            , ( "profile", "http://link-to-user-profile" )
            ]
        )
    |> withAttributes
        [ ( "firstname", string "John" )
        , ( "lastname", string "Doe" )
        , ( "gender", string "male" )
        ]
OneOrManyRelationships

This type is used to represent either or or many relationships in your Resource object.

See withRelationship function for more information

New resource

build : String -> Resource

Builds a new Resource with the specified type name

You can build your resources like this:

myResource : Post -> Resource
myResource post =
    build "posts"
        |> withId "post-1"
        |> withLinks (Dict.fromList [ ( "self", "http://url-to-post/1" ) ])
fromResource : String -> Resource -> Resource

Builds a new Resource from the specified Resource and with the specified type name

You can build your resources like this:

myResource : Resource -> Resource
myResource resource =
    fromResource "posts" resource

Getter functions

id : Resource -> String

Returns the id of your resource.

From the json example above, id will return 13608770-76dd-47e5-a1c4-4d0d9c2483ad

Setter functions

withId : String -> Resource -> Resource

Sets the id of the Resource object

myResource : Post -> Resource
myResource post =
    build "posts"
        |> withId "post-1"
withAttributes : List ( String, Value ) -> Resource -> Resource

Sets the attributes of the Resource object. This is the payload of your resource.

myResource : Post -> Resource
myResource post =
    build "posts"
        |> withAttributes
            [ ( "firstname", string "John" )
            , ( "lastname", string "Doe" )
            , ( "gender", string "male" )
            ]
withRelationship : String -> OneOrManyRelationships -> Resource -> Resource

Adds a relationship in the Resource object. You have to pass it the name of the relationship and a description of the relationship resource (See relationship and relationships)

myResource : Post -> Resource
myResource post =
    build "posts"
        |> withRelationship "creators" (relationship creator.id (creatorResource creator))

Relationships

relationship : String -> Resource -> OneOrManyRelationships

Defines a relationship that can then be added to its parent Resource. It takes the id of the resource and the resource.

creatorResource : Creator -> Resource
creatorResource creator =
    build "creator"
        |> withAttributes [ ( "firstname", string creator.firstname ) ]


myResource : Post -> Resource
myResource post =
    build "posts"
        |> withRelationship "creators" (relationship creator.id (creatorResource creator))
relationships : List ( String, Resource ) -> OneOrManyRelationships

Defines a list of relationships that can then be added to a parent Resource. It takes a List of Tuples with the id of the resource and the resource.

commentResource : Comment -> Resource
commentResource comment =
    build "comment"
        |> withAttributes [ ( "content", string comment.content ) ]


myResource : Post -> Resource
myResource post =
    build "posts"
        |> withRelationship "comments" (relationships (List.map (\comment -> ( "comment", commentResource comment )) comments))