diff --git a/app/assets/images/domain-icons/bluesky.png b/app/assets/images/domain-icons/bluesky.png new file mode 100644 index 00000000..09393a74 Binary files /dev/null and b/app/assets/images/domain-icons/bluesky.png differ diff --git a/app/helpers/domain/posts_helper.rb b/app/helpers/domain/posts_helper.rb index a7d6aa15..37a72c99 100644 --- a/app/helpers/domain/posts_helper.rb +++ b/app/helpers/domain/posts_helper.rb @@ -48,6 +48,11 @@ module Domain::PostsHelper domain_icon_path: "domain-icons/sofurry.png", domain_icon_title: "SoFurry", ), + Domain::DomainType::Bluesky => + DomainData.new( + domain_icon_path: "domain-icons/bluesky.png", + domain_icon_title: "Bluesky", + ), }, T::Hash[Domain::DomainType, DomainData], ) diff --git a/app/helpers/domain/users_helper.rb b/app/helpers/domain/users_helper.rb index b796d073..58c5089c 100644 --- a/app/helpers/domain/users_helper.rb +++ b/app/helpers/domain/users_helper.rb @@ -102,6 +102,8 @@ module Domain::UsersHelper asset_path("domain-icons/inkbunny.png") when Domain::User::SofurryUser asset_path("domain-icons/sofurry.png") + when Domain::User::BlueskyUser + asset_path("domain-icons/bluesky.png") else Kernel.raise "Unknown user type: #{user.class}" end diff --git a/app/models/domain/user/bluesky_user.rb b/app/models/domain/user/bluesky_user.rb index 8176df69..477b2d15 100644 --- a/app/models/domain/user/bluesky_user.rb +++ b/app/models/domain/user/bluesky_user.rb @@ -55,7 +55,7 @@ class Domain::User::BlueskyUser < Domain::User sig { override.returns(T.nilable(String)) } def external_url_for_view - "https://bsky.app/profile/#{handle}" if handle.present? + "https://bsky.app/profile/#{did}" if did.present? end sig { override.returns(T.nilable(String)) } diff --git a/app/policies/domain/post/bluesky_post_policy.rb b/app/policies/domain/post/bluesky_post_policy.rb new file mode 100644 index 00000000..7fa7b9ab --- /dev/null +++ b/app/policies/domain/post/bluesky_post_policy.rb @@ -0,0 +1,3 @@ +# typed: strict +class Domain::Post::BlueskyPostPolicy < Domain::PostPolicy +end diff --git a/app/policies/domain/user/bluesky_user_policy.rb b/app/policies/domain/user/bluesky_user_policy.rb new file mode 100644 index 00000000..8b37293a --- /dev/null +++ b/app/policies/domain/user/bluesky_user_policy.rb @@ -0,0 +1,3 @@ +# typed: strict +class Domain::User::BlueskyUserPolicy < Domain::UserPolicy +end diff --git a/app/views/domain/posts/show.html.erb b/app/views/domain/posts/show.html.erb index 26cbac15..f188ef32 100644 --- a/app/views/domain/posts/show.html.erb +++ b/app/views/domain/posts/show.html.erb @@ -29,7 +29,7 @@ <% description = [] description << "posted #{@post.posted_at.strftime("%B %d, %Y")}" if @post.respond_to?(:posted_at) && @post.posted_at.present? - description << "by #{@post.primary_creator_for_view&.name || "Unknown"}" + description << "by #{@post.primary_creator_for_view&.name_for_view || "Unknown"}" description << "@ #{domain_name_for_model(@post)}" %> "> diff --git a/spec/controllers/domain/posts_controller_spec.rb b/spec/controllers/domain/posts_controller_spec.rb index 8e2b1352..1520e684 100644 --- a/spec/controllers/domain/posts_controller_spec.rb +++ b/spec/controllers/domain/posts_controller_spec.rb @@ -2,8 +2,6 @@ require "rails_helper" RSpec.describe Domain::PostsController, type: :controller do - render_views - # Create a real user with admin role let(:user) { create(:user, :admin) } @@ -75,6 +73,11 @@ RSpec.describe Domain::PostsController, type: :controller do it_behaves_like "a post" end + context "with a bluesky post" do + let(:post) { create(:domain_post_bluesky_post) } + it_behaves_like "a post" + end + context "when post file is pending download" do let(:post) do create( diff --git a/spec/factories/domain/post/bluesky_post.rb b/spec/factories/domain/post/bluesky_post.rb new file mode 100644 index 00000000..d64281d8 --- /dev/null +++ b/spec/factories/domain/post/bluesky_post.rb @@ -0,0 +1,15 @@ +# typed: false +FactoryBot.define do + factory :domain_post_bluesky_post, class: "Domain::Post::BlueskyPost" do + association :creator, factory: :domain_user_bluesky_user + sequence(:bluesky_rkey) { |n| "rkey#{n}" } + sequence(:at_uri) do |n| + "at://did:plc:#{n.to_s.rjust(10, "0")}/app.bsky.feed.post/rkey#{n}" + end + bluesky_created_at { Time.now } + state { "ok" } + text { "Hello from Bluesky" } + hashtags { %w[test bluesky] } + like_count { 0 } + end +end diff --git a/spec/factories/domain/user/bluesky_user.rb b/spec/factories/domain/user/bluesky_user.rb new file mode 100644 index 00000000..296dec87 --- /dev/null +++ b/spec/factories/domain/user/bluesky_user.rb @@ -0,0 +1,8 @@ +# typed: false +FactoryBot.define do + factory :domain_user_bluesky_user, class: "Domain::User::BlueskyUser" do + sequence(:handle) { |n| "user#{n}.bsky.social" } + sequence(:did) { |n| "did:plc:#{n.to_s.rjust(10, "0")}" } + state { "ok" } + end +end