gendesign/data/sql/100_user_weight_profiles_default_seed.sql
lekss361 a6e4ff0407 feat(#114): seed 3 default weight presets + include_system API param
Add SQL migration 100_user_weight_profiles_default_seed.sql with system
presets Эконом/Комфорт/Бизнес (user_id='__system__'). Migration is
idempotent via ON CONFLICT DO UPDATE.

Backend:
- weight_profiles.py: add SYSTEM_USER_ID constant + list_profiles_with_system()
- admin_weight_profiles.py: add include_system query param to GET list endpoint

Tests: 3 new tests covering include_system flag and service sentinel behaviour.
2026-05-16 22:49:56 +03:00

90 lines
3.2 KiB
PL/PgSQL

-- 100_user_weight_profiles_default_seed.sql
-- Системные preset-профили весов POI для Site Finder.
-- Per #114 (Макс feedback): садики и Мегамарт должны иметь разные веса.
--
-- Apply order: после 90_user_weight_profiles.sql (таблица уже существует)
-- Dependencies: user_weight_profiles table
--
-- Sentinel owner: '__system__' — не является реальным user_id,
-- используется только для системных presets.
-- UI: dropdown показывает system presets всем пользователям через
-- GET /api/v1/admin/site-finder/weight-profiles?user_id=__system__
-- или include_system=true (добавлен в #114 seed PR).
--
-- Idempotent: ON CONFLICT (user_id, profile_name) DO UPDATE — обновляет
-- веса если preset уже существует (safe re-apply на prod).
BEGIN;
INSERT INTO user_weight_profiles
(user_id, profile_name, weights, is_default, description)
VALUES
(
'__system__',
'Эконом',
'{
"school": 1.2,
"kindergarten": 1.0,
"pharmacy": 0.8,
"hospital": 0.5,
"shop_mall": 0.8,
"shop_supermarket": 1.5,
"shop_small": 1.0,
"park": 1.2,
"bus_stop": 1.0,
"metro_stop": 0.8,
"tram_stop": 0.5
}'::jsonb,
FALSE,
'Эконом-класс: доступность магазинов и транспорта важнее премиальной инфраструктуры'
),
(
'__system__',
'Комфорт',
'{
"school": 1.5,
"kindergarten": 1.8,
"pharmacy": 0.8,
"hospital": 0.6,
"shop_mall": 1.0,
"shop_supermarket": 1.2,
"shop_small": 0.5,
"park": 1.8,
"bus_stop": 0.5,
"metro_stop": 1.2,
"tram_stop": -0.3
}'::jsonb,
FALSE,
'Комфорт-класс: парки, детсады и школы в приоритете — семейная аудитория'
),
(
'__system__',
'Бизнес',
'{
"school": 1.0,
"kindergarten": 0.8,
"pharmacy": 0.6,
"hospital": 0.5,
"shop_mall": 2.0,
"shop_supermarket": 0.8,
"shop_small": 0.3,
"park": 2.0,
"bus_stop": 0.2,
"metro_stop": 2.5,
"tram_stop": -0.5
}'::jsonb,
FALSE,
'Бизнес-класс: метро, ТЦ и парки в приоритете — платёжеспособная аудитория'
)
ON CONFLICT (user_id, profile_name)
DO UPDATE SET
weights = EXCLUDED.weights,
description = EXCLUDED.description,
updated_at = NOW();
COMMENT ON TABLE user_weight_profiles IS
'POI weight profiles для site_finder. Per #114 (Макс feedback). '
'weights = {"school": 1.5, "kindergarten": 1.5, "shop_mall": 1.2, ...}. '
'Системные presets: user_id = ''__system__'' (3 preset: Эконом/Комфорт/Бизнес).';
COMMIT;