Save syndication sources to posts
This commit is contained in:
@@ -11,7 +11,8 @@ module Adamantium
|
||||
delete_post: "commands.posts.delete",
|
||||
undelete_post: "commands.posts.undelete",
|
||||
update_post: "commands.posts.update",
|
||||
syndicate: "commands.posts.syndicate"
|
||||
syndicate: "commands.posts.syndicate",
|
||||
add_post_syndication_source: "commands.posts.add_syndication_source"
|
||||
]
|
||||
|
||||
def handle(req, res)
|
||||
@@ -36,10 +37,13 @@ module Adamantium
|
||||
validation = contract.call(req_entity.to_h)
|
||||
if validation.success?
|
||||
|
||||
url = syndicate.call(validation.to_h) # TODO: set URL on post
|
||||
|
||||
post = command.call(validation.to_h)
|
||||
|
||||
syndicate.call(validation.to_h).bind do |result|
|
||||
source, url = result
|
||||
add_post_syndication_source.call(post.id, source, url)
|
||||
end
|
||||
|
||||
res.status = 201
|
||||
res.headers.merge!(
|
||||
"Location" => "#{settings.micropub_site_url}/#{post.post_type}/#{post.slug}"
|
||||
|
18
app/commands/posts/add_syndication_source.rb
Normal file
18
app/commands/posts/add_syndication_source.rb
Normal file
@@ -0,0 +1,18 @@
|
||||
module Adamantium
|
||||
module Commands
|
||||
module Posts
|
||||
class AddSyndicationSource
|
||||
include Deps["repos.post_repo"]
|
||||
|
||||
def call(post_id, source, url)
|
||||
post = post_repo.find!(post_id).to_h
|
||||
syndication_sources = post[:syndication_sources] || {}
|
||||
syndication_sources[source] = url
|
||||
post[:syndication_sources] = syndication_sources
|
||||
|
||||
post_repo.update(post_id, post)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@@ -1,12 +1,20 @@
|
||||
require "dry/monads"
|
||||
require "dry/monads/do"
|
||||
|
||||
module Adamantium
|
||||
module Commands
|
||||
module Posts
|
||||
class Syndicate
|
||||
include Dry::Monads[:result]
|
||||
include Dry::Monads::Do.for(:call)
|
||||
|
||||
include Deps["settings", "syndication.mastodon"]
|
||||
|
||||
def call(post)
|
||||
if post[:syndicate_to].any? { |url| settings.mastodon_server.match(/#{url}/) }
|
||||
mastodon.call(post: post)
|
||||
url = yield mastodon.call(post: post)
|
||||
|
||||
Success([:mastodon, url])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -8,6 +8,19 @@ module Adamantium
|
||||
module Decorators
|
||||
module Posts
|
||||
class Decorator < SimpleDelegator
|
||||
def syndicated?
|
||||
!syndication_sources.empty?
|
||||
end
|
||||
|
||||
def syndicated_to
|
||||
syndication_sources.map do |source, url|
|
||||
{
|
||||
location: source,
|
||||
url: url
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def prefix_emoji
|
||||
name ? "📝" : "📯"
|
||||
end
|
||||
|
@@ -1,7 +1,7 @@
|
||||
module Adamantium
|
||||
module Repos
|
||||
class PostRepo < Adamantium::Repo[:posts]
|
||||
commands :update
|
||||
commands update: :by_pk
|
||||
|
||||
def create(post_attrs)
|
||||
posts.transaction do
|
||||
@@ -64,6 +64,12 @@ module Adamantium
|
||||
.one!
|
||||
end
|
||||
|
||||
def find!(id)
|
||||
posts
|
||||
.by_pk(id)
|
||||
.one!
|
||||
end
|
||||
|
||||
def slug_exists?(slug)
|
||||
!!posts
|
||||
.where(slug: slug)
|
||||
|
@@ -6,7 +6,14 @@ article class="mb-12 prose dark:prose-invert max-w-prose mx-auto text-gray-800 d
|
||||
|
||||
div class="mb-4 max-w-screen-md mx-auto border-t-4 border-solid border-gray-400 dark:border-gray-600"
|
||||
|
||||
div class="mb-2 max-w-prose mx-auto text-gray-600 dark:text-gray-200 flex"
|
||||
= "Published #{post.display_published_at}"
|
||||
div class="max-w-prose mx-auto text-gray-600 dark:text-gray-200 flex"
|
||||
div class=""
|
||||
= "Published #{post.display_published_at}"
|
||||
span class="text-right flex-1"
|
||||
== render :tags, tags: post.tags
|
||||
div class="mb-2 max-w-prose mx-auto text-gray-600 dark:text-gray-200 flex"
|
||||
- if post.syndicated?
|
||||
span Also on:
|
||||
- post.syndicated_to.each do |loc|
|
||||
a href=loc[:url]
|
||||
== render loc[:location]
|
||||
|
1
app/templates/shared/_mastodon.html.slim
Normal file
1
app/templates/shared/_mastodon.html.slim
Normal file
@@ -0,0 +1 @@
|
||||
<svg class="fill-blue-100 hover:fill-blue-400 w-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"/></svg>
|
After Width: | Height: | Size: 910 B |
Reference in New Issue
Block a user