Hey there, fellow developer! Ready to dive into the world of Loomly API integration? You're in for a treat. Loomly's API is a powerful tool that'll let you automate your social media workflow like a boss. In this guide, we'll walk through building a solid integration in Ruby. Let's get cracking!
Before we jump in, make sure you've got:
httparty
gem (we'll use this for API requests)First things first, let's set up our project:
mkdir loomly_integration cd loomly_integration bundle init
Now, open up your Gemfile and add:
gem 'httparty'
Run bundle install
, and we're good to go!
Loomly uses API keys for authentication. It's straightforward:
require 'httparty' class LoomlyClient include HTTParty base_uri 'https://api.loomly.com/v1' def initialize(api_key) @options = { headers: { "Authorization" => "Bearer #{api_key}" } } end end
Now that we're authenticated, let's make a basic request:
def get_calendars self.class.get('/calendars', @options) end
Easy peasy, right? This method will fetch all your Loomly calendars.
Let's add some more meat to our client:
def get_posts(calendar_id) self.class.get("/calendars/#{calendar_id}/posts", @options) end def create_post(calendar_id, post_data) self.class.post("/calendars/#{calendar_id}/posts", @options.merge(body: post_data)) end def update_post(calendar_id, post_id, post_data) self.class.patch("/calendars/#{calendar_id}/posts/#{post_id}", @options.merge(body: post_data)) end
Loomly's API is pretty good about returning meaningful error messages. Let's add some basic error handling:
def handle_response(response) case response.code when 200..299 response when 400..499 raise "Client error: #{response.code} - #{response.message}" when 500..599 raise "Server error: #{response.code} - #{response.message}" else raise "Unknown error: #{response.code} - #{response.message}" end end
Now, wrap your API calls with this method:
def get_calendars handle_response(self.class.get('/calendars', @options)) end
Loomly has rate limits, so let's be good citizens and handle them:
def handle_response(response) if response.headers['X-RateLimit-Remaining'].to_i == 0 sleep_time = response.headers['X-RateLimit-Reset'].to_i - Time.now.to_i sleep(sleep_time) if sleep_time > 0 end # ... rest of the error handling end
Loomly uses cursor-based pagination. Here's how to handle it:
def get_all_posts(calendar_id) posts = [] cursor = nil loop do response = get_posts(calendar_id, cursor) posts += response['data'] cursor = response['meta']['next_cursor'] break if cursor.nil? end posts end def get_posts(calendar_id, cursor = nil) options = @options.dup options[:query] = { cursor: cursor } if cursor handle_response(self.class.get("/calendars/#{calendar_id}/posts", options)) end
Now that we've got the basics down, let's add some advanced features:
def schedule_post(calendar_id, post_data) post_data[:scheduled_at] = (Time.now + 3600).iso8601 # Schedule for 1 hour from now create_post(calendar_id, post_data) end def upload_asset(calendar_id, file_path) file = File.new(file_path) options = @options.merge( body: { file: file } ) handle_response(self.class.post("/calendars/#{calendar_id}/assets", options)) end
Don't forget to test your integration! Here's a simple RSpec example:
require 'rspec' require_relative 'loomly_client' RSpec.describe LoomlyClient do let(:client) { LoomlyClient.new('your_api_key') } it 'fetches calendars successfully' do VCR.use_cassette('calendars') do response = client.get_calendars expect(response.code).to eq(200) expect(response.parsed_response).to have_key('data') end end end
To keep your integration running smoothly:
And there you have it! You've just built a robust Loomly API integration in Ruby. From here, you can expand on this foundation to create even more powerful automations for your social media workflow. Remember, the key to a great integration is understanding the API docs and writing clean, maintainable code.
Now go forth and automate all the things! Happy coding! 🚀