From 8cbcd08411d3df5e85a4eacca2700eaba2f120fa Mon Sep 17 00:00:00 2001 From: Daniel Nitsikopoulos Date: Tue, 31 Jan 2023 19:58:29 +1100 Subject: [PATCH] Allow photo posts --- app/decorators/posts/decorator.rb | 4 ++++ app/entities/bookmark_request.rb | 1 + app/entities/post_request.rb | 1 + app/templates/posts/show.html.slim | 3 +++ app/validation/posts/bookmark_contract.rb | 1 + app/validation/posts/post_contract.rb | 1 + db/migrate/20230131084956_add_photos_to_posts.rb | 9 +++++++++ lib/adamantium/micropub_request_parser.rb | 2 ++ 8 files changed, 22 insertions(+) create mode 100644 db/migrate/20230131084956_add_photos_to_posts.rb diff --git a/app/decorators/posts/decorator.rb b/app/decorators/posts/decorator.rb index d115b02..0122d23 100644 --- a/app/decorators/posts/decorator.rb +++ b/app/decorators/posts/decorator.rb @@ -21,6 +21,10 @@ module Adamantium end end + def photos? + photos.count > 0 + end + def prefix_emoji name ? "📝" : "📯" end diff --git a/app/entities/bookmark_request.rb b/app/entities/bookmark_request.rb index 05bda65..e916c8a 100644 --- a/app/entities/bookmark_request.rb +++ b/app/entities/bookmark_request.rb @@ -11,6 +11,7 @@ module Adamantium attribute :published_at, Types::Nominal::DateTime.optional attribute :post_type, Types::Coercible::String attribute :syndicate_to, Types::Array.of(Types::Coercible::String) + attribute :photos, Types::Array.of(Types::Hash) end end end diff --git a/app/entities/post_request.rb b/app/entities/post_request.rb index f7e517f..cd6ab7c 100644 --- a/app/entities/post_request.rb +++ b/app/entities/post_request.rb @@ -10,6 +10,7 @@ module Adamantium attribute :published_at, Types::Nominal::DateTime.optional attribute :post_type, Types::Coercible::String attribute :syndicate_to, Types::Array.of(Types::Coercible::String) + attribute :photos, Types::Array.of(Types::Hash) end end end diff --git a/app/templates/posts/show.html.slim b/app/templates/posts/show.html.slim index 6e6f103..16dbdbf 100644 --- a/app/templates/posts/show.html.slim +++ b/app/templates/posts/show.html.slim @@ -2,6 +2,9 @@ div class="mb-12 prose dark:prose-invert max-w-prose mx-auto text-gray-800 dark: h1 = post.display_title article class="mb-12 prose dark:prose-invert max-w-prose mx-auto text-gray-800 dark:text-gray-200 prose-a:text-blue-600 prose-a:no-underline hover:prose-a:underline" + - if post.photos? + - post.photos.each do |photo| + img src=photo["value"] alt=photo["alt"] == post.content div class="mb-4 max-w-screen-md mx-auto border-t-4 border-solid border-gray-400 dark:border-gray-600" diff --git a/app/validation/posts/bookmark_contract.rb b/app/validation/posts/bookmark_contract.rb index 8ced50b..9fec079 100644 --- a/app/validation/posts/bookmark_contract.rb +++ b/app/validation/posts/bookmark_contract.rb @@ -11,6 +11,7 @@ module Adamantium required(:slug).filled(:string) required(:post_type).value(included_in?: %w[bookmark]) required(:syndicate_to).array(:string) + required(:photos).array(:hash) end end end diff --git a/app/validation/posts/post_contract.rb b/app/validation/posts/post_contract.rb index 9e23cb6..816bf50 100644 --- a/app/validation/posts/post_contract.rb +++ b/app/validation/posts/post_contract.rb @@ -10,6 +10,7 @@ module Adamantium required(:slug).filled(:string) required(:post_type).value(included_in?: %w[post]) required(:syndicate_to).array(:string) + required(:photos).array(:hash) end end end diff --git a/db/migrate/20230131084956_add_photos_to_posts.rb b/db/migrate/20230131084956_add_photos_to_posts.rb new file mode 100644 index 0000000..1298b57 --- /dev/null +++ b/db/migrate/20230131084956_add_photos_to_posts.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +ROM::SQL.migration do + change do + alter_table :posts do + add_column :photos, :json, default: "[]", null: false + end + end +end diff --git a/lib/adamantium/micropub_request_parser.rb b/lib/adamantium/micropub_request_parser.rb index 61f2c33..d9ba229 100644 --- a/lib/adamantium/micropub_request_parser.rb +++ b/lib/adamantium/micropub_request_parser.rb @@ -61,12 +61,14 @@ module Adamantium new_params[:content] = params[:properties][:content]&.first&.tr("\n", " ") new_params[:slug] = params[:slug] || params["mp-slug"] new_params[:syndicate_to] = params[:properties][:"mp-syndicate-to"] || [] + new_params[:photos] = params[:properties][:photo] || [] else new_params[:syndicate_to] = params[:"mp-syndicate-to"]&.split(",") || [] new_params[:name] = params[:name] new_params[:slug] = params[:slug] || params["mp-slug"] new_params[:published_at] = (params[:"post-status"] == "draft") ? nil : publish_time new_params[:category] = params[:category].split(",") || [] + new_params[:photos] = params[:photo] || [] content = if params[:content] if params[:content].is_a?(Hash) && params[:content][:html]