-
Notifications
You must be signed in to change notification settings - Fork 6
refactor(remote): rename probe and tunnel telemetry fields #574
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| //! 数据库迁移:明确区分 remote-node probe 与 reverse-tunnel 运行态字段。 | ||
|
|
||
| use sea_orm_migration::prelude::*; | ||
|
|
||
| #[derive(DeriveMigrationName)] | ||
| pub struct Migration; | ||
|
|
||
| #[async_trait::async_trait] | ||
| impl MigrationTrait for Migration { | ||
| async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { | ||
| // SQLite 对单条 ALTER TABLE 的支持最稳定;四个列逐一重命名并保留原值。 | ||
| rename_column( | ||
| manager, | ||
| ManagedFollowers::LastError, | ||
| ManagedFollowers::LastProbeError, | ||
| ) | ||
| .await?; | ||
| rename_column( | ||
| manager, | ||
| ManagedFollowers::LastCheckedAt, | ||
| ManagedFollowers::LastProbeAt, | ||
| ) | ||
| .await?; | ||
| rename_column( | ||
| manager, | ||
| ManagedFollowers::TunnelLastError, | ||
| ManagedFollowers::TunnelRuntimeError, | ||
| ) | ||
| .await?; | ||
| rename_column( | ||
| manager, | ||
| ManagedFollowers::TunnelLastSeenAt, | ||
| ManagedFollowers::TunnelLastHandshakeAt, | ||
| ) | ||
| .await | ||
| } | ||
|
|
||
| async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { | ||
| rename_column( | ||
| manager, | ||
| ManagedFollowers::LastProbeError, | ||
| ManagedFollowers::LastError, | ||
| ) | ||
| .await?; | ||
| rename_column( | ||
| manager, | ||
| ManagedFollowers::LastProbeAt, | ||
| ManagedFollowers::LastCheckedAt, | ||
| ) | ||
| .await?; | ||
| rename_column( | ||
| manager, | ||
| ManagedFollowers::TunnelRuntimeError, | ||
| ManagedFollowers::TunnelLastError, | ||
| ) | ||
| .await?; | ||
| rename_column( | ||
| manager, | ||
| ManagedFollowers::TunnelLastHandshakeAt, | ||
| ManagedFollowers::TunnelLastSeenAt, | ||
| ) | ||
| .await | ||
| } | ||
| } | ||
|
|
||
| async fn rename_column( | ||
| manager: &SchemaManager<'_>, | ||
| from: ManagedFollowers, | ||
| to: ManagedFollowers, | ||
| ) -> Result<(), DbErr> { | ||
| manager | ||
| .alter_table( | ||
| Table::alter() | ||
| .table(ManagedFollowers::Table) | ||
| .rename_column(from, to) | ||
| .to_owned(), | ||
| ) | ||
| .await | ||
| } | ||
|
|
||
| #[derive(DeriveIden)] | ||
| enum ManagedFollowers { | ||
| Table, | ||
| LastError, | ||
| LastCheckedAt, | ||
| TunnelLastError, | ||
| TunnelLastSeenAt, | ||
| LastProbeError, | ||
| LastProbeAt, | ||
| TunnelRuntimeError, | ||
| TunnelLastHandshakeAt, | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -100,7 +100,7 @@ export function RemoteNodesTable({ | |
| </AdminSortableTableHead> | ||
| <TableHead>{t("remote_node_transport_mode")}</TableHead> | ||
| <AdminSortableTableHead | ||
| sortKey="last_checked_at" | ||
| sortKey="last_probe_at" | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
rg -n -C 4 'AdminRemoteNodeSortBy|last_probe_at|last_checked_at|sort_by' \
frontend-panel/src src/api/pagination.rs src/services/remote/remote_node.rsRepository: AsterCommunity/AsterDrive Length of output: 50382 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- pagination enum ---'
sed -n '100,135p' src/api/pagination.rs
printf '%s\n' '--- remote-node repository sorting ---'
rg -n -C 12 'AdminRemoteNodeSortBy|last_probe_at|last_checked_at' src/db src/services/remote frontend-panel/src/components/admin/admin-remote-nodes-page frontend-panel/src/services/api.generated.ts
printf '%s\n' '--- table and service types ---'
sed -n '80,120p' frontend-panel/src/components/admin/admin-remote-nodes-page/RemoteNodesTable.tsx
rg -n -C 8 'adminRemoteNodeService|RemoteNodeListQuery|AdminRemoteNodeSortBy' frontend-panel/src/services/adminService.ts frontend-panel/src/types frontend-panel/src/components/admin/admin-remote-nodes-pageRepository: AsterCommunity/AsterDrive Length of output: 50381 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- table sort key ---'
sed -n '1,125p' frontend-panel/src/components/admin/admin-remote-nodes-page/RemoteNodesTable.tsx
printf '%s\n' '--- frontend sort type and query forwarding ---'
rg -n -C 5 'AdminRemoteNodeSortBy|RemoteNodeListQuery|adminRemoteNodeService' \
frontend-panel/src/types frontend-panel/src/services/adminService.ts \
frontend-panel/src/pages/admin frontend-panel/src/components/admin/admin-remote-nodes-page
printf '%s\n' '--- table sort tests ---'
rg -n -C 6 'sortKey|onSort|last_probe_at|sort_by' \
frontend-panel/src/components/admin/admin-remote-nodes-page/*.test.tsx \
frontend-panel/src/pages/admin/*.test.tsx \
frontend-panel/src/services/adminService.test.tsRepository: AsterCommunity/AsterDrive Length of output: 50382 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import re
checks = {
"backend enum": (
Path("src/api/pagination.rs").read_text(),
r"enum AdminRemoteNodeSortBy\s*\{.*?LastProbeAt",
),
"repository branch": (
Path("src/db/repository/managed_follower_repo.rs").read_text(),
r"AdminRemoteNodeSortBy::LastProbeAt\s*=>.*?Column::LastProbeAt",
),
"generated frontend union": (
Path("frontend-panel/src/services/api.generated.ts").read_text(),
r"AdminRemoteNodeSortBy:\s*[^;\n]*\blast_probe_at\b",
),
"table sort key": (
Path("frontend-panel/src/components/admin/admin-remote-nodes-page/RemoteNodesTable.tsx").read_text(),
r'sortKey="last_probe_at"',
),
"controller allow-list": (
Path("frontend-panel/src/pages/admin/useAdminRemoteNodesPageController.ts").read_text(),
r'"last_probe_at".*?satisfies readonly AdminRemoteNodeSortBy\[\]',
),
"service forwarding": (
Path("frontend-panel/src/services/adminService.ts").read_text(),
r'adminRemoteNodeService.*?sort_by:\s*params\?\.sort_by',
),
}
for name, (text, pattern) in checks.items():
flags = re.S if name in {"backend enum", "repository branch", "service forwarding"} else 0
print(f"{name}: {'PASS' if re.search(pattern, text, flags) else 'FAIL'}")
test_paths = [
Path("frontend-panel/src/components/admin/admin-remote-nodes-page/RemoteNodesTable.test.tsx"),
Path("frontend-panel/src/pages/admin/AdminRemoteNodesPage.test.tsx"),
]
for path in test_paths:
text = path.read_text()
matches = re.findall(r"last_probe_at|sortKey|onSortChange|sort_by", text)
print(f"{path}: {len(matches)} focused sort-related matches")
PY
printf '%s\n' '--- service forwarding ---'
sed -n '409,420p' frontend-panel/src/services/adminService.ts
printf '%s\n' '--- focused table test matches ---'
rg -n 'last_probe_at|sortKey|onSortChange|sort_by' \
frontend-panel/src/components/admin/admin-remote-nodes-page/RemoteNodesTable.test.tsx \
frontend-panel/src/pages/admin/AdminRemoteNodesPage.test.tsx || trueRepository: AsterCommunity/AsterDrive Length of output: 1642 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import re
checks = {
"backend enum": (
Path("src/api/pagination.rs").read_text(),
r"enum AdminRemoteNodeSortBy\s*\{.*?LastProbeAt",
),
"repository branch": (
Path("src/db/repository/managed_follower_repo.rs").read_text(),
r"AdminRemoteNodeSortBy::LastProbeAt\s*=>.*?Column::LastProbeAt",
),
"generated frontend union": (
Path("frontend-panel/src/services/api.generated.ts").read_text(),
r"AdminRemoteNodeSortBy:\s*[^;\n]*\blast_probe_at\b",
),
"table sort key": (
Path("frontend-panel/src/components/admin/admin-remote-nodes-page/RemoteNodesTable.tsx").read_text(),
r'sortKey="last_probe_at"',
),
"controller allow-list": (
Path("frontend-panel/src/pages/admin/useAdminRemoteNodesPageController.ts").read_text(),
r'"last_probe_at".*?satisfies readonly AdminRemoteNodeSortBy\[\]',
),
}
for name, (text, pattern) in checks.items():
flags = re.S if name in {"backend enum", "repository branch"} else 0
print(f"{name}: {'PASS' if re.search(pattern, text, flags) else 'FAIL'}")
for path in [
Path("frontend-panel/src/components/admin/admin-remote-nodes-page/RemoteNodesTable.test.tsx"),
Path("frontend-panel/src/pages/admin/AdminRemoteNodesPage.test.tsx"),
]:
text = path.read_text()
matches = re.findall(r"last_probe_at|sortKey|onSortChange|sort_by", text)
print(f"{path}: {len(matches)} focused sort-related matches")
PY
printf '%s\n' '--- service forwarding ---'
sed -n '409,420p' frontend-panel/src/services/adminService.ts
printf '%s\n' '--- focused table test matches ---'
rg -n 'last_probe_at|sortKey|onSortChange|sort_by' \
frontend-panel/src/components/admin/admin-remote-nodes-page/RemoteNodesTable.test.tsx \
frontend-panel/src/pages/admin/AdminRemoteNodesPage.test.tsx || trueRepository: AsterCommunity/AsterDrive Length of output: 1617 为
🤖 Prompt for AI AgentsSource: Coding guidelines |
||
| sortBy={sortBy} | ||
| sortOrder={sortOrder} | ||
| onSortChange={onSortChange} | ||
|
|
@@ -200,9 +200,9 @@ export function RemoteNodesTable({ | |
| {getRemoteNodeTunnelLabel(t, node)} | ||
| </Badge> | ||
| </div> | ||
| {node.tunnel?.last_error ? ( | ||
| {node.tunnel?.runtime_error ? ( | ||
| <div className="line-clamp-2 text-xs text-muted-foreground"> | ||
| {node.tunnel.last_error} | ||
| {node.tunnel.runtime_error} | ||
| </div> | ||
| ) : null} | ||
| </div> | ||
|
|
@@ -231,7 +231,7 @@ export function RemoteNodesTable({ | |
| </Badge> | ||
| </div> | ||
| <div className="text-xs text-muted-foreground"> | ||
| {formatLastChecked(t, node.last_checked_at)} | ||
| {formatLastChecked(t, node.last_probe_at)} | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
使用隧道专用的空错误文案。
remote_node_tunnel_runtime_error标签下的空值回退调用了remote_node_last_probe_error_empty。当runtime_error为空时,界面会显示探测错误的空状态文案,破坏探测状态和隧道状态的分离。请使用或新增隧道专用的空状态 key,并同步英文和中文 locale。🤖 Prompt for AI Agents