aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/guff/api-handler.cr13
-rw-r--r--src/guff/api-methods.cr213
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 #
###############