class IronHide::CouchDbTasks

Public Instance Methods

install_tasks() click to toggle source
# File lib/iron_hide/couchdb_tasks.rb, line 9
def install_tasks
  namespace :iron_hide do
    # Interface to load some local JSON files to a remote CouchDB server
    #
    # Usage:
    #   bundle exec rake load_rules\['/absolute/path/file.json','http://127.0.0.1:5984/rules'\]
    #
    desc 'Load rules from local JSON file to remote CouchDB server'
    task :load_rules, :file, :db_server do |t, args|
      db    = args[:db_server]
      rules = MultiJson.load(File.open(args[:file]).read)

      # Use the bulk document API
      # See: https://wiki.apache.org/couchdb/HTTP_Bulk_Document_API
      response = Typhoeus.post("#{db}/_bulk_docs",
        body: MultiJson.dump(docs: rules), headers: { "Content-Type" => "application/json" })

      puts "Status: #{response.response_code}\nBody: #{response.body}"
    end

    # Interface to create a CouchDB database if one doesn't exist
    #
    # Usage:
    #   bundle exec rake create_db\['http://127.0.0.1:5984/rules'\]
    #
    desc 'Create a database'
    task :create_db, :db do |t, args|
      CouchRest.database!(args[:db])
    end

    # Interface to create required views on CouchDB server.
    #
    # Usage:
    #   bundle exec rake create_views\['http://127.0.0.1:5984/rules'\]
    #
    desc 'Create a map-reduce view on a CouchDB server to find rules by namespace and resource'
    task :create_views, :db_server do |t, args|
      db       = args[:db_server]
      function = "function(doc) {" \
                "  doc.action.forEach(function(e) {" \
                "    if(e && doc.resource){" \
                "      emit(doc.resource + '::' + e, doc);" \
                "    }" \
                "  })" \
                "};"

      document = {
        "_id" => "_design/rules",
        "views" => {
          "resource_rules" => {
            "map" => function
          }
        }
      }
      response = Typhoeus.post(db,
        body: MultiJson.dump(document), headers: { "Content-Type" => "application/json"} )
      puts "Status: #{response.response_code}\nBody: #{response.body}"
    end
  end
end