H1 (critical): reorder send_support_message — get_or_create_thread now runs AFTER a successful Telegram send, not before. Prod runs a single uvicorn process with no --workers on a sync SQLAlchemy engine sharing one event loop; holding a row-lock across the Telegram call (which can legally take minutes on 429/5xx worker-grade retries) risked freezing the entire API on a second concurrent request from the same user. send_message now also accepts explicit timeout/max_retries so the interactive endpoint uses a bounded budget instead of inheriting the long-polling worker's retry policy. M1: web_support_messages and tg_support_messages both gain a support_chat_id column (188 migration for the already-applied tg_support_messages table; 187 edited in place since it hasn't shipped yet). bridge._handle_group_reply now resolves BOTH the Telegram and web candidate under the CURRENT support_chat_id and refuses delivery loudly (logger.error) if both match, instead of silently preferring the Telegram path — closing a cross-table misroute risk that would surface if the support group is ever recreated. M2: a media reply to a web-mirrored message (including photos with a caption) is now refused in full with an explicit notice back in the topic, instead of silently delivering just the caption text or logging a WARNING nobody sees. M3: list_support_messages/get_support_unread/mark_support_read switched from async def to def — their bodies are pure sync psycopg calls; running them as async def executed blocking DB work directly on the event loop. M5: list_messages now takes a bounded LIMIT (last N, chronological) so a long-lived thread doesn't return its entire history on every poll. L1-L4: warn when Telegram doesn't return a message_id (routing dead-end), rate limit is peeked before send and only recorded on success (failed attempts no longer burn the budget), SlidingWindowLimiter gained the same empty-bucket cleanup as RateLimitMiddleware, and _require_username now strips whitespace so a proxy-injected space can't fork a second thread. L5: removed 187 from _manifest_applied.txt — the deploy pipeline tracks applied migrations via _schema_migrations, not this file, and keeping an unmerged migration name out of it preserves the option to rename before merge without tripping the "can't rename applied migrations" test.
178 lines
6.6 KiB
Text
178 lines
6.6 KiB
Text
# _manifest_applied.txt — CONTRACT (issue #2216)
|
||
#
|
||
# Отсортированный список ВСЕХ имён миграций (bare filename) в data/sql/,
|
||
# которые на момент коммита уже применены/забейслайнены на проде.
|
||
# Прод трекает миграции по bare-filename в public._schema_migrations —
|
||
# переименование или удаление применённого файла => повторный прогон на
|
||
# проде (новый filename считается неприменённым) => дубль-эффекты/ошибки.
|
||
#
|
||
# ПРАВИЛА (enforced tests/test_migrations_manifest.py):
|
||
# 1. Каждое имя здесь ОБЯЗАНО существовать в data/sql/ (нельзя rename/rm applied).
|
||
# 2. Новый .sql-файл => НЕ переиспользуй NN-префикс (кроме 6 grandfathered дублей).
|
||
# 3. Добавляя новую миграцию — допиши её имя сюда В ТОМ ЖЕ PR (список отсортирован).
|
||
#
|
||
# Комментарии (# ...) и пустые строки тест игнорирует.
|
||
001_trade_in_estimates.sql
|
||
002_core_tables.sql
|
||
003_seed_deals.sql
|
||
004_extend_trade_in_estimates.sql
|
||
005_geocode_tracking.sql
|
||
007_estimate_photos.sql
|
||
008_crm_fields.sql
|
||
009_houses.sql
|
||
010_houses_alter.sql
|
||
011_listings_alter.sql
|
||
012_sellers.sql
|
||
013_listings_alter_seller.sql
|
||
014_house_reviews.sql
|
||
015_scrape_runs.sql
|
||
016_listings_snapshots.sql
|
||
017_house_placement_history.sql
|
||
018_avito_imv_evaluations.sql
|
||
019_listings_alter_cian.sql
|
||
020_houses_alter_cian.sql
|
||
021_management_companies.sql
|
||
022_agents_table.sql
|
||
023_offer_price_history.sql
|
||
024_houses_price_dynamics.sql
|
||
025_house_reliability_checks.sql
|
||
026_external_valuations.sql
|
||
027_cian_session_cookies.sql
|
||
028_matching_tables.sql
|
||
029_extend_matching_valuation_dynamics.sql
|
||
030_avito_imv_cache_key_unique.sql
|
||
031_houses_alter_yandex.sql
|
||
032_yandex_history.sql
|
||
033_listings_alter_yandex.sql
|
||
034_trade_in_estimates_geom.sql
|
||
035_drop_duplicate_indexes.sql
|
||
040_houses_extend.sql
|
||
041_house_sources_noop.sql
|
||
042_listing_sources_price_divergence_idx.sql
|
||
043_house_reviews_extend.sql
|
||
044_external_valuations_link.sql
|
||
045_house_placement_history_extend.sql
|
||
046_views.sql
|
||
047_cian_history_sanitize.sql
|
||
050_search_optimization.sql
|
||
051_scrape_runs_extend.sql
|
||
052_scrape_schedules.sql
|
||
053_scraper_settings.sql
|
||
054_scraper_settings_global.sql
|
||
060_postgres_fdw_extension.sql
|
||
061_drop_legacy_cad_buildings.sql
|
||
062_clean_avito_addresses.sql
|
||
063_backfill_houses_and_link_listings.sql
|
||
064_house_imv_phase_c.sql
|
||
065_trade_in_estimates_floor_optional.sql
|
||
066_address_mismatch_audit.sql
|
||
067_v_street_sales_vs_listings.sql
|
||
068_drop_v_street_sales_vs_listings.sql
|
||
069_trade_in_estimates_dadata_fields.sql
|
||
070_houses_dadata_enrichment.sql
|
||
071_houses_cian_zhk_url.sql
|
||
072_scrape_schedules_seed_cian_rosreestr.sql
|
||
073_normalize_repair_state.sql
|
||
075_backfill_repair_state_from_description.sql
|
||
076_account_estimate_quota.sql
|
||
077_dedup_hash_plain_key_backfill.sql
|
||
078_scrape_schedules_seed_yandex_sweep.sql
|
||
079_listing_source_history.sql
|
||
080_asking_to_sold_ratios.sql
|
||
081_trade_in_estimates_expected_sold.sql
|
||
082_scrape_schedules_seed_ratio_refresh.sql
|
||
083_trade_in_estimates_created_by.sql
|
||
084_brand_praktika_fill.sql
|
||
084_scrape_schedules_seed_n1_sweep.sql
|
||
085_quarter_price_index_fdw.sql
|
||
086_deals_address_trgm_index.sql
|
||
087_fdw_server_options.sql
|
||
088_scrape_schedules_seed_search_matview_refresh.sql
|
||
089_listings_geo_precision.sql
|
||
090_scrape_schedules_seed_deactivate_stale_avito.sql
|
||
091_scrape_schedules_seed_yandex_address_backfill.sql
|
||
092_sber_price_index.sql
|
||
093_scrape_schedules_seed_sber_index_pull.sql
|
||
094_cadastral_unify.sql
|
||
095_dead_schema.sql
|
||
096_scrape_schedules_seed_rosreestr_quarter_poll.sql
|
||
097_index_hygiene.sql
|
||
098_asking_to_sold_ratios_tiered.sql
|
||
099_brand_praktika_logo_wordmark.sql
|
||
100_enable_deactivate_stale_avito.sql
|
||
101_gendesign_reader_role.sql
|
||
102_grant_listings_gendesign_reader.sql
|
||
103_scrape_schedules_seed_newbuilding_enrich.sql
|
||
104_index_hygiene_geom_dedup.sql
|
||
105_market_schema_yandex_enrichment.sql
|
||
106_scrape_schedules_seed_yandex_newbuilding_sweep.sql
|
||
107_scrape_schedules_seed_cian_city_sweep.sql
|
||
108_clean_avito_addresses_v2.sql
|
||
108_merge_duplicate_houses.sql
|
||
109_asking_to_sold_ratio_segment_filter.sql
|
||
110_scrape_schedules_seed_geocode_missing_listings.sql
|
||
111_listings_avito_detail_fields.sql
|
||
112_scrape_schedules_seed_avito_detail_backfill.sql
|
||
113_deactivate_ghost_duplicate_listings.sql
|
||
113_yandex_detail_backfill.sql
|
||
114_disable_n1_sweep.sql
|
||
115_scrape_schedules_seed_deactivate_stale_yandex_cian.sql
|
||
116_offer_price_history_change_trigger.sql
|
||
117_listings_last_seen_deactivate_index.sql
|
||
118_enable_cian_city_sweep.sql
|
||
119_yandex_city_sweep_center_combos.sql
|
||
120_restore_partial_active_indexes.sql
|
||
121_remove_brand_praktika.sql
|
||
121_yandex_rich_fields.sql
|
||
122_enable_domclick_city_sweep.sql
|
||
123_avito_newbuilding_sweep_schedule.sql
|
||
124_cad_buildings_local.sql
|
||
124_deglue_avito_addresses.sql
|
||
125_scrape_schedules_seed_cadastral_geo_match.sql
|
||
126_scrape_schedules_seed_cian_full_load.sql
|
||
127_scrape_schedules_seed_avito_full_load.sql
|
||
128_listings_card_hash.sql
|
||
129_avito_full_load_incremental_split.sql
|
||
130_backfill_listings_house_id_fk.sql
|
||
130_ekb_geoportal_buildings.sql
|
||
131_fix_diff_percent_overflow.sql
|
||
132_scrape_schedules_seed_house_imv.sql
|
||
133_listings_uq_source_source_id.sql
|
||
134_listings_geom_geography_gist.sql
|
||
135_scrape_schedules_seed_house_dedup_merge.sql
|
||
136_backfill_listings_house_id_fk_source_identity.sql
|
||
137_listings_addr_norm_trgm.sql
|
||
138_domclick_bff_rewrite_schedule.sql
|
||
139_premium_houses.sql
|
||
140_yandex_house_type_backfill.sql
|
||
141_cian_promote_house_type.sql
|
||
142_premium_buildings_curated.sql
|
||
143_building_sale_share_schema.sql
|
||
144_gar_canon_addr_match.sql
|
||
145_building_sale_share_plausible_denom.sql
|
||
146_sale_share_45d_and_zhkh_denom.sql
|
||
147_canon_strip_geo_prefixes.sql
|
||
148_dedup_apartments_in_sale_share.sql
|
||
149_zhkh_priority_denominator.sql
|
||
150_sale_share_listing_geo_filter.sql
|
||
151_clean_bare_street_aliases.sql
|
||
152_sale_share_floors_guard.sql
|
||
153_sale_share_listings_floors_plausibility.sql
|
||
154_market_contract_views.sql
|
||
155_reader_grants_to_contract_views.sql
|
||
156_revoke_raw_from_reader.sql
|
||
157_scrape_proxies.sql
|
||
158_seed_proxy_healthcheck_schedule.sql
|
||
159_houses_fias_idx.sql
|
||
160_seed_deactivate_stale_domklik_n1.sql
|
||
161_backfill_scraped_at_active_recent.sql
|
||
162_seed_deals_freshness_monitor.sql
|
||
163_disable_deactivate_stale_domklik.sql
|
||
164_yandex_url_canonicalize_active_dups.sql
|
||
165_remove_n1_source.sql
|
||
166_purge_listings_phones.sql
|
||
167_drop_client_pii.sql
|
||
168_fdw_osm_poi_ekb.sql
|
||
169_osm_poi_ekb_local.sql
|
||
170_scrape_schedules_seed_osm_poi_ekb_refresh.sql
|
||
172_trade_in_leads.sql
|