Rework entity schema: rename Tracker→NotificationTracker, add CommandConfig/ CommandTracker/CommandTrackerListener entities for decoupled command handling. Commands now resolve through CommandTracker→CommandConfig instead of TelegramBot.commands_config. Smart ref-counted bot polling based on active listeners. Add chat_action to telegram targets. Full frontend CRUD pages for command configs and command trackers. Idempotent SQLite migrations. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4.3 KiB
Phase 3: CommandConfig & CommandTracker CRUD API
Status: ⬜ Not Started Parent plan: PLAN.md Domain: backend
Objective
Create full CRUD API routes for CommandConfig, CommandTracker, and CommandTrackerListener management. These endpoints let users create command configurations (scoped to provider type), create command trackers that link a provider to a command config, and attach/detach listeners (telegram bots) to command trackers.
Tasks
-
Task 1: Create
api/command_configs.pywith CRUD routes:GET /api/command-configs— list all for current user (+ system defaults with user_id=0)POST /api/command-configs— create new (validate provider_type, enabled_commands against registry)GET /api/command-configs/{id}— get singlePUT /api/command-configs/{id}— update (validate ownership)DELETE /api/command-configs/{id}— delete (check not in use by any command tracker)- Response should include all fields: id, user_id, provider_type, name, icon, enabled_commands, locale, response_mode, default_count, rate_limits, created_at
-
Task 2: Create
api/command_trackers.pywith CRUD routes:GET /api/command-trackers— list all for current user, include linked listeners countPOST /api/command-trackers— create new (validate provider_id exists, command_config_id exists, provider_type matches between provider and config)GET /api/command-trackers/{id}— get single with listenersPUT /api/command-trackers/{id}— update (name, icon, enabled, command_config_id — validate provider_type match)DELETE /api/command-trackers/{id}— delete (cascade delete listeners)POST /api/command-trackers/{id}/enable— enablePOST /api/command-trackers/{id}/disable— disable
-
Task 3: Add listener management endpoints to command_trackers.py:
GET /api/command-trackers/{id}/listeners— list listeners for a command trackerPOST /api/command-trackers/{id}/listeners— add listener (body: {listener_type, listener_id}). Validate: listener exists (e.g., TelegramBot with that ID), no duplicate (unique constraint), user owns the listener.DELETE /api/command-trackers/{id}/listeners/{listener_id}— remove listener
-
Task 4: Add validation helpers:
- Validate
enabled_commandsagainstcommands/registry.pyknown commands for the given provider_type - Validate
provider_typematch: CommandConfig.provider_type must match ServiceProvider.type of the CommandTracker's provider - Validate listener ownership: user must own the TelegramBot being attached
- Validate
-
Task 5: Register new routers in
main.py -
Task 6: Update
api/telegram_bots.py— remove the commands config endpoints (POST/telegram-bots/{id}/commands, GET/telegram-bots/{id}/commands) since commands config now lives in CommandConfig entity. Keep the sync-commands endpoint but update it to accept a command_config_id parameter or read from command trackers.
Files to Modify/Create
packages/server/src/notify_bridge_server/api/command_configs.py— new filepackages/server/src/notify_bridge_server/api/command_trackers.py— new filepackages/server/src/notify_bridge_server/main.py— register new routerspackages/server/src/notify_bridge_server/api/telegram_bots.py— remove old commands config endpoints
Acceptance Criteria
- Full CRUD for CommandConfig with provider_type validation
- Full CRUD for CommandTracker with provider↔config type matching
- Listener add/remove with ownership validation and uniqueness
- Old telegram bot commands config endpoints removed
- Server starts and all new endpoints respond correctly
Notes
- The command registry currently defines commands globally. In future, commands could be provider-scoped. For now, validate enabled_commands against the flat registry list.
- CommandConfig with user_id=0 could serve as system defaults (like TemplateConfig), but this is optional for Phase 3.
- The sync-commands endpoint on TelegramBot may need to resolve which commands to sync from attached CommandTrackers — this is wired up in Phase 4.
Review Checklist
- All tasks completed
- Code follows project conventions
- No unintended side effects
- Build passes
- Tests pass (new + existing)