README.md
# Ruby library for Dotloop API v2
[![Build Status](https://semaphoreci.com/api/v1/sampat-badhe/dotloop-ruby/branches/master/badge.svg)](https://semaphoreci.com/sampat-badhe/dotloop-ruby)
[![Test Coverage](https://api.codeclimate.com/v1/badges/a03408e2791211b8b816/test_coverage)](https://codeclimate.com/github/sampatbadhe/dotloop-ruby/test_coverage)
* [Homepage](https://www.dotloop.com)
* [API Documentation](https://dotloop.github.io/public-api)
* [Sign Up](https://www.dotloop.com/#/signup)
## Description
Provides a Ruby interface to [Dotloop](https://www.dotloop.com/). This library is designed to help ruby applications consume the DotLoop API v2.
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'dotloop-ruby'
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install dotloop-ruby
## Usage
### Setup
Register for your OAuth2 credentials by creating a client at https://www.dotloop.com/my/account/#/clients.
NOTE: You'll need at least `Account Access: Read` to use this strategy.
### Authentication
Dotloop uses OAuth2 for authentication (https://dotloop.github.io/public-api/#authentication).
```ruby
require 'dotloop-ruby'
dotloop_auth = Dotloop::Authenticate.new(
app_id: ENV['DOTLOOP_APP_ID'],
app_secret: ENV['DOTLOOP_APP_SECRET'],
application: 'dotloop'
)
dotloop_auth.url_for_authentication(callback_url, { redirect_on_deny: true })
# callback_url = The url that Dotloop will redirect the user to when the account is authenticated.
# It will return code on successfully authenticated.
code = params[:code]
access_and_refresh_token = dotloop_auth.acquire_access_and_refresh_token(code, { redirect_uri: callback_url })
{
"access_token": "0b043f2f-2abe-4c9d-844a-3eb008dcba67",
"token_type": "Bearer",
"refresh_token": "19bfda68-ca62-480c-9c62-2ba408458fc7",
"expires_in": 43145,
"scope": "account:read, profile:*, loop:*, contact:*, template:read"
}
# refresh access token - https://dotloop.github.io/public-api/#refreshing-access-token-after-expiration
response = dotloop_auth.refresh_access_token(refresh_token)
{
"access_token": "86609772-aa95-4071-ad7f-25ad2d0be295",
"token_type": "Bearer",
"refresh_token": "19bfda68-ca62-480c-9c62-2ba408458fc7",
"expires_in": 43199,
"scope": "account:read, profile:*, loop:*, contact:*, template:read"
}
# revoke access - https://dotloop.github.io/public-api/#access-revocation
dotloop_auth.revoke_access(access_token)
```
### Usage
**Initialize**
```ruby
require 'dotloop-ruby'
dotloop_client = Dotloop::Client.new(access_token: access_token)
```
**Account Details**
```ruby
#=> get account details
account = dotloop_client.account
```
**Profiles**
```ruby
#=> get list of profiles
profiles = dotloop_client.Profile.all
#=> get single profile
profile = dotloop_client.Profile.find(profile_id: '1234')
#=> get list of loops for profile
loops = dotloop_client.Profile.find(profile_id: '1234').loops
#=> create new loop in profile
loops = dotloop_client.Profile.find(profile_id: '1234').create(data)
data = {
"name": "Atturo Garay, 3059 Main, Chicago, IL 60614",
"status": "PRE_LISTING",
"transactionType": "LISTING_FOR_SALE"
}
#=> create new loop in profile using `loop-it`
loops = dotloop_client.Profile.find(profile_id: '1234').loop_it(data)
data = {
"name": "Brian Erwin",
"transactionType": "PURCHASE_OFFER",
"status": "PRE_OFFER",
"streetName": "Waterview Dr",
"streetNumber": "2100",
"unit": "12",
"city": "San Francisco",
"zipCode": "94114",
"state": "CA",
"country": "US",
"participants": [
{
"fullName": "Brian Erwin",
"email": "brianerwin@newkyhome.com",
"role": "BUYER"
},
{
"fullName": "Allen Agent",
"email": "allen.agent@gmail.com",
"role": "LISTING_AGENT"
},
{
"fullName": "Sean Seller",
"email": "sean.seller@yahoo.com",
"role": "SELLER"
}
],
"templateId": 1424,
"mlsPropertyId": "43FSB8",
"mlsId": "789",
"mlsAgentId": "123456789"
}
```
**Profile Loops**
```ruby
#=> get list of loops for profile
loops = dotloop_client.Loop.all(options)
options = {
profile_id: '1234',
*batch_number: 1,
*batch_size: 50
}
#=> get single loop
loop = dotloop_client.Loop.find(profile_id: 1234, loop_id: 34308)
#=> create new loop
loop = dotloop_client.Loop.create(profile_id: 1234, params: params)
params = {
"name": "Atturo Garay, 3059 Main, Chicago, IL 60614",
"status": "PRE_LISTING",
"transactionType": "LISTING_FOR_SALE"
}
#=> update loop
loop = dotloop_client.Loop.update(profile_id: 1234, loop_id: 34308, params: data)
OR
loop = dotloop_client.Loop.find(profile_id: 1234, loop_id: 34308).update(data: data)
data = {
"status": "SOLD"
}
```
**Loop Details**
```ruby
#=> get single loop details
loop_details = dotloop_client.Loop.detail(profile_id: 1234, loop_id: 34308)
OR
loop_details = dotloop_client.Loop.find(profile_id: 1234, loop_id: 34308).detail
#=> update single loop details
loop_details = dotloop_client.Loop.update_details(profile_id: 1234, loop_id: 34308, data: data)
OR
loop_details = dotloop_client.Loop.find(profile_id: 1234, loop_id: 34308).update_details(params: data)
data = {
# https://dotloop.github.io/public-api/#parameters-12
}
```
**Loop Folders**
```ruby
#=> get list of folders for loop
folders = dotloop_client.Folder.all(options)
options = {
profile_id: '1234',
loop_id: '34308'
}
#=> get single folder
folder = dotloop_client.Folder.find(profile_id: 1234, loop_id: 34308, folder_id: 423424)
#=> create new folder
folder = dotloop_client.Folder.create(profile_id: 1234 loop_id: 34308, params: params)
params = {
"name": "Disclosures"
}
#=> update folder
folder = dotloop_client.Folder.update(profile_id: 1234, loop_id: 34308, folder_id: 423424, params: data)
data = {
"name": "Disclosures (renamed)"
}
```
**Loop Documents**
```ruby
#=> get list of documents for folder
documents = dotloop_client.Document.all(options)
options = {
profile_id: '1234',
loop_id: '34308',
folder_id: '423424'
}
#=> get single document
document = dotloop_client.Document.find(
profile_id: '1234',
loop_id: '34308',
folder_id: '423424',
document_id: '561621'
)
#=> upload new document
document = dotloop_api.Document.upload(
profile_id: '1234',
loop_id: '34308',
folder_id: '423424',
params: { "file_name" => file_name, "file_content" => file_content }
)
#=> dowload a document - Retrieve an individual document (binary)
document = dotloop_api.Document.get(
profile_id: '1234',
loop_id: '34308',
folder_id: '423424',
document_id: '561621'
)
```
**Loop Participants**
```ruby
#=> get list of participants for loop
participants = dotloop_client.Participant.all(options)
options = {
profile_id: '1234',
loop_id: '34308'
}
#=> get single participant
participant = dotloop_client.Participant.find(
profile_id: '1234',
loop_id: '34308',
participant_id: '24743'
)
#=> create participant for loop
participant = dotloop_client.Participant.create(
profile_id: '1234',
loop_id: '34308',
params: params
)
params = {
"fullName": "Brian Erwin",
"email": "brian@gmail.com",
"role": "BUYER",
"Street Name": "123",
"Street Number": "Main St.",
"City": "Cincinnati",
"Zip/Postal Code": "45123",
"Country": "USA",
"Phone": "(555) 555-5555",
"Cell Phone": "(555) 555-4444",
"Company Name": "Buyer's Company"
}
#=> update participant
participant = dotloop_client.Participant.update(
profile_id: '1234',
loop_id: '34308',
participant_id: '24743',
params: params
)
params = {
"email": "brian@gmail.com"
}
#=> delete participant
participant = dotloop_client.Participant.delete(
profile_id: '1234',
loop_id: '34308',
participant_id: '24743'
)
```
**Loop Templates**
```ruby
#=> get list of loop templates for profile
loop_templates = dotloop_client.Loop.all(profile_id: '1234')
#=> get single loop template
loop = dotloop_client.Loop.find(profile_id: '1234', loop_template_id: '423')
```
**Loop Tasks**
```ruby
#=> get list of tasklists for loop
tasklists = dotloop_client.Tasklist.all(profile_id: '1234', loop_id: '34308')
#=> get single tasklist
tasklist = dotloop_client.Tasklist.find(
profile_id: '1234',
loop_id: '34308',
task_list_id: '12345'
)
#=> get list of task for loop
tasklists = dotloop_client.Task.all(
profile_id: '1234',
loop_id: '34308',
task_list_id: '12345'
)
#=> get single task
tasklist = dotloop_client.Task.find(
profile_id: '1234',
loop_id: '34308',
task_list_id: '12345'
task_id: '125736485'
)
```
**Contacts**
```ruby
#=> get list of contacts
contacts = dotloop_client.Contact.all(options)
options = {
*batch_number: 1,
*batch_size: 50
}
#=> get single contact
contact = dotloop_client.Contact.find(contact_id: '3603862')
#=> create new contact
contact = dotloop_client.Contact.create(params: params)
params = {
"firstName": "Brian",
"lastName": "Erwin",
"email": "brianerwin@newkyhome.com",
"home": "(415) 8936 332",
"office": "(415) 1213 656",
"fax": "(415) 8655 686",
"address": "2100 Waterview Dr",
"city": "San Francisco",
"zipCode": "94114",
"state": "CA",
"country": "US"
}
#=> update contact
contact = dotloop_client.Contact.update(
contact_id: '3603862',
params: params
)
params = {
"home": "(415) 888 8888"
}
#=> delete contact
dotloop_client.Contact.delete(contact_id: '3603862')
```
## Development
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/sampatbadhe/dotloop-ruby.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
## Statement
`dotloop-ruby` part of reference [Loft47/dotloop](https://github.com/Loft47/dotloop) project.