README.md
# Coal
[![Code Climate](https://codeclimate.com/github/locomotivecms/coal/badges/gpa.svg)](https://codeclimate.com/github/locomotivecms/coal) [![Build Status](https://travis-ci.org/locomotivecms/coal.svg?branch=master)](https://travis-ci.org/locomotivecms/coal) [![Coverage Status](https://coveralls.io/repos/github/locomotivecms/coal/badge.svg?branch=master)](https://coveralls.io/github/locomotivecms/coal?branch=master)
The Ruby API Client for LocomotiveCMS V4.
## Table of Contents
- [Installation](#installation)
- [Usage](#usage)
- [Authentication](#authentication)
- [Resources](#resources)
- [MyAccount](#my-account)
- [Accounts](#accounts)
- [Sites](#sites)
- [Pages](#pages)
- [Content Types](#content-types)
- [Content Entries](#content-entries)
- [Snippets](#snippets)
- [Sections](#sections)
- [Theme Assets](#theme-assets)
- [Content Assets](#content-assets)
- [Translations](#translations)
- [Memberships](#memberships)
- [What is missing](#todo)
- [Contributing](#contributing)
- [How to write specs](#how-to-write-specs)
- [Credits](#credits)
- [License](#license)
## Installation
gem install locomotivecms_coal
## Usage
First, load the gem:
require 'locomotive/coal'
### Authentication
client = Locomotive::Coal::Client.new('http://www.myengine.dev', { email: <EMAIL>, api_key: <API KEY> })
You can get the version of the remote running Engine by calling the following method:
client.engine_version
*Note:* Coal supports Engine version **~> 3.0.x**. However, if you do need to request an Engine running a 2.5.x version, use following code instead:
client = Locomotive::Coal::ClientV2.new('http://www.myengine.dev', { email: <EMAIL>, api_key: <API KEY> })
We do not garantee that all the API resources will work with the V2 Client but PRs are accepted of course.
### Resources
#### MyAccount
**Get the name of the logged in account**
my_account = client.my_account.get
puts my_account.name + " / " + my_account.email
**If not logged in, then it's possible to create your account**
client = Locomotive::Coal::Client.new('http://www.myengine.dev')
client.my_account.create(name: 'John Doe', email: 'john@doe.net', password: 'easyone', password_confirmation: 'easyone')
**Update my account**
client.my_account.update(name: 'Jane Doe')
#### Accounts
**Only available for super administrators in the LocomotiveCMS engine**
**Create**
new_customer = client.accounts.create(name: 'John', email: 'johnn@doe.net', password: 'easyone', password_confirmation: 'easyone')
puts new_customer.name + " / " + my_account.email
**Update an account**
client.accounts.update(new_customer._id, name: 'Jane')
#### Sites
**Get all my sites**
my_sites = client.sites.all
puts "I've got #{my_sites.size}"
**Create a new site**
my_site = client.sites.create(name: 'Acme', handle: 'acme', locales: ['en'], timezone: 'UTC')
**Destroy a site**
my_site = client.sites.destroy(my_site._id)
#### Pages
*Note:* We first need to log in to the site. It can be done by calling the scope_by method of the client instance.
site = client.sites.by_handle('acme')
site_client = client.scope_by(site)
Or, in a shorter way:
site_client = client.scope_by('acme')
For the **V2 Client**, that would be this instead:
site = client.sites.by_subdomain('acme')
**Get the list of pages in English**
pages = site_client.pages.all(:en)
**Get only the id/fullpath attributes**
pages = site_client.pages.fullpaths(:en)
It is required when we need the id of an existing page according to its fullpath.
**Create a page**
page = site_client.pages.create(title: 'About us', slug: 'about-us', parent: 'index', template: 'Locomotive rocks!')
**Update a page in French**
site_client.pages.update(page._id, { template: 'Locomotive est trop fort!!!' }, :fr)
**Destroy a page**
site_client.pages.destroy(page._id)
#### Content Types
**Get a content type by its slug**
*Note:* We first need to log in to the site the content type belongs to. It can be done by calling the scope_by method of the client instance.
site = client.sites.by_subdomain('acme')
site_client = client.scope_by(site)
content_type = site_client.contents.projects
#### Content Entries
**Get the first 10 entries filtered by a property (published)**
articles = site_client.contents.articles.all({ published: true })
**Loop over all the content entries**
page = 1
while page do
articles = site_client.contents.articles.all({ published: true }, page: page)
articles.each { |article| puts article.title }
page = articles._next_page
end
*Note:* You can also use the following syntax
content_type = site_client.contents.by_slug('projects')
articles = site_client.content_entries(content_type).all
**Create a content entry**
first_article = site_client.contents.articles.create(title: 'Hello world')
**Update a content entry**
article = site_client.contents.articles.all.first
site_client.contents.articles.update(article._id, { title: 'Hello world'})
**Update a content entry in a different locale**
# create the article in the default locale
article = site_client.contents.articles.create(title: 'Hello world')
# then update the title in another locale
site_client.contents.articles.update(article._id, { title: 'Bonjour le monde'}, :fr)
**Destroy a content entry**
site_client.contents.articles.destroy(article._id)
#### Snippets
**Get the list of snippets**
snippets = site_client.snippets.all
To get the snippets in the FR locale:
snippets_in_french = site_client.snippets.all('fr')
**Create a snippet**
snippet = site_client.snippets.create(name: 'Header', slug: 'header', template: 'Locomotive rocks!')
# create a snippet in different locales
snippet = site_client.snippets.create(name: 'Header', slug: 'header', template: { en: 'Locomotive rocks!', fr: 'Locomotive déchire !' })
**Update a snippet**
site_client.snippets.update('header', template: 'Locomotive rocks!!!')
**Destroy a snippet**
site_client.snippets.destroy('header')
#### Sections
**Get the list of sections**
sections = site_client.sections.all
**Create a section**
snippet = site_client.sections.create(name: 'Header', slug: 'header', template: 'Locomotive rocks!', settings: [{ id: 'title', type: 'string' }])
**Update a section**
site_client.sections.update('header', template: 'Locomotive rocks!!!')
**Destroy a section**
site_client.sections.destroy('header')
#### Theme assets
**Get the list of theme assets**
assets = site_client.theme_assets.all
**Create a theme asset**
asset = site_client.theme_assets.create(source: Locomotive::Coal::UploadIO.new('<local path of my image>'), folder: 'images/header')
**Update a theme asset**
site_client.theme_assets.update(asset._id, source: Locomotive::Coal::UploadIO.new('<local path of my new image>'))
**Destroy a theme asset**
site_client.theme_assets.destroy(asset._id)
#### Content assets
**Get the list of content assets**
assets = site_client.content_assets.all
**Create a content asset**
asset = site_client.content_assets.create(source: Locomotive::Coal::UploadIO.new('<local path of my image>'))
**Update a content asset**
site_client.content_assets.update(asset._id, source: Locomotive::Coal::UploadIO.new('<local path of my new image>'))
**Destroy a content asset**
site_client.content_assets.destroy(asset._id)
#### Translations
**Get the list of translations**
translations = site_client.translations.all
**Create a translation**
translation = site_client.translations.create(key: 'hello_world', values: { en: 'Hello world!', fr: 'Bonjour monde' })
**Update a translation**
site_client.translations.update(translation._id, values: { en: 'Hello world!!!', fr: 'Bonjour monde !!!'} ))
**Destroy a translation**
site_client.translations.destroy(translation._id)
#### Memberships
**Get the list of memberships**
memberships = site_client.memberships.all
**Create a membership**
membership = site_client.memberships.create(role: 'author', account_email: 'nic@example.com')
**Update a membership**
site_client.memberships.update(membership._id, role: 'designer')
**Destroy a membership**
site_client.memberships.destroy(membership._id)
## What is missing?
We only implemented a few resources (my_account, sites, content types, memberships and content entries) and for some of them, not all the actions have been implemented.
Check the issues section of the repository to see what is missing.
## Contributing
1. Fork it ( http://github.com/<my-github-username>/locomotivecms/coal )
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request
## How to write specs
**Engine configuration:**
1. You need to run the last version (master branch) of the [Locomotive engine](https://github.com/locomotivecms/engine).
2. Pick a different database name to run your Coal specs against.
3. Run ````bundle exec rake development:bootstrap````
4. Run the Locomotive server ````bundle exec rails server````
**System configuration:**
- edit your /etc/hosts file (*NIX systems) and add 2 lines
127.0.0.0 www.example.com acme.example.com
## Credits
[Christian](https://github.com/cblavier), [Greg](https://github.com/gregKawet) and [Ben](https://github.com/stiiig) from the Cogip/Insert International LTD who brainstormed with me (a very long time) to find this awesome name.
## License
Copyright (c) 2020 NoCoffee. MIT Licensed, see LICENSE for details.