bluesky initial impl
This commit is contained in:
@@ -19,6 +19,8 @@ module Domain::DomainModelHelper
|
||||
"Inkbunny"
|
||||
when Domain::DomainType::Sofurry
|
||||
"Sofurry"
|
||||
when Domain::DomainType::Bluesky
|
||||
"Bluesky"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -33,6 +35,8 @@ module Domain::DomainModelHelper
|
||||
"IB"
|
||||
when Domain::DomainType::Sofurry
|
||||
"SF"
|
||||
when Domain::DomainType::Bluesky
|
||||
"BSKY"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -6,5 +6,6 @@ class Domain::DomainType < T::Enum
|
||||
E621 = new
|
||||
Inkbunny = new
|
||||
Sofurry = new
|
||||
Bluesky = new
|
||||
end
|
||||
end
|
||||
|
||||
149
app/models/domain/post/bluesky_post.rb
Normal file
149
app/models/domain/post/bluesky_post.rb
Normal file
@@ -0,0 +1,149 @@
|
||||
# typed: strict
|
||||
class Domain::Post::BlueskyPost < Domain::Post
|
||||
aux_table :bluesky, allow_redefining: :title
|
||||
|
||||
belongs_to :first_seen_entry, class_name: "::HttpLogEntry", optional: true
|
||||
|
||||
has_single_file!
|
||||
has_single_creator! Domain::User::BlueskyUser
|
||||
has_faving_users! Domain::User::BlueskyUser
|
||||
|
||||
after_initialize { self.state ||= "ok" if new_record? }
|
||||
|
||||
enum :state,
|
||||
{
|
||||
ok: "ok",
|
||||
removed: "removed",
|
||||
scan_error: "scan_error",
|
||||
file_error: "file_error",
|
||||
},
|
||||
prefix: "state"
|
||||
|
||||
validates :state, presence: true
|
||||
validates :bluesky_id, presence: true
|
||||
|
||||
sig { override.returns([String, Symbol]) }
|
||||
def self.param_prefix_and_attribute
|
||||
["bsky", :bluesky_id]
|
||||
end
|
||||
|
||||
sig { override.returns(String) }
|
||||
def self.view_prefix
|
||||
"bsky"
|
||||
end
|
||||
|
||||
sig { override.returns(Symbol) }
|
||||
def self.post_order_attribute
|
||||
:bluesky_id
|
||||
end
|
||||
|
||||
sig { override.returns(Domain::DomainType) }
|
||||
def self.domain_type
|
||||
Domain::DomainType::Bluesky
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(Domain::User)) }
|
||||
def primary_creator_for_view
|
||||
self.creator
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(T.any(String, Integer))) }
|
||||
def domain_id_for_view
|
||||
self.bluesky_id
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(Addressable::URI)) }
|
||||
def external_url_for_view
|
||||
handle = self.creator&.handle
|
||||
if bluesky_id.present? && handle.present?
|
||||
Addressable::URI.parse(
|
||||
"https://bsky.app/profile/#{handle}/post/#{bluesky_id}",
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(Domain::PostFile)) }
|
||||
def primary_file_for_view
|
||||
self.file
|
||||
end
|
||||
|
||||
sig { override.returns(T::Boolean) }
|
||||
def pending_scan?
|
||||
scanned_at.nil?
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(String)) }
|
||||
def description_html_for_view
|
||||
text
|
||||
end
|
||||
|
||||
sig { override.returns(String) }
|
||||
def description_html_base_domain
|
||||
"bsky.app"
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(String)) }
|
||||
def description_for_view
|
||||
self.text
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(Integer)) }
|
||||
def num_favorites_for_view
|
||||
like_count
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(String)) }
|
||||
def title
|
||||
# Use first 50 characters of text as title, or a fallback
|
||||
current_text = text
|
||||
current_text.present? ? current_text.truncate(50) : "Bluesky Post"
|
||||
end
|
||||
|
||||
sig { returns(T.nilable(String)) }
|
||||
def status_for_view
|
||||
case self.state
|
||||
when "ok"
|
||||
"OK"
|
||||
when "removed"
|
||||
"Removed"
|
||||
when "scan_error"
|
||||
"Scan error"
|
||||
when "file_error"
|
||||
"File error"
|
||||
end
|
||||
end
|
||||
|
||||
sig do
|
||||
params(
|
||||
at_uri: String,
|
||||
creator: Domain::User::BlueskyUser,
|
||||
first_seen_log_entry: T.nilable(HttpLogEntry),
|
||||
).returns(Domain::Post::BlueskyPost)
|
||||
end
|
||||
def self.find_or_initialize_by_at_uri(
|
||||
at_uri,
|
||||
creator:,
|
||||
first_seen_log_entry: nil
|
||||
)
|
||||
# Extract the record key (post ID) from AT URI
|
||||
# e.g., "at://did:plc:abc123/app.bsky.feed.post/xyz789" -> "xyz789"
|
||||
bluesky_id = at_uri.split("/").last
|
||||
|
||||
post =
|
||||
Domain::Post::BlueskyPost.find_or_initialize_by(
|
||||
bluesky_id: bluesky_id,
|
||||
) do |post|
|
||||
post.first_seen_entry = first_seen_log_entry
|
||||
post.at_uri = at_uri
|
||||
end
|
||||
|
||||
post.creator ||= creator
|
||||
post
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(T::Array[TagForView])) }
|
||||
def tags_for_view
|
||||
return nil unless hashtags.present?
|
||||
hashtags.map { |tag| TagForView.new(category: :general, value: tag) }
|
||||
end
|
||||
end
|
||||
83
app/models/domain/user/bluesky_user.rb
Normal file
83
app/models/domain/user/bluesky_user.rb
Normal file
@@ -0,0 +1,83 @@
|
||||
# typed: strict
|
||||
class Domain::User::BlueskyUser < Domain::User
|
||||
aux_table :bluesky
|
||||
|
||||
due_timestamp :scanned_profile_at, 1.month
|
||||
due_timestamp :scanned_posts_at, 1.week
|
||||
|
||||
has_created_posts! Domain::Post::BlueskyPost
|
||||
has_faved_posts! Domain::Post::BlueskyPost
|
||||
|
||||
enum :state,
|
||||
{ ok: "ok", account_disabled: "account_disabled", error: "error" },
|
||||
prefix: :state
|
||||
|
||||
validates :handle, presence: true
|
||||
validates :state, presence: true
|
||||
|
||||
after_initialize { self.state ||= "ok" if new_record? }
|
||||
|
||||
sig { override.returns([String, Symbol]) }
|
||||
def self.param_prefix_and_attribute
|
||||
["bsky", :handle]
|
||||
end
|
||||
|
||||
sig { override.returns(String) }
|
||||
def self.view_prefix
|
||||
"bsky"
|
||||
end
|
||||
|
||||
sig { override.returns(Domain::DomainType) }
|
||||
def self.domain_type
|
||||
Domain::DomainType::Bluesky
|
||||
end
|
||||
|
||||
sig { override.returns(String) }
|
||||
def description_html_base_domain
|
||||
"bsky.app"
|
||||
end
|
||||
|
||||
sig { override.returns(String) }
|
||||
def site_name_for_view
|
||||
"Bluesky"
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(String)) }
|
||||
def description_html_for_view
|
||||
description
|
||||
end
|
||||
|
||||
sig { override.returns(T::Array[String]) }
|
||||
def names_for_search
|
||||
[display_name, handle].compact
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(String)) }
|
||||
def external_url_for_view
|
||||
"https://bsky.app/profile/#{handle}" if handle.present?
|
||||
end
|
||||
|
||||
sig { override.returns(T.nilable(String)) }
|
||||
def name_for_view
|
||||
display_name || handle
|
||||
end
|
||||
|
||||
sig { override.returns(String) }
|
||||
def account_status_for_view
|
||||
"Active" # TODO: Implement proper status checking
|
||||
end
|
||||
|
||||
sig { returns(String) }
|
||||
def account_state_for_view
|
||||
case state
|
||||
when "ok"
|
||||
"Ok"
|
||||
when "account_disabled"
|
||||
"Disabled"
|
||||
when "error"
|
||||
"Error"
|
||||
else
|
||||
"Unknown"
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,40 @@
|
||||
# typed: strict
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AddAuxTablesForDomainUsersBlueskyUsers < ActiveRecord::Migration[7.2]
|
||||
extend T::Sig
|
||||
|
||||
sig { void }
|
||||
def change
|
||||
create_aux_table :domain_users, :bluesky do |t|
|
||||
t.string :handle, null: false, index: true
|
||||
t.string :display_name
|
||||
t.text :description
|
||||
t.string :state, null: false, default: "ok"
|
||||
|
||||
# Bluesky-specific fields
|
||||
t.string :did, index: true # Decentralized identifier
|
||||
t.string :avatar_url
|
||||
t.integer :followers_count, default: 0
|
||||
t.integer :following_count, default: 0
|
||||
t.integer :posts_count, default: 0
|
||||
|
||||
# Scanning timestamps
|
||||
t.datetime :scanned_profile_at
|
||||
t.datetime :scanned_posts_at
|
||||
|
||||
# Log entries for tracking scans
|
||||
t.references :last_profile_scan,
|
||||
foreign_key: {
|
||||
to_table: :http_log_entries,
|
||||
}
|
||||
t.references :last_posts_scan,
|
||||
foreign_key: {
|
||||
to_table: :http_log_entries,
|
||||
}
|
||||
|
||||
# Raw data storage for debugging/analysis
|
||||
t.column :profile_raw, :jsonb, default: {}
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,51 @@
|
||||
# typed: strict
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AddAuxTablesForDomainPostsBlueskyPosts < ActiveRecord::Migration[7.2]
|
||||
extend T::Sig
|
||||
|
||||
sig { void }
|
||||
def change
|
||||
create_aux_table :domain_posts, :bluesky do |t|
|
||||
t.string :bluesky_id, null: false, index: true # Record key from AT URI
|
||||
t.string :at_uri, index: true # Full AT Protocol URI
|
||||
t.text :text # Post content
|
||||
t.string :state, null: false, default: "ok"
|
||||
|
||||
# Post metadata (posted_at is in main table)
|
||||
t.datetime :scanned_at
|
||||
t.string :language, limit: 10
|
||||
|
||||
# Engagement metrics
|
||||
t.integer :like_count, default: 0
|
||||
t.integer :repost_count, default: 0
|
||||
t.integer :reply_count, default: 0
|
||||
t.integer :quote_count, default: 0
|
||||
|
||||
# Content arrays
|
||||
t.column :hashtags, :jsonb, default: []
|
||||
t.column :mentions, :jsonb, default: []
|
||||
t.column :links, :jsonb, default: []
|
||||
|
||||
# References to other posts
|
||||
t.string :reply_to_uri # AT URI of post being replied to
|
||||
t.string :quote_uri # AT URI of post being quoted
|
||||
|
||||
# Log entries for tracking scans
|
||||
t.references :last_profile_scan,
|
||||
foreign_key: {
|
||||
to_table: :http_log_entries,
|
||||
}
|
||||
t.references :first_seen_entry,
|
||||
foreign_key: {
|
||||
to_table: :http_log_entries,
|
||||
}
|
||||
|
||||
# Raw data storage for debugging/analysis
|
||||
t.column :post_raw, :jsonb, default: {}
|
||||
|
||||
# Error tracking
|
||||
t.string :scan_error
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,15 @@
|
||||
# typed: strict
|
||||
# frozen_string_literal: true
|
||||
|
||||
class RemoveLastProfileScanFromBlueskyPosts < ActiveRecord::Migration[7.2]
|
||||
extend T::Sig
|
||||
|
||||
sig { void }
|
||||
def change
|
||||
remove_reference :domain_posts_bluesky_aux,
|
||||
:last_profile_scan,
|
||||
foreign_key: {
|
||||
to_table: :http_log_entries,
|
||||
}
|
||||
end
|
||||
end
|
||||
224
db/structure.sql
224
db/structure.sql
@@ -1336,6 +1336,52 @@ CREATE TABLE public.domain_posts (
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_bluesky_aux; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE TABLE public.domain_posts_bluesky_aux (
|
||||
base_table_id bigint NOT NULL,
|
||||
bluesky_id character varying NOT NULL,
|
||||
at_uri character varying,
|
||||
text text,
|
||||
state character varying DEFAULT 'ok'::character varying NOT NULL,
|
||||
scanned_at timestamp(6) without time zone,
|
||||
language character varying(10),
|
||||
like_count integer DEFAULT 0,
|
||||
repost_count integer DEFAULT 0,
|
||||
reply_count integer DEFAULT 0,
|
||||
quote_count integer DEFAULT 0,
|
||||
hashtags jsonb DEFAULT '[]'::jsonb,
|
||||
mentions jsonb DEFAULT '[]'::jsonb,
|
||||
links jsonb DEFAULT '[]'::jsonb,
|
||||
reply_to_uri character varying,
|
||||
quote_uri character varying,
|
||||
first_seen_entry_id bigint,
|
||||
post_raw jsonb DEFAULT '{}'::jsonb,
|
||||
scan_error character varying
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_bluesky_aux_base_table_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.domain_posts_bluesky_aux_base_table_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_bluesky_aux_base_table_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER SEQUENCE public.domain_posts_bluesky_aux_base_table_id_seq OWNED BY public.domain_posts_bluesky_aux.base_table_id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_e621_aux; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
@@ -1827,6 +1873,48 @@ CREATE TABLE public.domain_users (
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_bluesky_aux; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE TABLE public.domain_users_bluesky_aux (
|
||||
base_table_id bigint NOT NULL,
|
||||
handle character varying NOT NULL,
|
||||
display_name character varying,
|
||||
description text,
|
||||
state character varying DEFAULT 'ok'::character varying NOT NULL,
|
||||
did character varying,
|
||||
avatar_url character varying,
|
||||
followers_count integer DEFAULT 0,
|
||||
following_count integer DEFAULT 0,
|
||||
posts_count integer DEFAULT 0,
|
||||
scanned_profile_at timestamp(6) without time zone,
|
||||
scanned_posts_at timestamp(6) without time zone,
|
||||
last_profile_scan_id bigint,
|
||||
last_posts_scan_id bigint,
|
||||
profile_raw jsonb DEFAULT '{}'::jsonb
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_bluesky_aux_base_table_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.domain_users_bluesky_aux_base_table_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_bluesky_aux_base_table_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER SEQUENCE public.domain_users_bluesky_aux_base_table_id_seq OWNED BY public.domain_users_bluesky_aux.base_table_id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_e621_aux; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
@@ -2956,6 +3044,13 @@ ALTER TABLE ONLY public.domain_post_groups ALTER COLUMN id SET DEFAULT nextval('
|
||||
ALTER TABLE ONLY public.domain_posts ALTER COLUMN id SET DEFAULT nextval('public.domain_posts_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_bluesky_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_posts_bluesky_aux ALTER COLUMN base_table_id SET DEFAULT nextval('public.domain_posts_bluesky_aux_base_table_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_e621_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -3026,6 +3121,13 @@ ALTER TABLE ONLY public.domain_user_search_names ALTER COLUMN id SET DEFAULT nex
|
||||
ALTER TABLE ONLY public.domain_users ALTER COLUMN id SET DEFAULT nextval('public.domain_users_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_bluesky_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_users_bluesky_aux ALTER COLUMN base_table_id SET DEFAULT nextval('public.domain_users_bluesky_aux_base_table_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_e621_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -3173,6 +3275,14 @@ ALTER TABLE ONLY public.domain_post_groups
|
||||
ADD CONSTRAINT domain_post_groups_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_bluesky_aux domain_posts_bluesky_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_posts_bluesky_aux
|
||||
ADD CONSTRAINT domain_posts_bluesky_aux_pkey PRIMARY KEY (base_table_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_e621_aux domain_posts_e621_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -3253,6 +3363,14 @@ ALTER TABLE ONLY public.domain_user_search_names
|
||||
ADD CONSTRAINT domain_user_search_names_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_bluesky_aux domain_users_bluesky_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_users_bluesky_aux
|
||||
ADD CONSTRAINT domain_users_bluesky_aux_pkey PRIMARY KEY (base_table_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_e621_aux domain_users_e621_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -4148,6 +4266,34 @@ CREATE INDEX index_domain_post_group_joins_on_type ON public.domain_post_group_j
|
||||
CREATE INDEX index_domain_post_groups_on_type ON public.domain_post_groups USING btree (type);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_posts_bluesky_aux_on_at_uri; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_posts_bluesky_aux_on_at_uri ON public.domain_posts_bluesky_aux USING btree (at_uri);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_posts_bluesky_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_posts_bluesky_aux_on_base_table_id ON public.domain_posts_bluesky_aux USING btree (base_table_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_posts_bluesky_aux_on_bluesky_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_posts_bluesky_aux_on_bluesky_id ON public.domain_posts_bluesky_aux USING btree (bluesky_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_posts_bluesky_aux_on_first_seen_entry_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_posts_bluesky_aux_on_first_seen_entry_id ON public.domain_posts_bluesky_aux USING btree (first_seen_entry_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_posts_e621_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
@@ -4400,6 +4546,41 @@ CREATE UNIQUE INDEX index_domain_user_user_follows_on_from_id_and_to_id ON publi
|
||||
CREATE INDEX index_domain_user_user_follows_on_to_id_and_from_id ON public.domain_user_user_follows USING btree (to_id, from_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_users_bluesky_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_users_bluesky_aux_on_base_table_id ON public.domain_users_bluesky_aux USING btree (base_table_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_users_bluesky_aux_on_did; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_users_bluesky_aux_on_did ON public.domain_users_bluesky_aux USING btree (did);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_users_bluesky_aux_on_handle; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_users_bluesky_aux_on_handle ON public.domain_users_bluesky_aux USING btree (handle);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_users_bluesky_aux_on_last_posts_scan_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_users_bluesky_aux_on_last_posts_scan_id ON public.domain_users_bluesky_aux USING btree (last_posts_scan_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_users_bluesky_aux_on_last_profile_scan_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_domain_users_bluesky_aux_on_last_profile_scan_id ON public.domain_users_bluesky_aux USING btree (last_profile_scan_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_domain_users_e621_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
@@ -5282,6 +5463,14 @@ ALTER TABLE ONLY public.domain_twitter_medias
|
||||
ADD CONSTRAINT fk_rails_278c1d09f0 FOREIGN KEY (tweet_id) REFERENCES public.domain_twitter_tweets(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_bluesky_aux fk_rails_2a2f4bfba8; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_posts_bluesky_aux
|
||||
ADD CONSTRAINT fk_rails_2a2f4bfba8 FOREIGN KEY (base_table_id) REFERENCES public.domain_posts(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_inkbunny_aux fk_rails_304ea0307f; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -5322,6 +5511,14 @@ ALTER TABLE ONLY public.domain_user_user_follows
|
||||
ADD CONSTRAINT fk_rails_4b2ab65400 FOREIGN KEY (from_id) REFERENCES public.domain_users(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_bluesky_aux fk_rails_56b1754cfb; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_users_bluesky_aux
|
||||
ADD CONSTRAINT fk_rails_56b1754cfb FOREIGN KEY (last_profile_scan_id) REFERENCES public.http_log_entries(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_ib_aux fk_rails_5ee2c344bd; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -5338,6 +5535,22 @@ ALTER TABLE ONLY public.domain_twitter_medias
|
||||
ADD CONSTRAINT fk_rails_5fffa41fa6 FOREIGN KEY (file_id) REFERENCES public.http_log_entries(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_bluesky_aux fk_rails_673dd1243a; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_users_bluesky_aux
|
||||
ADD CONSTRAINT fk_rails_673dd1243a FOREIGN KEY (base_table_id) REFERENCES public.domain_users(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_bluesky_aux fk_rails_7393623916; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_posts_bluesky_aux
|
||||
ADD CONSTRAINT fk_rails_7393623916 FOREIGN KEY (first_seen_entry_id) REFERENCES public.http_log_entries(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_posts_e621_aux fk_rails_73ac068c64; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -5514,6 +5727,14 @@ ALTER TABLE ONLY public.domain_posts_e621_aux
|
||||
ADD CONSTRAINT fk_rails_d691739802 FOREIGN KEY (caused_by_entry_id) REFERENCES public.http_log_entries(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_users_bluesky_aux fk_rails_d8ceec56ec; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.domain_users_bluesky_aux
|
||||
ADD CONSTRAINT fk_rails_d8ceec56ec FOREIGN KEY (last_posts_scan_id) REFERENCES public.http_log_entries(id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: domain_post_group_joins fk_rails_eddd0a9390; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -5553,6 +5774,9 @@ ALTER TABLE ONLY public.domain_twitter_tweets
|
||||
SET search_path TO "$user", public;
|
||||
|
||||
INSERT INTO "schema_migrations" (version) VALUES
|
||||
('20250805071440'),
|
||||
('20250805070115'),
|
||||
('20250805070114'),
|
||||
('20250805045947'),
|
||||
('20250805044757'),
|
||||
('20250731035548'),
|
||||
|
||||
1
sorbet/rbi/dsl/application_controller.rbi
generated
1
sorbet/rbi/dsl/application_controller.rbi
generated
@@ -46,6 +46,7 @@ class ApplicationController
|
||||
include ::FaUriHelper
|
||||
include ::GoodJobHelper
|
||||
include ::IpAddressHelper
|
||||
include ::TelegramBotLogsHelper
|
||||
include ::TimestampHelper
|
||||
include ::UiHelper
|
||||
include ::DeviseHelper
|
||||
|
||||
1
sorbet/rbi/dsl/devise_controller.rbi
generated
1
sorbet/rbi/dsl/devise_controller.rbi
generated
@@ -43,6 +43,7 @@ class DeviseController
|
||||
include ::FaUriHelper
|
||||
include ::GoodJobHelper
|
||||
include ::IpAddressHelper
|
||||
include ::TelegramBotLogsHelper
|
||||
include ::TimestampHelper
|
||||
include ::UiHelper
|
||||
include ::DeviseHelper
|
||||
|
||||
2732
sorbet/rbi/dsl/domain/post/bluesky_post.rbi
generated
Normal file
2732
sorbet/rbi/dsl/domain/post/bluesky_post.rbi
generated
Normal file
File diff suppressed because it is too large
Load Diff
2763
sorbet/rbi/dsl/domain/user/bluesky_user.rbi
generated
Normal file
2763
sorbet/rbi/dsl/domain/user/bluesky_user.rbi
generated
Normal file
File diff suppressed because it is too large
Load Diff
2225
sorbet/rbi/dsl/domain_posts_bluesky_aux.rbi
generated
Normal file
2225
sorbet/rbi/dsl/domain_posts_bluesky_aux.rbi
generated
Normal file
File diff suppressed because it is too large
Load Diff
1989
sorbet/rbi/dsl/domain_users_bluesky_aux.rbi
generated
Normal file
1989
sorbet/rbi/dsl/domain_users_bluesky_aux.rbi
generated
Normal file
File diff suppressed because it is too large
Load Diff
1
sorbet/rbi/dsl/rails/application_controller.rbi
generated
1
sorbet/rbi/dsl/rails/application_controller.rbi
generated
@@ -46,6 +46,7 @@ class Rails::ApplicationController
|
||||
include ::FaUriHelper
|
||||
include ::GoodJobHelper
|
||||
include ::IpAddressHelper
|
||||
include ::TelegramBotLogsHelper
|
||||
include ::TimestampHelper
|
||||
include ::UiHelper
|
||||
include ::DeviseHelper
|
||||
|
||||
@@ -46,6 +46,7 @@ class Rails::Conductor::BaseController
|
||||
include ::FaUriHelper
|
||||
include ::GoodJobHelper
|
||||
include ::IpAddressHelper
|
||||
include ::TelegramBotLogsHelper
|
||||
include ::TimestampHelper
|
||||
include ::UiHelper
|
||||
include ::DeviseHelper
|
||||
|
||||
1
sorbet/rbi/dsl/rails/health_controller.rbi
generated
1
sorbet/rbi/dsl/rails/health_controller.rbi
generated
@@ -46,6 +46,7 @@ class Rails::HealthController
|
||||
include ::FaUriHelper
|
||||
include ::GoodJobHelper
|
||||
include ::IpAddressHelper
|
||||
include ::TelegramBotLogsHelper
|
||||
include ::TimestampHelper
|
||||
include ::UiHelper
|
||||
include ::DeviseHelper
|
||||
|
||||
18
sorbet/rbi/dsl/telegram_bot_log.rbi
generated
18
sorbet/rbi/dsl/telegram_bot_log.rbi
generated
@@ -407,10 +407,10 @@ class TelegramBotLog
|
||||
def status_invalid_image?; end
|
||||
|
||||
sig { void }
|
||||
def status_no_results!; end
|
||||
def status_processing!; end
|
||||
|
||||
sig { returns(T::Boolean) }
|
||||
def status_no_results?; end
|
||||
def status_processing?; end
|
||||
|
||||
sig { void }
|
||||
def status_success!; end
|
||||
@@ -534,7 +534,7 @@ class TelegramBotLog
|
||||
def not_status_invalid_image(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
|
||||
def not_status_no_results(*args, &blk); end
|
||||
def not_status_processing(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
|
||||
def not_status_success(*args, &blk); end
|
||||
@@ -606,6 +606,9 @@ class TelegramBotLog
|
||||
end
|
||||
def select(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
|
||||
def slow_requests(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
|
||||
def status_error(*args, &blk); end
|
||||
|
||||
@@ -613,7 +616,7 @@ class TelegramBotLog
|
||||
def status_invalid_image(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
|
||||
def status_no_results(*args, &blk); end
|
||||
def status_processing(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
|
||||
def status_success(*args, &blk); end
|
||||
@@ -1923,7 +1926,7 @@ class TelegramBotLog
|
||||
def not_status_invalid_image(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
|
||||
def not_status_no_results(*args, &blk); end
|
||||
def not_status_processing(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
|
||||
def not_status_success(*args, &blk); end
|
||||
@@ -1995,6 +1998,9 @@ class TelegramBotLog
|
||||
end
|
||||
def select(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
|
||||
def slow_requests(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
|
||||
def status_error(*args, &blk); end
|
||||
|
||||
@@ -2002,7 +2008,7 @@ class TelegramBotLog
|
||||
def status_invalid_image(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
|
||||
def status_no_results(*args, &blk); end
|
||||
def status_processing(*args, &blk); end
|
||||
|
||||
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
|
||||
def status_success(*args, &blk); end
|
||||
|
||||
Reference in New Issue
Block a user