lib/doppelserver/base_server.rb in doppelserver-0.4.9 vs lib/doppelserver/base_server.rb in doppelserver-1.0.0

- old
+ new

@@ -1,155 +1,19 @@ require 'sinatra' -require 'sinatra/json' -# require File.expand_path '../../lib/doppelserver/base_server.rb', __FILE__ -require_relative 'data' +require 'doppelserver/data' +# Most of the BaseServer class is in the routes below: +require 'doppelserver/routes/control' +require 'doppelserver/routes/rest' module Doppelserver - ENFORCE_PLURALS = true - class BaseServer < Sinatra::Base - require 'active_support' # for singularization/pluralization - # - # Determines if - # word:: an input word - # is singular. - # Retutns truthy. - # - def singular?(word) - ActiveSupport::Inflector.singularize(word) == word - end - - # - # If ENFORCE_PLURALS is true (default == true) - # This enforces plural names for all collections - # and returns 403 otherwise. - # word:: collection name - # - def enforce_plural(word) - return unless ENFORCE_PLURALS - halt 403, 'only plural collection names allowed' if singular?(word) - end - - # # Hold all of the data internally in the @@data. # It's the Data class, which holds a hash of data and # another of next keys. (???) # configure do @@data = Data.new - end - - # - # All meta-operations should happen through a /control endpoint. - # - # Deletes the internal data by clearing the @@data hash. - # - delete '/control/data' do - @@data.clear - end - - # - # TODO:: Define this. - # Maybe make it a list of collections? - # Or all collections with all their data? - # - # For now, it returns a placeholder string. - # - get '/' do - 'here i am' # TODO: Change this. - end - - # - # Gets the data at: - # endpoint:: the collection - # id:: the instance identifier - # Or 404s when not found. - # - get '/:endpoint/:id' do - collection, id = params['endpoint'], params['id'] - enforce_plural(collection) - halt 404 unless @@data.collection?(collection) - result = @@data.get_value(collection, id) - halt 404 if result.nil? - json(result) - end - - # - # Returns the data at: - # endpoint:: collection name - # This is all of the data in that collection - # or 404 if no endpoint. - # - get '/:endpoint' do - collection = params[:endpoint] - enforce_plural(collection) - halt 404 unless @@data.collection?(collection) - json(@@data.get_collection(collection)) - end - - # - # No PUT, POST. - # Adds data to collection: - # endpoint:: is the name of the collection. - # If it doesn't exist, add new collection. - # If it does exist replaces (???) data. - # Also 403 on no data passed. - # - post '/:endpoint' do - request.body.rewind - collection = params['endpoint'] - enforce_plural(collection) - raw_data = request.body.read - halt 403, 'NO DATA' if raw_data.empty? - data = begin - JSON.parse(raw_data) - rescue - halt 403, "BAD DATA:\n#{raw_data}" - end - json(id: @@data.add(collection, data)) - end - - # - # No PUT, POST. - # Add data with the id to the collection. - # endpoint:: collection name - # id:: unique identifier for the data - # Adds a collection if doesn't exist. - # Adds id and data at it if id doesn't exist. - # Otherwise, replaces data. Unless no data, then 403. - # - post '/:endpoint/:id' do - request.body.rewind - collection, id = params['endpoint'], params['id'] - enforce_plural(collection) - halt 403 unless @@data.collection_key?(collection, id) - raw_data = request.body.read - halt 403, 'NO DATA' if raw_data.empty? - data = begin - JSON.parse(raw_data) - rescue - halt 403, "BAD DATA:\n#{raw_data}" - end - halt 403 unless @@data.update?(collection, id, data) - end - - # - # Delete the data from - # endpoint:: collection name - # id:: with unique identifier - # Or 404 if one of those isn't found. - # - delete '/:endpoint/:id' do - request.body.rewind - collection, id = params['endpoint'], params['id'] - enforce_plural(collection) - halt 404 unless @@data.collection?(collection) - if @@data.delete(collection, id) - status 200 - else - halt 404 - end end run! if app_file == $PROGRAM_NAME end end