Категория: ux · Приоритет: medium · Размер: M · Ранг: 5/10
Что построить
Switch «Включён» в строке таблицы пользователей и в форме редактирования. Отключение = ре-байнд того же клиента с enable:false (сохраняя uuid/subId), включение — обратно.
Паритет с конкурентами
3x-ui (enable-флаг на клиенте), Marzban/Marzneshin (status disabled), Remnawave/Hiddify (enable toggle). Включение/отключение без удаления — у всех.
Чего не хватает сейчас (код)
fleet/build.go:57 уже читает cs.Enable и пропускает выключенных, но subgen никогда сам не выставляет enable (add_client.go хардкодит enable:true), и в UI нет переключателя. #89 закладывает enabled-флаг — эта фича добавляет к нему UI-переключатель/кнопку в строке как ручной kill-switch и опору для автоотключения по квоте/сроку (#103/#104).
Зачем
Оператор мгновенно приостанавливает неоплатившего/злоупотребляющего пользователя и возвращает после оплаты, не теряя UUID/subId/историю. И ручной kill-switch, и фундамент для энфорсмент-джоб. Subgen сегодня умеет только удалять.
Предлагаемая реализация
Поверх #89: новый метод xui-клиента UpdateClient (POST /panel/api/clients/update/:email с enable) — один файл update_client.go + httptest-тест; provisioning.SetEnabled (re-bind того же uuid с флагом). Ручка user_set_enabled (openapi → ogen), тонкий хендлер (sentinel→4xx). Во Vue — switch в строке/форме. ClientSpec.Enable вместо хардкода.
Затронутые файлы
internal/entity/panel.go (ClientSpec.Enable), internal/clients/xui/update_client.go (новый) + тест, contract.go, add_client.go
internal/service/provisioning/service.go (SetEnabled), openapi/user_set_enabled.yaml (новый)
internal/handlers/user_set_enabled/, internal/handlers/web/static/{app.js,index.html}
Продуктовый ресёрч: изучены аналоги (Marzban/Marzneshin, 3x-ui, Remnawave, Hiddify, sub-store + клиентские стандарты импорта). Паритет и subgen-gap код-обоснованы. Ранг = продуктовый приоритет.
Категория: ux · Приоритет: medium · Размер: M · Ранг: 5/10
Что построить
Switch «Включён» в строке таблицы пользователей и в форме редактирования. Отключение = ре-байнд того же клиента с
enable:false(сохраняя uuid/subId), включение — обратно.Паритет с конкурентами
3x-ui (enable-флаг на клиенте), Marzban/Marzneshin (status
disabled), Remnawave/Hiddify (enable toggle). Включение/отключение без удаления — у всех.Чего не хватает сейчас (код)
fleet/build.go:57уже читаетcs.Enableи пропускает выключенных, но subgen никогда сам не выставляет enable (add_client.goхардкодитenable:true), и в UI нет переключателя. #89 закладываетenabled-флаг — эта фича добавляет к нему UI-переключатель/кнопку в строке как ручной kill-switch и опору для автоотключения по квоте/сроку (#103/#104).Зачем
Оператор мгновенно приостанавливает неоплатившего/злоупотребляющего пользователя и возвращает после оплаты, не теряя UUID/subId/историю. И ручной kill-switch, и фундамент для энфорсмент-джоб. Subgen сегодня умеет только удалять.
Предлагаемая реализация
Поверх #89: новый метод xui-клиента
UpdateClient(POST /panel/api/clients/update/:emailсenable) — один файлupdate_client.go+ httptest-тест;provisioning.SetEnabled(re-bind того же uuid с флагом). Ручкаuser_set_enabled(openapi → ogen), тонкий хендлер (sentinel→4xx). Во Vue — switch в строке/форме.ClientSpec.Enableвместо хардкода.Затронутые файлы
internal/entity/panel.go(ClientSpec.Enable),internal/clients/xui/update_client.go(новый) + тест,contract.go,add_client.gointernal/service/provisioning/service.go(SetEnabled),openapi/user_set_enabled.yaml(новый)internal/handlers/user_set_enabled/,internal/handlers/web/static/{app.js,index.html}Продуктовый ресёрч: изучены аналоги (Marzban/Marzneshin, 3x-ui, Remnawave, Hiddify, sub-store + клиентские стандарты импорта). Паритет и subgen-gap код-обоснованы. Ранг = продуктовый приоритет.