DatoCMS Client
Provices access to data in a DatoCMS site.
Installation
The package can be installed
by adding datocms_client
to your list of dependencies in mix.exs
:
def deps do
[{:datocms_client, "~> 0.1.0"}]
end
Configuration
Via config.exs
Assuming your config/config.exs
includes environment-specific secrets files
excluded from your repo, put the following in {dev|production}.secrets.exs
:
config :datocms_client, :api_config,
%{headers: ["Authorization": "Bearer nnnnnnnnnnnnnnnnnnnnn"]}
Where nnnnnnnnnnnnnnnnnnnnn
should be replaced by either your read-write or
read-only DatoCMS API key.
If you are only reading data, you can use your read-only access token.
If you see timeout errors when downloading data, add the following:
config :datocms_client, :api_config,
%{
headers: ["Authorization": "Bearer nnnnnnnnnnnnnnnnnnnnn"],
options: [recv_timeout: :infinity]
}
Programmatically
Application.put_env(
:my_client,
:api_config,
%{
headers: ["Authorization": "Bearer nnnnnnnnnnnnnnnnnnnnn"],
options: [recv_timeout: :infinity]
}
)
Overview
DatoCMS.Client
This module contains a REST client for the datocms.com API. The code is
generated by the json_hyperschema_client_builder
.
The generated documentation can be found at https://hexdocs.pm/datocms_client.
DatoCMS
Provides access to the main data access functionality:
- start/1, start/2 - start the DatoCMS Repo process,
- load/0 - download all site data, internallize it and store it in the Repo,
- put/1 - overwrite the data in the Repo with the supplied values,
- all/0 - retrieve the data in the Repo,
- cache/0 - copy all Repo data to a file on disk,
- load_from_cache/0 - the data from the file on disk and store it in the Repo.
Calling load/0
downloads site.json
from the DatoCMS API plus all
(paginated) items.json
files.
DatoCMS.Repo
Internalized Data
All data is held in Elixir Map
structues with atom keys.
A site's data is stored internally as a keyword list
containing 3 data
structures:
:site
- general information about the site;:item_types_by_type
- the structure of each item type, keyed by the item type (atom);:items_by_type
- the data, grouped by item type, keyed by the item type (atom).
Data Structures
Internalized Item
{
id: "12345",
item_type: :post,
type: "item",
attributes: {
updated_at: "2017-01-01T13:29:49.359Z",
is_valid: true,
seo: {
image: {
alt: null,
path: "/11/1111111111-index.jpg",
size: 9525,
title: null,
width: 225,
format: "jpg",
height: 224
},
title: "SEO Title",
description: "SEO Description"
},
title: {
it: "Il titolo",
en: "The Title"
},
body: "Ciao",
category: "12346",
tags: ["12347"]
},
relationships: {
item_type: {
data: {
id: "123",
type: "item_type"
}
},
last_editor: {
data: {
id: "145",
type: "user"
}
}
}
}