diff --git a/app/commands/posts/update.rb b/app/commands/posts/update.rb index 4863ad9..adb4807 100644 --- a/app/commands/posts/update.rb +++ b/app/commands/posts/update.rb @@ -2,23 +2,68 @@ module Adamantium module Commands module Posts class Update < Command - include Deps["repos.post_repo", "renderers.markdown"] + include Deps[ + "repos.post_repo", + "renderers.markdown", + "commands.posts.add_syndication_source" + ] def call(params:) slug = URI(params[:url]).path.split("/").last post = post_repo.fetch!(slug) if params.key? :replace - post_repo.update(post.id, { - content: markdown.call(content: params[:replace][:content].first) - }) + content = params[:replace].delete(:content).first + name = params[:replace].delete(:name) + + attrs_to_replace = {} + attrs_to_replace[:name] = name if name + attrs_to_replace[:content] = markdown.call(content: content) if content + + post_repo.update(post.id, attrs_to_replace) end if params.key? :add - post_repo.tag_post(post_id: post.id, tags: params[:add][:category]) + attrs_to_add = {} + + syndication = params[:add].delete(:syndication).first + tags = params[:add].delete(:category) + content = params[:add].delete(:content).first + name = params[:add].delete(:name) + + attrs_to_add[:name] = name if post.name.empty? + attrs_to_add[:content] = markdown.call(content: content) if post.content.empty? + + params[:add].keys.each_with_object(attrs_to_add) do |attr, memo| + memo[attr] = params[:add][attr].first if post.fetch(attr, nil).nil? + end + + post_repo.update(post.id, attrs_to_add) unless attrs_to_add.empty? + + post_repo.tag_post(post_id: post.id, tags: tags) if tags && !tags.empty? + add_syndication_source.call(post.id, "", syndication) if syndication && !syndication.empty? end if params.key? :delete + if params[:delete].is_a? Hash + tags = params[:delete][:category] + tags&.each do |tag| + post_repo.remove_tag(post_id: post.id, tag: tag) + end + elsif params[:delete].is_a? Array + if params[:delete].delete("category") + post.tags.each do |tag| + post_repo.remove_tag(post_id: post.id, tag: tag.label) + end + end + + attrs = {} + params[:delete].each do |attr| + attrs[attr.to_sym] = nil + end + + post_repo.update(post.id, attrs) unless attrs.empty? + end end end end