Domain::Users::E621User aux table migration

This commit is contained in:
Dylan Knutson
2025-07-18 21:58:45 +00:00
parent ca7315c8ae
commit 598ffe8dbf
13 changed files with 3201 additions and 71 deletions

View File

@@ -36,7 +36,7 @@ PATH
GIT
remote: ssh://git@git.dy.mk:2221/dymk/has_aux_table.git
revision: ea33ffbb11b14989fa2ca0eae69c18a4cea2266d
revision: a526fb54f11dbe52acff4595c0c505971cdcdab9
branch: main
specs:
has_aux_table (0.1.0)

View File

@@ -65,7 +65,7 @@ class Domain::Inkbunny::Job::UserGalleryJob < Domain::Inkbunny::Job::Base
page += 1
end
user.scanned_gallery_at = Time.now
user.scanned_gallery_at = Time.current
user.save!
if processor.changed_posts.any?

View File

@@ -1,13 +1,5 @@
# typed: strict
class Domain::PostFile::InkbunnyPostFile < Domain::PostFile
# attr_json :ib_id, :integer
# attr_json :ib_detail_raw, ActiveModel::Type::Value.new
# attr_json :ib_created_at, ActiveModelUtcTimeValue.new
# attr_json :file_name, :string
# attr_json :md5_initial, :string
# attr_json :md5_full, :string
# attr_json :md5s, ActiveModel::Type::Value.new
# attr_json :file_order, :integer
aux_table :inkbunny
validates :ib_id, presence: true, uniqueness: true

View File

@@ -1,13 +1,13 @@
# typed: strict
class Domain::User < ReduxApplicationRecord
extend T::Helpers
include HasAuxTable
include AttrJsonRecordAliases
include HasCompositeToParam
include HasViewPrefix
include HasDescriptionHtmlForView
include HasTimestampsWithDueAt
include HasDomainType
include HasAuxTable
self.table_name = "domain_users"
abstract!

View File

@@ -1,11 +1,6 @@
# typed: strict
class Domain::User::E621User < Domain::User
attr_json :e621_id, :integer
attr_json :name, :string
attr_json :favs_are_hidden, :boolean
attr_json :num_other_favs_cached, :integer
attr_json :scanned_favs_status, :string
attr_json :registered_at, :datetime
aux_table :e621
enum :scanned_favs_status, { ok: "ok", error: "error" }, prefix: :scanned_favs

View File

@@ -0,0 +1,42 @@
# typed: strict
# frozen_string_literal: true
class AddAuxTablesForDomainUsersE621Users < ActiveRecord::Migration[7.2]
extend T::Sig
sig { void }
def change
mirai_tablespace!
create_aux_table :domain_users, :e621 do |t|
t.integer :e621_id, null: false, index: true
t.string :name, null: false, index: true
t.boolean :favs_are_hidden
t.integer :num_other_favs_cached
t.string :scanned_favs_status
t.datetime :registered_at
end
up_only { execute <<-SQL }
INSERT INTO domain_users_e621_aux (
base_table_id,
e621_id,
name,
favs_are_hidden,
num_other_favs_cached,
scanned_favs_status,
registered_at
)
SELECT
id as base_table_id,
(json_attributes->>'e621_id')::integer as e621_id,
(json_attributes->>'name')::text as name,
(json_attributes->>'favs_are_hidden')::boolean as favs_are_hidden,
(json_attributes->>'num_other_favs_cached')::integer as num_other_favs_cached,
(json_attributes->>'scanned_favs_status')::text as scanned_favs_status,
(json_attributes->>'registered_at')::timestamp as registered_at
FROM domain_users
WHERE type = 'Domain::User::E621User'
SQL
end
end

View File

@@ -3293,6 +3293,40 @@ CREATE TABLE public.domain_users (
);
--
-- Name: domain_users_e621_aux; Type: TABLE; Schema: public; Owner: -; Tablespace: mirai
--
CREATE TABLE public.domain_users_e621_aux (
base_table_id bigint NOT NULL,
e621_id integer NOT NULL,
name character varying NOT NULL,
favs_are_hidden boolean,
num_other_favs_cached integer,
scanned_favs_status character varying,
registered_at timestamp(6) without time zone
);
--
-- Name: domain_users_e621_aux_base_table_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.domain_users_e621_aux_base_table_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: domain_users_e621_aux_base_table_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.domain_users_e621_aux_base_table_id_seq OWNED BY public.domain_users_e621_aux.base_table_id;
--
-- Name: domain_users_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
@@ -4969,6 +5003,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_e621_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_users_e621_aux ALTER COLUMN base_table_id SET DEFAULT nextval('public.domain_users_e621_aux_base_table_id_seq'::regclass);
--
-- Name: domain_users_inkbunny_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
--
@@ -5808,6 +5849,14 @@ ALTER TABLE ONLY public.domain_user_search_names
ADD CONSTRAINT domain_user_search_names_pkey PRIMARY KEY (id);
--
-- Name: domain_users_e621_aux domain_users_e621_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: mirai
--
ALTER TABLE ONLY public.domain_users_e621_aux
ADD CONSTRAINT domain_users_e621_aux_pkey PRIMARY KEY (base_table_id);
--
-- Name: domain_users_inkbunny_aux domain_users_inkbunny_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: mirai
--
@@ -7750,6 +7799,27 @@ 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_e621_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -; Tablespace: mirai
--
CREATE INDEX index_domain_users_e621_aux_on_base_table_id ON public.domain_users_e621_aux USING btree (base_table_id);
--
-- Name: index_domain_users_e621_aux_on_e621_id; Type: INDEX; Schema: public; Owner: -; Tablespace: mirai
--
CREATE INDEX index_domain_users_e621_aux_on_e621_id ON public.domain_users_e621_aux USING btree (e621_id);
--
-- Name: index_domain_users_e621_aux_on_name; Type: INDEX; Schema: public; Owner: -; Tablespace: mirai
--
CREATE INDEX index_domain_users_e621_aux_on_name ON public.domain_users_e621_aux USING btree (name);
--
-- Name: index_domain_users_inkbunny_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -; Tablespace: mirai
--
@@ -9295,6 +9365,14 @@ ALTER TABLE ONLY public.domain_post_files_inkbunny_aux
ADD CONSTRAINT fk_rails_b4f96e5241 FOREIGN KEY (base_table_id) REFERENCES public.domain_post_files(id);
--
-- Name: domain_users_e621_aux fk_rails_b5bacbced6; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_users_e621_aux
ADD CONSTRAINT fk_rails_b5bacbced6 FOREIGN KEY (base_table_id) REFERENCES public.domain_users(id);
--
-- Name: domain_users_inkbunny_aux fk_rails_c2d597dcc4; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -9438,6 +9516,7 @@ ALTER TABLE ONLY public.domain_twitter_tweets
SET search_path TO "$user", public;
INSERT INTO "schema_migrations" (version) VALUES
('20250718195345'),
('20250718165332'),
('20250718162608'),
('20250717204152'),

View File

@@ -504,12 +504,27 @@ class Domain::User::E621User
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::UserAvatar) }
def build_avatar(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersE621Aux) }
def build_domain_users_e621_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::UserAvatar) }
def create_avatar(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::Domain::UserAvatar) }
def create_avatar!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersE621Aux) }
def create_domain_users_e621_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersE621Aux) }
def create_domain_users_e621_aux!(*args, &blk); end
sig { returns(T.nilable(::DomainUsersE621Aux)) }
def domain_users_e621_aux; end
sig { params(value: T.nilable(::DomainUsersE621Aux)).void }
def domain_users_e621_aux=(value); end
sig { returns(T::Array[T.untyped]) }
def faved_post_ids; end
@@ -583,9 +598,15 @@ class Domain::User::E621User
sig { returns(T.nilable(::Domain::UserAvatar)) }
def reload_avatar; end
sig { returns(T.nilable(::DomainUsersE621Aux)) }
def reload_domain_users_e621_aux; end
sig { void }
def reset_avatar; end
sig { void }
def reset_domain_users_e621_aux; end
sig { returns(T::Array[T.untyped]) }
def uploaded_post_ids; end
@@ -744,12 +765,6 @@ class Domain::User::E621User
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def none(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def not_scanned_favs_error(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def not_scanned_favs_ok(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def null_relation?(*args, &blk); end
@@ -806,12 +821,6 @@ class Domain::User::E621User
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def rewhere(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def scanned_favs_error(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def scanned_favs_ok(*args, &blk); end
sig { params(args: T.untyped).returns(PrivateAssociationRelation) }
sig do
params(
@@ -1532,7 +1541,7 @@ class Domain::User::E621User
sig { returns(T.nilable(::String)) }
def scanned_favs_status; end
sig { params(value: T.nilable(T.any(::String, ::Symbol))).returns(T.nilable(T.any(::String, ::Symbol))) }
sig { params(value: T.nilable(::String)).returns(T.nilable(::String)) }
def scanned_favs_status=(value); end
sig { returns(T::Boolean) }
@@ -1553,12 +1562,7 @@ class Domain::User::E621User
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def scanned_favs_status_change_to_be_saved; end
sig do
params(
from: T.nilable(T.any(::String, ::Symbol)),
to: T.nilable(T.any(::String, ::Symbol))
).returns(T::Boolean)
end
sig { params(from: T.nilable(::String), to: T.nilable(::String)).returns(T::Boolean) }
def scanned_favs_status_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::String)) }
@@ -1567,12 +1571,7 @@ class Domain::User::E621User
sig { returns(T.nilable([T.nilable(::String), T.nilable(::String)])) }
def scanned_favs_status_previous_change; end
sig do
params(
from: T.nilable(T.any(::String, ::Symbol)),
to: T.nilable(T.any(::String, ::Symbol))
).returns(T::Boolean)
end
sig { params(from: T.nilable(::String), to: T.nilable(::String)).returns(T::Boolean) }
def scanned_favs_status_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::String)) }
@@ -1992,12 +1991,6 @@ class Domain::User::E621User
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def none(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def not_scanned_favs_error(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def not_scanned_favs_ok(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def null_relation?(*args, &blk); end
@@ -2054,12 +2047,6 @@ class Domain::User::E621User
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def rewhere(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def scanned_favs_error(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def scanned_favs_ok(*args, &blk); end
sig { params(args: T.untyped).returns(PrivateRelation) }
sig do
params(

View File

@@ -494,6 +494,9 @@ class Domain::User::InkbunnyUser
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_deep_update_log_entry(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersInkbunnyAux) }
def build_domain_users_inkbunny_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def build_shallow_update_log_entry(*args, &blk); end
@@ -509,6 +512,12 @@ class Domain::User::InkbunnyUser
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_deep_update_log_entry!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersInkbunnyAux) }
def create_domain_users_inkbunny_aux(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::DomainUsersInkbunnyAux) }
def create_domain_users_inkbunny_aux!(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(::HttpLogEntry) }
def create_shallow_update_log_entry(*args, &blk); end
@@ -527,6 +536,12 @@ class Domain::User::InkbunnyUser
sig { returns(T::Boolean) }
def deep_update_log_entry_previously_changed?; end
sig { returns(T.nilable(::DomainUsersInkbunnyAux)) }
def domain_users_inkbunny_aux; end
sig { params(value: T.nilable(::DomainUsersInkbunnyAux)).void }
def domain_users_inkbunny_aux=(value); end
sig { returns(T::Array[T.untyped]) }
def faved_post_ids; end
@@ -603,6 +618,9 @@ class Domain::User::InkbunnyUser
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_deep_update_log_entry; end
sig { returns(T.nilable(::DomainUsersInkbunnyAux)) }
def reload_domain_users_inkbunny_aux; end
sig { returns(T.nilable(::HttpLogEntry)) }
def reload_shallow_update_log_entry; end
@@ -612,6 +630,9 @@ class Domain::User::InkbunnyUser
sig { void }
def reset_deep_update_log_entry; end
sig { void }
def reset_domain_users_inkbunny_aux; end
sig { void }
def reset_shallow_update_log_entry; end
@@ -1399,7 +1420,7 @@ class Domain::User::InkbunnyUser
sig { returns(T::Boolean) }
def saved_change_to_scanned_favs_at?; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def saved_change_to_scanned_gallery_at; end
sig { returns(T::Boolean) }
@@ -1498,16 +1519,16 @@ class Domain::User::InkbunnyUser
sig { void }
def scanned_favs_at_will_change!; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_gallery_at; end
sig { params(value: T.nilable(::Time)).returns(T.nilable(::Time)) }
sig { params(value: T.nilable(::ActiveSupport::TimeWithZone)).returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_gallery_at=(value); end
sig { returns(T::Boolean) }
def scanned_gallery_at?; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_gallery_at_before_last_save; end
sig { returns(T.untyped) }
@@ -1516,28 +1537,38 @@ class Domain::User::InkbunnyUser
sig { returns(T::Boolean) }
def scanned_gallery_at_came_from_user?; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def scanned_gallery_at_change; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def scanned_gallery_at_change_to_be_saved; end
sig { params(from: T.nilable(::Time), to: T.nilable(::Time)).returns(T::Boolean) }
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def scanned_gallery_at_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_gallery_at_in_database; end
sig { returns(T.nilable([T.nilable(::Time), T.nilable(::Time)])) }
sig { returns(T.nilable([T.nilable(::ActiveSupport::TimeWithZone), T.nilable(::ActiveSupport::TimeWithZone)])) }
def scanned_gallery_at_previous_change; end
sig { params(from: T.nilable(::Time), to: T.nilable(::Time)).returns(T::Boolean) }
sig do
params(
from: T.nilable(::ActiveSupport::TimeWithZone),
to: T.nilable(::ActiveSupport::TimeWithZone)
).returns(T::Boolean)
end
def scanned_gallery_at_previously_changed?(from: T.unsafe(nil), to: T.unsafe(nil)); end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_gallery_at_previously_was; end
sig { returns(T.nilable(::Time)) }
sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def scanned_gallery_at_was; end
sig { void }

1489
sorbet/rbi/dsl/domain_users_e621_aux.rbi generated Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -233,7 +233,7 @@ class HasAuxTable::AuxTableConfig < ::T::Struct
def define_aux_attribute_delegate(method_name); end
# source://has_aux_table//lib/has_aux_table/aux_table_config.rb#125
sig { void }
sig { returns(T.untyped) }
def load_aux_schema; end
# source://has_aux_table//lib/has_aux_table/aux_table_config.rb#142
@@ -307,7 +307,7 @@ module HasAuxTable::ClassMethods
private
# source://has_aux_table//lib/has_aux_table.rb#199
# source://has_aux_table//lib/has_aux_table.rb#200
sig { params(load_schema_method: ::Method, config: ::HasAuxTable::AuxTableConfig).void }
def aux_config_load_schema!(load_schema_method, config); end
@@ -317,7 +317,7 @@ module HasAuxTable::ClassMethods
# Generate auxiliary model class dynamically
#
# source://has_aux_table//lib/has_aux_table.rb#74
# source://has_aux_table//lib/has_aux_table.rb#75
sig do
params(
aux_name: ::Symbol,
@@ -331,7 +331,7 @@ module HasAuxTable::ClassMethods
sig { params(config: ::HasAuxTable::AuxTableConfig).void }
def setup_attribute_getter_setter_hooks!(config); end
# source://has_aux_table//lib/has_aux_table.rb#142
# source://has_aux_table//lib/has_aux_table.rb#143
sig { params(config: ::HasAuxTable::AuxTableConfig).void }
def setup_attribute_types_hook!(config); end
@@ -343,13 +343,17 @@ module HasAuxTable::ClassMethods
sig { params(config: ::HasAuxTable::AuxTableConfig).void }
def setup_changed_hook!(config); end
# source://has_aux_table//lib/has_aux_table.rb#361
sig { params(config: ::HasAuxTable::AuxTableConfig).void }
def setup_enum_hook!(config); end
# source://has_aux_table//lib/has_aux_table.rb#255
sig { params(config: ::HasAuxTable::AuxTableConfig).void }
def setup_initialize_hook!(config); end
# Hook into schema loading to generate attribute accessors when schema is loaded
#
# source://has_aux_table//lib/has_aux_table.rb#183
# source://has_aux_table//lib/has_aux_table.rb#184
sig { params(config: ::HasAuxTable::AuxTableConfig).void }
def setup_load_schema_hook!(config); end

View File

@@ -16,6 +16,7 @@ describe Domain::E621::Job::ScanPostFavsJob do
1_775_383,
954_593,
]
Domain::User::E621User.load_schema
e621_user_ids.each do |e621_id|
create(:domain_user_e621_user, e621_id: e621_id)
end