From 2c60a34cbe95d34950977e59d9316a1885b4fd6f Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Tue, 8 Mar 2016 05:06:34 -0500 Subject: reorganize api --- src/guff/api-methods.cr | 591 ------------------------------------------------ 1 file changed, 591 deletions(-) delete mode 100644 src/guff/api-methods.cr (limited to 'src/guff/api-methods.cr') diff --git a/src/guff/api-methods.cr b/src/guff/api-methods.cr deleted file mode 100644 index 334be88..0000000 --- a/src/guff/api-methods.cr +++ /dev/null @@ -1,591 +0,0 @@ -require "json" -require "./handler" - -module Guff - module APIMethods - API = { - "post": { - "get_posts": { - text: "Get posts matching query.", - - args: { - "q": { - text: "Search string.", - type: :text, - required: false, - default: "", - }, - - "page": { - text: "Page number", - type: :int, - required: false, - default: "1", - }, - - "tags": { - text: "Comma-separated list of tags (union)", - # type: :tag_list, - type: :json, - required: false, - default: "", - }, - - "sort": { - text: "Sort order of results", - type: :sort, - required: false, - default: "date,desc", - }, - - "cols": { - text: "Column list", - type: :text, - required: false, - }, - }, - }, - - "add_post": { - text: "Create new post.", - args: { - "name": { - text: "Post title.", - type: :text, - required: true, - }, - - "slug": { - text: "Post slug.", - type: :slug, - required: true, - }, - - "body": { - text: "Post body.", - type: :text, - required: true, - }, - - "tags": { - text: "Post tags.", - # type: :tag_list, - type: :json, - required: false, - default: "", - }, - }, - }, - - "update_post": { - text: "Update existing post.", - args: { - "name": { - text: "Post title.", - type: :text, - required: false, - }, - - "slug": { - text: "Post slug.", - type: :slug, - required: false, - }, - - "body": { - text: "Post body.", - type: :text, - required: false, - }, - - "tags": { - text: "Post tags.", - type: :json, - required: false, - }, - - "posted": { - text: "Is this post posted?", - type: :bool, - required: false, - }, - }, - }, - - "remove_posts": { - text: "Remove existing posts.", - - args: { - "post_ids": { - text: "Post IDs.", - type: :int_list, - required: false, - default: "", - }, - - "tags": { - text: "Post tags.", - # type: :tag_list, - type: :json, - required: false, - default: "", - }, - }, - }, - - "set_tags": { - text: "Set tags for posts.", - - args: { - "post_ids": { - text: "Post IDs.", - type: :int_list, - required: true, - }, - }, - }, - }, - - "dir": { - "add": { - text: "Create new directory", - - args: { - "path": { - text: "Path to new directory", - type: :path, - required: true, - }, - }, - }, - - "remove": { - text: "Remove directory", - - args: { - "path": { - text: "Path to existing directory", - type: :path, - required: true, - }, - }, - }, - }, - - "file": { - "add": { - text: "Upload new file", - - args: { - "path": { - text: "Destination file path", - type: :path, - required: true, - }, - }, - }, - - "remove": { - text: "Remove existing file", - - args: { - "path": { - text: "Destination file path", - type: :path, - required: true, - }, - }, - }, - }, - - "tag": { - "get_tags": { - text: "Get list of tags", - }, - - "remove_tags": { - text: "Remove set of tags", - - args: { - "tags": { - text: "Tags to remove.", - # type: :tag_list, - type: :json, - required: false, - default: "", - }, - }, - }, - }, - - "site": { - "add_site": { - text: "Create a new site", - - args: { - "name": { - text: "Name of this site", - type: :text, - required: true, - }, - - "default": { - text: "Is this the default site?", - type: :bool, - required: false, - default: "f", - }, - - "domains": { - text: "Array of domain matches.", - type: :domain_list, - required: true, - }, - }, - }, - - "remove_sites": { - text: "Remove one or more existing sites", - - args: { - "site_ids": { - text: "IDs of sites to remove", - type: :int_list, - required: true, - }, - }, - }, - - "set_default": { - text: "Set new default site", - - args: { - "site_id": { - text: "ID of new default site", - type: :int, - required: true, - }, - }, - }, - - "set_domains": { - text: "Set domains for given site", - - args: { - "site_id": { - text: "ID of site", - type: :int, - required: true, - }, - - "domains": { - text: "Domains for this site.", - type: :domain_list, - required: true, - }, - }, - }, - }, - - "test": { - "version": { - text: "Get version", - }, - - "get_posts": { - text: "Test get posts", - }, - - "error": { - text: "Test error response", - }, - } - } - - TYPE_CHECKS = { - text: /.*/, - slug: /^[a-z0-9\.-]+$/, - int: /^\d+$/, - int_list: /^\d+(?:,\d+)*$/, - sort: /^[a-z0-9_]+,(?:asc|desc)$/, - - # FIXME: lock these down more - json: /.*/, - path: /^[^\/].*[^\/]$/, - } - - private def get_method_args( - params : HTTP::Params, - namespace : String, - method : String - ) - return {} of String => String unless ( - API[namespace]? && - API[namespace][method] && - API[namespace][method][:args]? - ) - - # get method args - args = API[namespace][method][:args] as \ - Hash(String, Hash(Symbol, String | Symbol | Bool)) - - args.keys.reduce({} of String => String) do |r, arg_name| - arg_data = args[arg_name] as Hash(Symbol, String|Symbol|Bool) - - # check for required parameter - if arg_data[:required] && !params.has_key?(arg_name) - raise "missing required parameter: %s" % [arg_name] - end - - # get value - val = if arg_data[:required] - params.fetch(arg_name) - # elsif arg_data.has_key?(:default) - elsif arg_data[:default]? - params.fetch(arg_name, arg_data[:default] as String) - else - nil - end - - if val - # check value - if !TYPE_CHECKS[arg_data[:type]].match(val) - raise "invalid parameter format: %s" % [arg_name] - end - - # add value to result - r[arg_name] = val - end - - # return result - r - end - end - - ################ - # post methods # - ################ - - NO_TAGS = [] of Array(String) - - private def do_post_get_posts( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - @models.post.get_posts( - site_id: get_site(context), - q: args["q"]? || "", - tags: get_posts_tags(args["tags"]), - page: args.has_key?("page") ? args["page"].to_i : 1, - ).to_json - end - - private def do_post_add_post( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - post_id = @models.post.add_post( - site_id: get_site(context), - slug: args["slug"], - name: args["name"], - body: args["body"], - tags: get_tags(args["tags"]?), - ) - - # return json - { post_id: post_id }.to_json - end - - private def do_post_update_post( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - post_id = @models.post.update_post( - site_id: get_site(context), - post_id: args["post_id"].to_i, - slug: args["slug"]?, - name: args["name"], - body: args["body"], - tags: args.has_key?("tags") ? get_tags(args["tags"]?) : nil, - posted: args["posted"]?, - ) - - # return json - { ok: true }.to_json - end - - private def do_post_remove_posts( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - @models.post.remove_posts( - site_id: get_site(context), - post_ids: args["post_ids"].split(',').map { |post_id| - post_id.to_s.to_i - }, - ) - - { ok: true }.to_json - end - - private def do_post_set_tags( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - @models.post.set_tags( - site_id: get_site(context), - post_id: (args["post_id"] as String).to_i, - tags: get_tags(args["tags"]?), - ) - - { ok: true}.to_json - end - - ############### - # dir methods # - ############### - - private def do_dir_add( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - # TODO - {ok: true}.to_json - end - - private def do_dir_remove( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - # TODO - {ok: true}.to_json - end - - ################ - # file methods # - ################ - - private def do_file_add( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - # TODO - {ok: true}.to_json - end - - private def do_file_remove( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - # TODO - {ok: true}.to_json - end - - ############### - # tag methods # - ############### - - private def do_tag_get_tags( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - [{foo: "bar"}, {foo: "asdf"}].to_json - end - - private def do_tag_remove_tags( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - true.to_json - end - - ################ - # site methods # - ################ - - private def do_site_add_site( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - # TODO - {ok: true}.to_json - end - - private def do_site_remove_sites( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - # TODO - {ok: true}.to_json - end - - private def do_site_set_default( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - # TODO - {ok: true}.to_json - end - - private def do_site_set_domains( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - # TODO - {ok: true}.to_json - end - - ################ - # test methods # - ################ - - private def do_test_version( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - {version: Guff::VERSION}.to_json - end - - private def do_test_get_posts( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - [{foo: "bar"}, {foo: "asdf"}].to_json - end - - private def do_test_error( - context : HTTP::Server::Context, - args : Hash(String, String) - ) - raise "some random error" - end - - ################### - # utility methods # - ################### - - private def get_site(context : HTTP::Server::Context) : Int? - @models.site.to_site(context.request.headers["host"]?) - end - - private def get_tags( - s : String? - ) : Array(String) - if s && s.size > 0 - Array(String).from_json(s) - else - [] of String - end - end - - private def get_posts_tags( - s : String? - ) : Array(Array(String)) - if s && s.size > 0 - Array(Array(String)).from_json(s) - else - [] of Array(String) - end - end - end -end -- cgit v1.2.3