From 623292eb16593a02e11786116ab6efd5a14047fe Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Tue, 8 Mar 2016 03:27:56 -0500 Subject: lots of fixes --- src/guff/post-model.cr | 133 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 124 insertions(+), 9 deletions(-) (limited to 'src/guff/post-model.cr') diff --git a/src/guff/post-model.cr b/src/guff/post-model.cr index 4788ba3..0a78458 100644 --- a/src/guff/post-model.cr +++ b/src/guff/post-model.cr @@ -42,6 +42,34 @@ module Guff ORDER BY %{sort} %{dir} OFFSET :offset LIMIT :limit ", + + remove_posts: " + UPDATE posts + SET is_active = 0 + WHERE site_id = :site_id + AND post_id IN (%{post_ids}) + ", + + set_tags_delete: " + DELETE FROM post_tags WHERE post_id = ( + SELECT post_id + FROM posts + WHERE site_id = :site_id + AND post_id = :post_id + ) + ", + + set_tags_insert: " + INSERT INTO post_tags(post_id, tag_id) + SELECT a.post_id, + b.tag_id + + FROM posts a + CROSS JOIN tags b + + WHERE a.site_id = :site_id + AND b.name IN (%{tags}) + ", }) def initialize(models : Models) @@ -196,19 +224,106 @@ module Guff }) : NO_POSTS end - def add_post(req) - # TODO: return post id - {ok: true} + #################### + # add_post methods # + #################### + + def add_post( + site_id = nil : Int?, + slug = "" : String, + name = "" : String, + body = "" : String, + tags = [] of String : Array(String), + ) : Int64 + post_id = -1_i64 + + # check slug, name, and body + { "slug": slug, "name": name, "body": body }.each do |name, text| + raise "invalid %s" % [name] unless text.size > 0 + end + + transaction do + query(:add_post, { + "site_id": (site_id || @models.site.get_default).to_s, + "slug": slug, + "name": name, + "raw_body": body, + "body": body, + }, nil) + + # get post id + post_id = last_insert_row_id + + # set post tags + set_tags( + site_id: site_id, + post_id: post_id, + tags: tags, + use_transaction: false, + ) + end + + # return post id + post_id end - def remove_posts(req) - # TODO - {ok: true} + def remove_posts( + site_id = nil : Int?, + post_ids = [] of Int : Array(Int) + ) + query(:remove_posts, { + "site_id": (site_id || @models.site.get_default).to_s, + }, { + "post_ids": post_ids.map { |post_id| + "'" + @db.quote(post_id.to_s) + "'" + }.join(',') + }) + + # no return value + nil end - def set_tags(req) - # TODO - {ok: true} + def set_tags( + site_id = nil : Int?, + post_id = nil : Int?, + tags = [] of String : Array(String), + use_transaction = true : Bool + ) + if use_transaction + transaction do + raw_set_tags(site_id, post_id, tags) + end + else + raw_set_tags(site_id, post_id, tags) + end + + nil + end + + private def raw_set_tags( + site_id = nil : Int?, + post_id = nil : Int?, + tags = [] of String : Array(String), + ) + # build sql args + args = { + "site_id": (site_id || @models.site.get_default).to_s, + "post_id": post_id.to_s, + } + + # delete existing post tags + query(:set_tags_delete, args, nil) + + if tags.size > 0 + @models.tag.add_tags(tags) + + # add new post tags + query(:set_tags_insert, args, { + "tags": tags.map { |tag| + "'" + @db.quote(tag) + "'" + }.join(','), + }) + end end end end -- cgit v1.2.3