diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/guff/api-handler.cr | 13 | ||||
-rw-r--r-- | src/guff/api-methods.cr | 213 |
2 files changed, 220 insertions, 6 deletions
diff --git a/src/guff/api-handler.cr b/src/guff/api-handler.cr index ad78706..e4d7fc4 100644 --- a/src/guff/api-handler.cr +++ b/src/guff/api-handler.cr @@ -88,6 +88,19 @@ module Guff define_method_calls({ post: [ get_posts, + add_post, + remove_posts, + set_tags, + ], + + dir: [ + add, + remove, + ], + + file: [ + add, + remove, ], tag: [ diff --git a/src/guff/api-methods.cr b/src/guff/api-methods.cr index 5ef3dae..03954c6 100644 --- a/src/guff/api-methods.cr +++ b/src/guff/api-methods.cr @@ -25,7 +25,7 @@ module Guff "tags": { text: "Comma-separated list of tags (union)", - type: :tags, + type: :tag_list, required: false, default: "1", }, @@ -38,12 +38,139 @@ module Guff }, }, }, + + "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, + required: false, + default: "", + }, + }, + }, + + "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, + 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, + required: false, + default: "", + }, + }, + }, }, "test": { @@ -62,10 +189,15 @@ module Guff } TYPE_CHECKS = { - text: /.*/, - int: /^\d+$/, - tags: /^[a-z0-9_,-]+$/, - sort: /^[a-z0-9_]+,(?:asc|desc)$/, + text: /.*/, + slug: /^[a-z0-9\.-]+$/, + int: /^\d+$/, + int_list: /^\d+(?:,\d+)*$/, + tag_list: /^[a-z0-9_\/ -]+(?:,[a-z0-9_\/ -]+)*$/, + sort: /^[a-z0-9_]+,(?:asc|desc)$/, + + # FIXME: lock this down more + path: /^[^\/].*[^\/]$/, } private def get_method_args( @@ -92,7 +224,11 @@ module Guff end # get value - val = params.fetch(arg_name, arg_data[:default] as String) + val = if arg_data[:required] + params.fetch(arg_name) + else + params.fetch(arg_name, arg_data[:default] as String) + end # check value if !TYPE_CHECKS[arg_data[:type]].match(val) @@ -115,9 +251,74 @@ module Guff context : HTTP::Server::Context, args : Hash(String, String) ) + # TODO [{foo: "bar"}, {foo: "asdf"}].to_json end + private def do_post_add_post( + context : HTTP::Server::Context, + args : Hash(String, String) + ) + # TODO: return post id + {ok: true}.to_json + end + + private def do_post_remove_posts( + context : HTTP::Server::Context, + args : Hash(String, String) + ) + # TODO + {ok: true}.to_json + end + + private def do_post_set_tags( + context : HTTP::Server::Context, + args : Hash(String, String) + ) + # TODO + {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 # ############### |