···12551255 return err
12561256 })
1257125712581258+ // the generalize-stars-subject migration removed the foreign key constraint
12591259+ // from stars, so deleting a repo no longer cascades to its stars.
12601260+ // this trigger restores that behaviour at the application level.
12611261+ orm.RunMigration(conn, logger, "add-star-cleanup-trigger", func(tx *sql.Tx) error {
12621262+ _, err := tx.Exec(`
12631263+ create trigger if not exists delete_stars_on_repo_delete
12641264+ after delete on repos
12651265+ begin
12661266+ delete from stars where subject_at = OLD.at_uri;
12671267+ end;
12681268+ `)
12691269+ return err
12701270+ })
12711271+12721272+ // purge stars that reference repos deleted before the trigger was added.
12731273+ orm.RunMigration(conn, logger, "cleanup-orphaned-stars", func(tx *sql.Tx) error {
12741274+ _, err := tx.Exec(`
12751275+ delete from stars
12761276+ where subject_at like 'at://%/sh.tangled.repo/%'
12771277+ and subject_at not in (select at_uri from repos);
12781278+ `)
12791279+ return err
12801280+ })
12811281+12581282 return &DB{
12591283 db,
12601284 logger,