feat(web): 账号即环境 UI 收敛——删 /browsers 页面,环境并入账号详情
- 删除 /browsers 列表/创建/详情页与菜单项,运行环境不再是独立资源 - 账号详情:GET /api/phase-a/accounts/:id 内联 environment 字段 (网关/出口/绑定版本/运行实例/不可调度原因),固定资源卡直接展示 - 状态卡两态开关:暂停→「启动账号」(start=resume+启动环境), 运行中→「暂停账号」(联动停环境);出口重绑卡片内完成 (POST /network-exits/:id/rebind 返回内联 environment,出口切换不再跳环境页) - 删除 creator/settings 残留的转写服务字段(后端 settings 无此列) - helpers.ts accountReadiness 改用 runtime_id/runtime_cleanup_pending - network-exits 列表绑定账号列改由账号列表内联数据驱动 - 全量验证:go test ./...(PG)全绿、tsc --noEmit 通过、max build 通过、 node --test 12/12 通过
This commit is contained in:
@@ -71,13 +71,7 @@ func RegisterAccountRoutes(app *fiber.App, store *accountdomain.Store, runtimeSt
|
||||
return c.JSON(accounts)
|
||||
})
|
||||
|
||||
app.Get("/api/phase-a/accounts/:id", func(c fiber.Ctx) error {
|
||||
account, err := store.GetAccount(c.Context(), c.Params("id"))
|
||||
if err != nil {
|
||||
return phaseAError(c, err)
|
||||
}
|
||||
return c.JSON(account)
|
||||
})
|
||||
app.Get("/api/phase-a/accounts/:id", accountDetailPayload(store, runtimeStore))
|
||||
|
||||
app.Post("/api/phase-a/accounts/:id/pause", func(c fiber.Ctx) error {
|
||||
unlock, err := lockAccountResources(c.Context(), runtimeStore, c.Params("id"))
|
||||
@@ -290,3 +284,37 @@ func phaseAError(c fiber.Ctx, err error) error {
|
||||
func PhaseAError(c fiber.Ctx, err error) error {
|
||||
return phaseAError(c, err)
|
||||
}
|
||||
|
||||
// accountEnvironmentView 账号详情/出口重绑共用:账号即环境下内联展示的环境视图(schedule_block_reason 取值同 envView)。
|
||||
func accountEnvironmentView(environment hub.EnvironmentContext) map[string]any {
|
||||
scheduleStatus, scheduleBlockReason := environmentScheduleReadiness(environment)
|
||||
return map[string]any{
|
||||
"alias": environment.Alias, "name": environment.Name, "gateway": environment.Gateway,
|
||||
"binding_version": environment.BindingVersion, "runtime_id": environment.RuntimeID,
|
||||
"runtime_cleanup_pending": environment.RuntimeCleanupPending,
|
||||
"network_exit_id": environment.Exit.ID, "network_exit_health": environment.Exit.HealthStatus,
|
||||
"schedule_status": scheduleStatus, "schedule_block_reason": scheduleBlockReason,
|
||||
}
|
||||
}
|
||||
|
||||
// accountDetailPayload 账号详情:环境信息内联在响应中(账号即环境),前端无需单独请求 /browsers。
|
||||
func accountDetailPayload(store *accountdomain.Store, runtimeStore HubStore) fiber.Handler {
|
||||
return func(c fiber.Ctx) error {
|
||||
account, err := store.GetAccount(c.Context(), c.Params("id"))
|
||||
if err != nil {
|
||||
return phaseAError(c, err)
|
||||
}
|
||||
payload := map[string]any{
|
||||
"id": account.ID, "name": account.Name, "platform": account.Platform,
|
||||
"platform_account_key": account.PlatformAccountKey, "tags": account.Tags,
|
||||
"authorization_status": account.AuthorizationStatus, "runtime_status": account.RuntimeStatus,
|
||||
"version": account.Version,
|
||||
}
|
||||
if runtimeStore != nil {
|
||||
if environment, envErr := runtimeStore.GetEnvironmentContextForAccount(c.Context(), account.ID); envErr == nil {
|
||||
payload["environment"] = accountEnvironmentView(environment)
|
||||
}
|
||||
}
|
||||
return c.JSON(payload)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1975,7 +1975,7 @@ func rebindBrowser(store HubStore, probe NetworkExitProbe, resolve func(hub.Netw
|
||||
if err := finish("succeeded", "environment_rebound", after); err != nil {
|
||||
return hubError(c, err)
|
||||
}
|
||||
return c.JSON(after)
|
||||
return c.JSON(map[string]any{"account_id": after.AccountID, "environment": accountEnvironmentView(after)})
|
||||
}
|
||||
|
||||
func deleteBrowser(store HubStore) fiber.Handler {
|
||||
|
||||
Reference in New Issue
Block a user