feat: implement stop alias management for Telegram import

- Added TelegramStopAliasService for handling stop aliases in the database.
- Created API endpoints for managing stop aliases (list, create, update, delete).
- Introduced TelegramStopAliases component in the frontend for user interaction with stop aliases.
- Updated TelegramImportService to utilize stop aliases for message processing.
- Enhanced telegramCancellationParser to resolve stop names using aliases.
- Added migration script to create telegram_stop_aliases table and seed initial data.
- Updated documentation to include details about stop alias functionality.
This commit is contained in:
2026-10-03 01:31:11 +03:00
parent f7f0b039dd
commit 666a0b268f
12 changed files with 439 additions and 25 deletions

View File

@@ -0,0 +1,26 @@
CREATE TABLE IF NOT EXISTS telegram_stop_aliases (
id SERIAL PRIMARY KEY,
city_id INTEGER NOT NULL REFERENCES cities(id) ON DELETE CASCADE,
alias VARCHAR(200) NOT NULL,
normalized_alias VARCHAR(200) NOT NULL CHECK (length(normalized_alias) > 0),
stop_id INTEGER NOT NULL REFERENCES stops(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (city_id, normalized_alias)
);
-- Known carrier abbreviations are seeded only when the Polotsk stop is unique.
-- Ambiguous platforms must be selected explicitly by an administrator.
WITH defaults(alias, normalized_alias, stop_name) AS (
VALUES ('АВ/ВОКЗАЛ', 'аввокзал', 'Автовокзал'),
('ЗОДЧЕГО', 'зодчего', 'Зодчего Иоанна')
), candidates AS (
SELECT c.id AS city_id, d.alias, d.normalized_alias, min(s.id) AS stop_id
FROM defaults d JOIN cities c ON c.slug = 'polotsk'
JOIN stops s ON s.city_id = c.id AND s.is_active = true
AND lower(trim(s.name)) = lower(d.stop_name)
GROUP BY c.id, d.alias, d.normalized_alias HAVING count(*) = 1
)
INSERT INTO telegram_stop_aliases(city_id, alias, normalized_alias, stop_id)
SELECT city_id, alias, normalized_alias, stop_id FROM candidates
ON CONFLICT (city_id, normalized_alias) DO NOTHING;