aboutsummaryrefslogtreecommitdiff
path: root/src/guff/api-methods.cr
diff options
context:
space:
mode:
authorPaul Duncan <pabs@pablotron.org>2016-03-06 01:23:56 -0500
committerPaul Duncan <pabs@pablotron.org>2016-03-06 01:23:56 -0500
commita1318dd3ebd41d9ce8528a51a8099985fa18f763 (patch)
treeb9bbfa0a428e39ca31de70801fcb33bd9634f72b /src/guff/api-methods.cr
parent9dd635d63e2626badcca0e244dc553b43319e5da (diff)
downloadold-guff-a1318dd3ebd41d9ce8528a51a8099985fa18f763.tar.bz2
old-guff-a1318dd3ebd41d9ce8528a51a8099985fa18f763.zip
add api-methods and api-content-type
Diffstat (limited to 'src/guff/api-methods.cr')
-rw-r--r--src/guff/api-methods.cr140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/guff/api-methods.cr b/src/guff/api-methods.cr
new file mode 100644
index 0000000..dc0e1e8
--- /dev/null
+++ b/src/guff/api-methods.cr
@@ -0,0 +1,140 @@
+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: :tags,
+ required: false,
+ default: "1",
+ },
+
+ "sort": {
+ text: "Sort order of results",
+ type: :sort,
+ required: false,
+ default: "date,desc",
+ },
+ },
+ },
+ },
+
+ "test": {
+ "version": {
+ text: "Get version",
+ },
+
+ "get_posts": {
+ text: "Test get posts",
+ },
+
+ "error": {
+ text: "Test error response",
+ },
+ }
+ }
+
+ TYPE_CHECKS = {
+ text: /.*/,
+ int: /^\d+$/,
+ tags: /^[a-z0-9_,-]+$/,
+ sort: /^[a-z0-9_]+,(?:asc|desc)$/,
+ }
+
+ 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 = params.fetch(arg_name, arg_data[:default] as String)
+
+ # 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
+
+ # return result
+ r
+ end
+ end
+
+ ################
+ # post methods #
+ ################
+
+ private def do_post_get_posts(
+ context : HTTP::Server::Context,
+ args : Hash(String, String)
+ )
+ [{foo: "bar"}, {foo: "asdf"}].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
+ end
+end