# cbgithub
[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors)
[![Master Branch Build Status](https://img.shields.io/travis/coldbox-modules/cbgithub/master.svg?style=flat-square&label=master)](https://travis-ci.org/coldbox-modules/cbgithub)
## A CFML Wrapper around the GitHub API optimized for ColdBox
## Getting Started
### Access Security
There are two ways of providing secure access to your GitHub repository: Username and password or `Personal Access Token`. If both are provided, the Personal Access Token is used.
#### Username and Password
You should already have these details from when you setup your GitHub account.
#### Personal Access Token
A Personal Access Token is generated from within your GitHub Account online.
First [sign in to your GitHub Account](https://github.com/login) using your username or email address and password. Then, from your account (top right dropdown), select `Settings` then `Personal access token` under `Developer settings`. Select `Generate new token` and provide a `Token description` such as `cbgithub`. Choose the `Select scopes` that are appropriate for the access you need to this GitHub account. If you want to create, update or delete content you will have to have enable `public_repo` as a minimum. Make a note of the new personal access token generated.
#### Configuring cbgithub Security
Now you need to take either your GitHub `username` and `password` or the `personal access token` you've just created and add them to your ColdBox Module settings in `config/Coldbox.cfc`. Take a look at [Retrieving Module Settings](https://coldbox.ortusbooks.com/content/full/modules/retrieving_&_interacting_with_module_settings/) for more information.
Populate your `config/Coldbox.cfc` like this if you want to use your username and password...
```
moduleSettings = {
cbgithub = {
"username" = "myUserName",
"password" = "myPassword"
}
};
```
...or like this if you want to use your personal access token...
```
moduleSettings = {
cbgithub = {
"token" = "myPersonalToken"
}
};
```
**Remember**: Don't commit these details to a publicly accessible GitHub repository otherwise your account could be compromised!
## Contents Endpoint
GitHub offers a set of endpoints that provide [access to the contents of files](https://developer.github.com/v3/repos/contents/) in the repository. These include the ability to read the README file and any other file. Also it's possible to create, update and delete any file in the repository.
### getReadme( owner, repo, ref, encoding )
I return a `Content` object populated with information about the `README` file. Calling the `getContent()` method on the `Content` object will decode the raw `base64` string.
#### Example
```
property name="ContentService" inject="ContentService@cbgithub";
...
readme = ContentService.getReadme( owner="elpete", repo="cbgithub", ref="master", encoding="utf-8" );
```
#### Arguments
Argument | Description
-------- | -----------
`owner` (required, string) | Name of the GitHub account
`repo` (required, string) | Name of the repository of the `owner`
`ref` (optional, string="master") | Name of the branch, tag or commit to read from
`encoding` (optional, string="utf-8") | Type of file encoding
#### Response
Property |
Type |
Value |
content |
string |
IyBjYmdpdGh1YgoKWyFbTWFzdGVyIEJyYW5jaCBCdWlsZCBTdGF0dXNdKGh0
dHBzOi8vaW1nLnNoaWVsZHMuaW8vdHJhdmlzL2VscGV0ZS9jYmdpdGh1Yi9t
YXN0ZXIuc3ZnP3N0eWxlPWZsYXQtc3F1YXJlJmxhYmVsPW1hc3RlcildKGh0
dHBzOi8vdHJhdmlzLWNpLm9yZy9lbHBldGUvY2JnaXRodWIpCgoKIyMgQSBD
Rk1MIFdyYXBwZXIgYXJvdW5kIHRoZSBHaXRIdWIgQVBJIG9wdGltaXplZCBm
b3IgQ29sZEJveAoKIyMgVGVzdGluZwoKVG8gcnVuIHRoZSB0ZXN0cywgZmly
c3QgY29weSB0aGUgYC5lbnYuZXhhbXBsZWAgZmlsZSB0byBgLmVudmAgYW5k
IGZpbGwgb3V0IHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzLiAgVGhpcyBpcyB1
c2VkIHRvIHRlc3QgYWdhaW5zdCB0aGUgYWN0dWFsIEdpdEh1YiBhcGkgd2l0
aG91dCBwZXJzaXN0aW5nIGFueSBjaGFuZ2VzLiAgQWRkaXRpb25hbGx5LCBz
b21lIG9mIHRoZSB0ZXN0cyByZXF1aXJlIDItZmFjdG9yIGF1dGhlbnRpY2F0
aW9uIHRvIGJlIHR1cm5lZCBvZmYuIChEb24ndCB3b3JyeSwgd2UgZnVsbHkg
c3VwcG9ydCAyLWZhY3RvciBhdXRoZW50aWNhdGlvbiEp
|
_links |
struct |
Property |
Type |
Value |
html |
string |
https://github.com/elpete/cbgithub/blob/master/README.md |
self |
string |
https://api.github.com/repos/elpete/cbgithub/contents/README.md?ref=master
|
git |
string |
https://api.github.com/repos/elpete/cbgithub/git/blobs/6b029017cb3349add550d491729e435d7cafa7d3
|
|
html_url |
string |
https://github.com/elpete/cbgithub/blob/master/README.md |
sha |
string |
6b029017cb3349add550d491729e435d7cafa7d3 |
path |
string |
README.md |
url |
string |
https://api.github.com/repos/elpete/cbgithub/contents/README.md?ref=master
|
size |
number |
573 |
name |
string |
README.md |
submodule_git_url |
string |
|
type |
string |
file |
git_url |
string |
https://api.github.com/repos/elpete/cbgithub/git/blobs/6b029017cb3349add550d491729e435d7cafa7d3
|
download_url |
string |
https://raw.githubusercontent.com/elpete/cbgithub/master/README.md
|
encoding |
string |
base64 |
mimetype |
string |
text/plain |
### read( owner, repo, path, ref, encoding )
I return a `Content` object populated with information about the requested file. Calling the `getContent()` method on the `Content` object will decode the raw `base64` string if it is has the mime type of text/plain.
#### Example
```
property name="ContentService" inject="ContentService@cbgithub";
...
file = ContentService.read( owner="elpete", repo="cbgithub", path="models/Content.cfc", ref="master", encoding="utf-8" );
```
#### Arguments
Argument | Description
-------- | -----------
`owner` (required, string) | Name of the GitHub account
`repo` (required, string) | Name of the repository of the `owner`
`path` (required, string) | File pathname of the file to retrieve
`ref` (optional, string="master") | Name of the branch, tag or commit to read from
`encoding` (optional, string="utf-8") | Type of file encoding
#### Response
Property |
Type |
Value |
content |
string |
JyYW5jaCBCdWlsZCBTdGF0dXNdKGh0IyBjYmdpdGh1YgoKWyFbTWFzdGVyIE
YXN0ZXIuc3ZnP3N0eWxlPWZsYXQtc3F1YXJlJmxhYmVsPW1hc3RlcildKGh0
dHBzOi8vdHJhdmlzLWNpLm9yZy9lbHBldGUvY2JnaXRodWIpCgoKIyMgQSBD
aG91dCBwZXJzaXN0aW5nIGFueSBjaGFuZ2VzLiAgQWRkaXRpb25hbGx5LCBz
Rk1MIFdyYXBwZXIgYXJvdW5kIHRoZSBHaXRIdWIgQVBJIG9wdGltaXplZCBm
dHBzOi8vaW1nLnNoaWVsZHMuaW8vdHJhdmlzL2VscGV0ZS9jYmdpdGh1Yi9t
c3QgY29weSB0aGUgYC5lbnYuZXhhbXBsZWAgZmlsZSB0byBgLmVudmAgYW5k
b3IgQ29sZEJveAoKIyMgVGVzdGluZwoKVG8gcnVuIHRoZSB0ZXN0cywgZmly
IGZpbGwgb3V0IHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzLiAgVGhpcyBpcyB1
c2VkIHRvIHRlc3QgYWdhaW5zdCB0aGUgYWN0dWFsIEdpdEh1YiBhcGkgd2l0
aW9uIHRvIGJlIHR1cm5lZCBvZmYuIChEb24ndCB3b3JyeSwgd2UgZnVsbHkg
b21lIG9mIHRoZSB0ZXN0cyByZXF1aXJlIDItZmFjdG9yIGF1dGhlbnRpY2F0
XRoZW50aWNhdGlvbiEpc3VwcG9ydCAyLWZhY3RvciBhd
|
_links |
struct |
Property |
Type |
Value |
html |
string |
https://github.com/elpete/cbgithub/blob/master/models/Content.cfc
|
self |
string |
https://api.github.com/repos/elpete/cbgithub/contents/models/Content.cfc?ref=master
|
git |
string |
https://api.github.com/repos/elpete/cbgithub/git/blobs/8d1a3dd6c0c4ae7de4bb4f9cbaf2e4b54fda3fa6
|
|
html_url |
string |
https://github.com/elpete/cbgithub/blob/master/models/Content.cfc |
sha |
string |
8d1a3dd6c0c4ae7de4bb4f9cbaf2e4b54fda3fa6 |
path |
string |
models/Content.cfc |
url |
string |
https://api.github.com/repos/elpete/cbgithub/contents/models/Content.cfc?ref=master
|
size |
number |
2335 |
name |
string |
Content.cfc |
submodule_git_url |
string |
|
type |
string |
file |
git_url |
string |
https://api.github.com/repos/elpete/cbgithub/git/blobs/8d1a3dd6c0c4ae7de4bb4f9cbaf2e4b54fda3fa6
|
download_url |
string |
https://raw.githubusercontent.com/elpete/cbgithub/master/models/Content.cfc
|
encoding |
string |
base64 |
mimetype |
string |
text/plain |
## Testing
To run the tests, first copy the `.env.example` file to `.env` and fill out the required properties. This is used to test against the actual GitHub api without persisting any changes. Additionally, some of the tests require 2-factor authentication to be turned off. (Don't worry, we fully support 2-factor authentication!)
## Compatibility
This project has been tested against Adobe ColdFusion 11+ and Lucee 4.5+ servers.
## Contributors
Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):
| [
Eric Peterson](https://github.com/elpete)
[💬](#question-elpete "Answering Questions") [💻](https://github.com/elpete/cbgithub/commits?author=elpete "Code") [📖](https://github.com/elpete/cbgithub/commits?author=elpete "Documentation") [⚠️](https://github.com/elpete/cbgithub/commits?author=elpete "Tests") | [
Richard Herbert](https://twitter.com/richardherbert)
[💻](https://github.com/elpete/cbgithub/commits?author=richardherbert "Code") [📖](https://github.com/elpete/cbgithub/commits?author=richardherbert "Documentation") [⚠️](https://github.com/elpete/cbgithub/commits?author=richardherbert "Tests") |
| :---: | :---: |
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!