ACCOUNT_DELETION.md §4.4 (AD10, AD11). api.onUserDeleting queues every linked
account in the new shard_pending_unlinks table, then calls the sidecar's
DELETE /link/{account} (actor web:account-deletion) and drops the mirror on 200/404.
A shard that is away leaves the row pending, retried on WS reconnect and on a live
server.hello; a protected account (403) is refused and listed on Admin -> Shard as
still linked on the shard. A live mob.login without the deleted user's webId clears
the row. coreApi ^1.20.0; core-ref pinned to website#232's merge (7bd93b8).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
75 lines
3.9 KiB
SQL
75 lines
3.9 KiB
SQL
-- ── module-uo's teardown ──────────────────────────────────────────────────
|
|
--
|
|
-- Destructive, and run ONLY by an explicit admin purge (MODULE_API.md §2.6).
|
|
-- Nothing on the boot path ever executes this file — uninstalling a module
|
|
-- leaves its data alone, and removing the data is a separate decision an
|
|
-- operator has to make on purpose.
|
|
--
|
|
-- It exists because `schema.sql` does. A module that can create tables and
|
|
-- cannot drop them leaves an operator with orphaned data and no supported way
|
|
-- to remove it, which is why core refuses to load a module that declares one
|
|
-- without the other.
|
|
--
|
|
-- **The order is the reverse of creation, and that is load-bearing**: two of
|
|
-- these tables carry a foreign key into core's `users`, and several reference
|
|
-- each other. Dropping a parent before its children fails on the constraint,
|
|
-- and a purge that fails halfway is worse than one that does not run — it
|
|
-- leaves exactly the orphaned data this file exists to remove. `IF EXISTS` on
|
|
-- every line so a partially-installed module still tears down cleanly.
|
|
--
|
|
-- What is NOT here, deliberately: rows this module wrote into core's tables.
|
|
-- `notification_subs` rows for `shard.*` streams and `announce_job_legs` rows
|
|
-- with leg `towncrier` belong to core's tables, and a module does not delete
|
|
-- from those — core prunes them when it drops the registrations, which it can
|
|
-- do because it knows which registrant owned what. The two `settings` rows
|
|
-- schema.sql seeds (`game_account_signup`, `uo_link_protocol_3_migrated`) are
|
|
-- the same case with an extra reason: the second is a one-shot MIGRATION
|
|
-- marker, and deleting it would re-arm a protocol bump against tables this
|
|
-- file has just dropped.
|
|
|
|
-- Account deletion's queue (MODULE_API 1.20.0), the newest table. No foreign key:
|
|
-- its rows outlive the users they name, by design.
|
|
DROP TABLE IF EXISTS `shard_pending_unlinks`;
|
|
|
|
-- The Asset Bridge's three (phase 3). No foreign keys of their own, so they lead:
|
|
-- `shard_creature_bodies.slug` mirrors an atlas slug and `shard_assets.body` a body
|
|
-- id, but neither is declared as a constraint — the atlas tables are rebuilt from
|
|
-- scratch on every refresh, and an FK into a table that is emptied and refilled
|
|
-- would make an ordinary re-parse fail on rows that are about to be re-inserted.
|
|
--
|
|
-- The uploaded PNGs are NOT removed here. They live under the uploads directory
|
|
-- alongside the operator's own artwork, this file drops tables rather than files,
|
|
-- and a purge that deleted an operator's hand-drawn creature portraits because
|
|
-- they shared a directory with imported ones would be unrecoverable.
|
|
DROP TABLE IF EXISTS `shard_asset_meta`;
|
|
DROP TABLE IF EXISTS `shard_creature_bodies`;
|
|
DROP TABLE IF EXISTS `shard_assets`;
|
|
DROP TABLE IF EXISTS `shard_atlas_pending`;
|
|
DROP TABLE IF EXISTS `shard_atlas_meta`;
|
|
DROP TABLE IF EXISTS `shard_cliloc_meta`;
|
|
DROP TABLE IF EXISTS `shard_clilocs`;
|
|
DROP TABLE IF EXISTS `shard_champion_spawns`;
|
|
DROP TABLE IF EXISTS `shard_landmarks`;
|
|
DROP TABLE IF EXISTS `shard_regions`;
|
|
DROP TABLE IF EXISTS `shard_spawn_point_types`;
|
|
DROP TABLE IF EXISTS `shard_spawn_points`;
|
|
DROP TABLE IF EXISTS `shard_spawn_creatures`;
|
|
DROP TABLE IF EXISTS `shard_feature_visibility`;
|
|
DROP TABLE IF EXISTS `shard_vendor_items`;
|
|
DROP TABLE IF EXISTS `shard_vendors`;
|
|
DROP TABLE IF EXISTS `shard_points_boards`;
|
|
DROP TABLE IF EXISTS `shard_ruleset`;
|
|
DROP TABLE IF EXISTS `shard_presence`;
|
|
DROP TABLE IF EXISTS `shard_governor_terms`;
|
|
DROP TABLE IF EXISTS `shard_governors`;
|
|
DROP TABLE IF EXISTS `shard_guild_members`;
|
|
DROP TABLE IF EXISTS `shard_guilds`;
|
|
DROP TABLE IF EXISTS `shard_pages`;
|
|
DROP TABLE IF EXISTS `shard_champs`;
|
|
DROP TABLE IF EXISTS `shard_account_links`;
|
|
DROP TABLE IF EXISTS `shard_houses`;
|
|
DROP TABLE IF EXISTS `shard_economy`;
|
|
DROP TABLE IF EXISTS `shard_online`;
|
|
DROP TABLE IF EXISTS `shard_events`;
|
|
DROP TABLE IF EXISTS `uo_link_config`;
|