docs(comments): strip internal task/milestone/bundle bookkeeping from code comments
Remove project bookkeeping citations from shipped code comments across the solution: hyphenated task IDs (WP-14, StoreAndForward-025), milestone/task/ issue refs (M3, Task 4, Audit Log #23, #21), Bundle X task-bundle labels, and C/D/K/S/T phase labels. Comment text only — no code logic, string/log literals, or XML-doc structure changed. Genuine descriptions are preserved (only the citation is stripped), and technical lookalikes are retained (UTF-8, SHA-256, T00:00:00, M365, UTC-5, pre-C4/pre-C5 schema versions). Flagged by the new CommentChecker TaskReferenceInComment / TrackingReferenceInComment checks plus targeted grep passes; full solution builds clean, append-only guard tests pass.
This commit is contained in:
@@ -198,7 +198,7 @@
|
||||
private IReadOnlyList<ZB.MOM.WW.ScadaBridge.CentralUI.ScriptAnalysis.DiagnosticMarker> _markers
|
||||
= Array.Empty<ZB.MOM.WW.ScadaBridge.CentralUI.ScriptAnalysis.DiagnosticMarker>();
|
||||
|
||||
// Inbound-API key re-arch (C3): the approved-keys list is driven by the IInboundApiKeyAdmin
|
||||
// Inbound-API key re-arch: the approved-keys list is driven by the IInboundApiKeyAdmin
|
||||
// seam, not ApiMethod.ApprovedApiKeyIds. The ApiMethod entity itself (name/script/params/etc.)
|
||||
// still lives on IInboundApiRepository — only the key↔method approval relationship moved to
|
||||
// per-key method-scopes. Keys are identified by an opaque string KeyId.
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
|
||||
private ToastNotification _toast = default!;
|
||||
|
||||
// M9-T25: live per-connection health, keyed by DataConnection.Id. Sourced from
|
||||
// Live per-connection health, keyed by DataConnection.Id. Sourced from
|
||||
// the existing site→central health transport via IConnectionHealthQueryService
|
||||
// and refreshed on a ~10s poll, mirroring the Health dashboard's timer pattern.
|
||||
// A connection absent from the map renders an "Unknown" badge (tolerates a site
|
||||
@@ -419,7 +419,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
// ── M9-T24b / T33b: Move connection to another site ──
|
||||
// ── Move connection to another site ──
|
||||
// Opened via IDialogService.ShowAsync. The body dispatches MoveDataConnectionCommand
|
||||
// through the guard-running ManagementActor path (IDataConnectionMoveService) — NOT
|
||||
// a direct repository write — so the server enforces the Designer gate and every
|
||||
@@ -451,7 +451,7 @@
|
||||
.Select(r => (r.SiteId!.Value, r.Label))
|
||||
.ToList();
|
||||
|
||||
// M9-T25: enum → Bootstrap badge class. Mirrors the Health dashboard's
|
||||
// Enum → Bootstrap badge class. Mirrors the Health dashboard's
|
||||
// GetConnectionHealthBadge (Components/Pages/Monitoring/Health.razor) so the
|
||||
// design page surfaces the same colour coding for the same status. Kept as a
|
||||
// small local mirror — the Health helper is a private page-local method, not a
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<h4 class="mb-0">@(Id.HasValue ? "Edit External System" : "Add External System")</h4>
|
||||
@* Bundle D (#23 M7-T12) drill-in: deep-link into the central Audit Log
|
||||
@* Drill-in: deep-link into the central Audit Log
|
||||
pre-filtered to this external system's outbound API events. Audit rows
|
||||
record the target by external-system name, so we filter on Target. *@
|
||||
@if (Id.HasValue && !string.IsNullOrWhiteSpace(_name))
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
@inject ISchemaLibraryService SchemaLibraryService
|
||||
@inject IDialogService Dialog
|
||||
|
||||
@* Schema Library (M9-T32c): list + create/edit (via SchemaBuilder) + delete the
|
||||
@* Schema Library: list + create/edit (via SchemaBuilder) + delete the
|
||||
reusable named JSON-Schema library entries that the {"$ref":"lib:Name"} resolver
|
||||
(T32b) resolves against. Every mutation is dispatched through ISchemaLibraryService
|
||||
resolves against. Every mutation is dispatched through ISchemaLibraryService
|
||||
— the guard-running ManagementActor path — never a direct repo write. *@
|
||||
|
||||
<div class="container-fluid mt-3">
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
private Template? _ownerTemplate;
|
||||
private TemplateComposition? _ownerComposition;
|
||||
|
||||
// M9-T26b: the FULL transitively-resolved inherited member set (multi-level
|
||||
// M9: the FULL transitively-resolved inherited member set (multi-level
|
||||
// chain + post-creation base additions) + staleness, fetched read-only via
|
||||
// GetResolvedTemplateMembersCommand. Populated only for derived templates;
|
||||
// null when the read failed (editor falls back to the stored-row view).
|
||||
@@ -228,7 +228,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
// M9-T26b: resolve the FULL inherited member set (whole chain +
|
||||
// M9: resolve the FULL inherited member set (whole chain +
|
||||
// post-creation base additions) read-only. The stored-row tables
|
||||
// above only carry the IMMEDIATE base; this surfaces the rest with
|
||||
// origin annotation + a base-changed staleness banner. Read-only:
|
||||
@@ -314,7 +314,7 @@
|
||||
</div>
|
||||
}
|
||||
|
||||
@* M9-T26b: the FULL transitively-resolved inherited member set — the whole
|
||||
@* M9: the FULL transitively-resolved inherited member set — the whole
|
||||
chain (grandparent + further ancestors) plus base members added after
|
||||
this template was created, which the immediate-base tables below cannot
|
||||
show. Read-only preview; each row carries its origin template + lock
|
||||
@@ -473,7 +473,7 @@
|
||||
}
|
||||
};
|
||||
|
||||
// ---- M9-T26b: full resolved inherited set (read-only preview) ----
|
||||
// ---- M9: full resolved inherited set (read-only preview) ----
|
||||
|
||||
/// <summary>
|
||||
/// Renders the FULL transitively-resolved effective member set (attributes,
|
||||
|
||||
@@ -425,7 +425,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
// ---- Sibling reorder (T23b) ----
|
||||
// ---- Sibling reorder ----
|
||||
// Dispatches the reorder the same way Move/Rename do — directly through
|
||||
// TemplateFolderService (the backend swaps SortOrder with the adjacent
|
||||
// same-parent sibling, no-op at the ends) — then reloads so the new order
|
||||
@@ -471,7 +471,7 @@
|
||||
.ToList();
|
||||
}
|
||||
|
||||
// ---- Root-level context menu (T23b) ----
|
||||
// ---- Root-level context menu ----
|
||||
// Right-click on the tree zone (empty space or below the tree) offers
|
||||
// New Folder / New Template at root. Node right-clicks are handled by the
|
||||
// TreeView's own context menu and never reach here.
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
@attribute [Authorize(Policy = AuthorizationPolicies.RequireDesign)]
|
||||
|
||||
@*
|
||||
TransportExport wizard (Component #24, Task T21).
|
||||
TransportExport wizard (Component #24).
|
||||
|
||||
A 4-step linear wizard:
|
||||
Step 1 — Select : templates (tree, checkbox-mode) + flat artifact lists.
|
||||
@@ -138,7 +138,7 @@
|
||||
@RenderCheckboxList(_smtpConfigs, s => s.Id, s => s.Host, _selectedSmtpConfigs)
|
||||
</fieldset>
|
||||
|
||||
@* S10c: SMS provider configs, mirroring the SMTP section above. Labelled by
|
||||
@* SMS provider configs, mirroring the SMTP section above. Labelled by
|
||||
AccountSid (the bundle key); the secret AuthToken is never rendered. *@
|
||||
<fieldset class="mb-4" data-testid="group-sms-configs">
|
||||
<legend class="h6">SMS Configurations</legend>
|
||||
@@ -361,12 +361,12 @@
|
||||
{
|
||||
<li>SmtpConfig: @s.Host</li>
|
||||
}
|
||||
@* S10c: SMS configs in the closure, mirroring SmtpConfig above; AccountSid only, never AuthToken. *@
|
||||
@* SMS configs in the closure, mirroring SmtpConfig above; AccountSid only, never AuthToken. *@
|
||||
@foreach (var s in _resolved.SmsConfigs.OrderBy(s => s.AccountSid, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
<li>SmsConfig: @s.AccountSid</li>
|
||||
}
|
||||
@* Inbound API keys are not transported (re-arch C4) — methods only. *@
|
||||
@* Inbound API keys are not transported — methods only. *@
|
||||
@foreach (var m in _resolved.ApiMethods.OrderBy(m => m.Name, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
<li>ApiMethod: @m.Name</li>
|
||||
|
||||
+15
-15
@@ -20,7 +20,7 @@ using ZB.MOM.WW.ScadaBridge.Transport.Export;
|
||||
namespace ZB.MOM.WW.ScadaBridge.CentralUI.Components.Pages.Design;
|
||||
|
||||
/// <summary>
|
||||
/// Code-behind for the TransportExport wizard (Transport feature, Task T21).
|
||||
/// Code-behind for the TransportExport wizard (Transport feature).
|
||||
///
|
||||
/// Four-step state machine:
|
||||
/// <list type="number">
|
||||
@@ -72,12 +72,12 @@ public partial class TransportExport : ComponentBase
|
||||
private List<DatabaseConnectionDefinition> _dbConnections = new();
|
||||
private List<NotificationList> _notificationLists = new();
|
||||
private List<SmtpConfiguration> _smtpConfigs = new();
|
||||
// S10c: SMS provider configs, mirroring _smtpConfigs. Keyed by AccountSid in the
|
||||
// SMS provider configs, mirroring _smtpConfigs. Keyed by AccountSid in the
|
||||
// bundle; the wizard selects by entity id (same as SMTP) and never surfaces AuthToken.
|
||||
private List<SmsConfiguration> _smsConfigs = new();
|
||||
// Inbound API keys are not transported between environments (re-arch C4); only methods.
|
||||
// Inbound API keys are not transported between environments; only methods.
|
||||
private List<ApiMethod> _apiMethods = new();
|
||||
// M8 (E1): site/instance-scoped export. Sites are listed flat; each site's
|
||||
// Site/instance-scoped export. Sites are listed flat; each site's
|
||||
// instances hang off it (loaded eagerly via ISiteRepository.GetInstancesBySiteIdAsync)
|
||||
// so the operator can pick a whole site or drill into individual instances.
|
||||
private List<Site> _sites = new();
|
||||
@@ -93,11 +93,11 @@ public partial class TransportExport : ComponentBase
|
||||
private readonly HashSet<int> _selectedDbConnections = new();
|
||||
private readonly HashSet<int> _selectedNotificationLists = new();
|
||||
private readonly HashSet<int> _selectedSmtpConfigs = new();
|
||||
// S10c: SMS provider config selection, mirroring _selectedSmtpConfigs.
|
||||
// SMS provider config selection, mirroring _selectedSmtpConfigs.
|
||||
private readonly HashSet<int> _selectedSmsConfigs = new();
|
||||
// No _selectedApiKeys: inbound API keys are not transported (re-arch C4).
|
||||
// No _selectedApiKeys: inbound API keys are not transported.
|
||||
private readonly HashSet<int> _selectedApiMethods = new();
|
||||
// M8 (E1): site/instance selection backed by entity primary keys, matching the
|
||||
// Site/instance selection backed by entity primary keys, matching the
|
||||
// DependencyResolver's SiteIds/InstanceIds (NOT names — the resolver fetches by id).
|
||||
private readonly HashSet<int> _selectedSites = new();
|
||||
private readonly HashSet<int> _selectedInstances = new();
|
||||
@@ -143,12 +143,12 @@ public partial class TransportExport : ComponentBase
|
||||
_dbConnections = (await ExternalRepo.GetAllDatabaseConnectionsAsync()).ToList();
|
||||
_notificationLists = (await NotificationRepo.GetAllNotificationListsAsync()).ToList();
|
||||
_smtpConfigs = (await NotificationRepo.GetAllSmtpConfigurationsAsync()).ToList();
|
||||
// S10c: SMS provider configs, mirroring the SMTP load path above.
|
||||
// SMS provider configs, mirroring the SMTP load path above.
|
||||
_smsConfigs = (await NotificationRepo.GetAllSmsConfigurationsAsync()).ToList();
|
||||
// Inbound API keys are not transported (re-arch C4) — only methods are loaded.
|
||||
// Inbound API keys are not transported — only methods are loaded.
|
||||
_apiMethods = (await InboundApiRepo.GetAllApiMethodsAsync()).ToList();
|
||||
|
||||
// M8 (E1): sites + their instances for site/instance-scoped export. Each
|
||||
// Sites + their instances for site/instance-scoped export. Each
|
||||
// site's instances are loaded eagerly so the expandable picker has them
|
||||
// without a per-click round-trip; sites are ordered by identifier to match
|
||||
// the bundle's deterministic site ordering.
|
||||
@@ -245,17 +245,17 @@ public partial class TransportExport : ComponentBase
|
||||
DatabaseConnectionIds: _selectedDbConnections.ToList(),
|
||||
NotificationListIds: _selectedNotificationLists.ToList(),
|
||||
SmtpConfigurationIds: _selectedSmtpConfigs.ToList(),
|
||||
// Inbound API keys are not transported (re-arch C4) — methods only.
|
||||
// Inbound API keys are not transported — methods only.
|
||||
ApiMethodIds: _selectedApiMethods.ToList(),
|
||||
IncludeDependencies: _includeDependencies)
|
||||
{
|
||||
// M8 (E1): site/instance ids feed the resolver's SiteIds/InstanceIds.
|
||||
// Site/instance ids feed the resolver's SiteIds/InstanceIds.
|
||||
// Set via init-only properties so the positional ctor stays the documented
|
||||
// additive shape; the resolver dedups a selected instance against its
|
||||
// already-selected owning site.
|
||||
SiteIds = _selectedSites.ToList(),
|
||||
InstanceIds = _selectedInstances.ToList(),
|
||||
// S10c: SMS provider config ids feed the resolver's SmsConfigurationIds,
|
||||
// SMS provider config ids feed the resolver's SmsConfigurationIds,
|
||||
// exactly as SmtpConfigurationIds above (init-only, trailing additive shape).
|
||||
SmsConfigurationIds = _selectedSmsConfigs.ToList(),
|
||||
};
|
||||
@@ -325,7 +325,7 @@ public partial class TransportExport : ComponentBase
|
||||
{
|
||||
if (!string.IsNullOrEmpty(smtp.Credentials)) count++;
|
||||
}
|
||||
// S10c: SMS provider AuthToken is a secret, mirroring SMTP Credentials above.
|
||||
// SMS provider AuthToken is a secret, mirroring SMTP Credentials above.
|
||||
foreach (var sms in resolved.SmsConfigs)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(sms.AuthToken)) count++;
|
||||
@@ -485,7 +485,7 @@ public partial class TransportExport : ComponentBase
|
||||
else set.Remove(id);
|
||||
}
|
||||
|
||||
// ---- Step 1 site/instance helpers (M8 E1) ----
|
||||
// ---- Step 1 site/instance helpers ----
|
||||
|
||||
/// <summary>Instances loaded for a site, or an empty list when the site has none.</summary>
|
||||
private IReadOnlyList<Instance> InstancesFor(int siteId) =>
|
||||
|
||||
+14
-14
@@ -17,7 +17,7 @@ using ZB.MOM.WW.ScadaBridge.Transport.Import;
|
||||
namespace ZB.MOM.WW.ScadaBridge.CentralUI.Components.Pages.Design;
|
||||
|
||||
/// <summary>
|
||||
/// Code-behind for the TransportImport wizard (Transport feature, Task T22).
|
||||
/// Code-behind for the TransportImport wizard (Transport feature).
|
||||
///
|
||||
/// Five-step state machine:
|
||||
/// <list type="number">
|
||||
@@ -42,7 +42,7 @@ namespace ZB.MOM.WW.ScadaBridge.CentralUI.Components.Pages.Design;
|
||||
///
|
||||
/// Cached bundle bytes: because <see cref="IBundleImporter.LoadAsync"/> currently
|
||||
/// peeks the manifest by attempting decryption, encrypted bundles require two
|
||||
/// LoadAsync invocations. CentralUI-031: we previously cached the raw bytes in a
|
||||
/// LoadAsync invocations. We previously cached the raw bytes in a
|
||||
/// <c>byte[] _bundleBytes</c> field, which buffered the full upload (default cap
|
||||
/// 100 MB) in the component's per-circuit state — multiplied across concurrent
|
||||
/// operator sessions, that produced real central-node memory pressure. The
|
||||
@@ -71,7 +71,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
[Inject] private IAuditService AuditService { get; set; } = default!;
|
||||
[Inject] private ScadaBridgeDbContext DbContext { get; set; } = default!;
|
||||
|
||||
// M8 E2: the Map step needs the destination environment's sites + each
|
||||
// The Map step needs the destination environment's sites + each
|
||||
// site's connections to populate the "map to existing target" dropdowns.
|
||||
[Inject] private ISiteRepository SiteRepo { get; set; } = default!;
|
||||
|
||||
@@ -80,7 +80,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
private string? _errorMessage;
|
||||
|
||||
// ---- Session + cached bundle path ----
|
||||
// CentralUI-031: the upload is streamed to a per-session temp file and only
|
||||
// The upload is streamed to a per-session temp file and only
|
||||
// the path is retained on the component, so we don't hold an entire bundle
|
||||
// (up to MaxBundleSizeMb, default 100 MB) in per-circuit memory across the
|
||||
// wizard's lifetime. The file is deleted on every wizard reset path and on
|
||||
@@ -105,7 +105,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
// Keyed by (EntityType, Name) — matches BundleImporter.ApplyAsync's lookup.
|
||||
private Dictionary<(string EntityType, string Name), ImportResolution>? _resolutions;
|
||||
|
||||
// ---- Step 3 (Map sub-section, M8 E2): name mapping ----
|
||||
// ---- Step 3 (Map sub-section): name mapping ----
|
||||
// The sentinel dropdown value for "Create new" — empty string can't collide
|
||||
// with a real SiteIdentifier / connection Name (both are non-empty).
|
||||
private const string CreateNewValue = "";
|
||||
@@ -160,7 +160,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
return;
|
||||
}
|
||||
|
||||
// CentralUI-031: stream the upload directly to a per-session temp
|
||||
// Stream the upload directly to a per-session temp
|
||||
// file so the central node's working set is bounded by the
|
||||
// FileStream buffer (~80 KB) rather than the full bundle bytes.
|
||||
// OpenReadStream's MaxAllowedSize defaults to 500_000 bytes — bump
|
||||
@@ -209,7 +209,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
}
|
||||
try
|
||||
{
|
||||
// CentralUI-031: read the staged bundle straight off disk; the
|
||||
// Read the staged bundle straight off disk; the
|
||||
// importer's LoadAsync only walks the stream forward, so a plain
|
||||
// FileStream is sufficient (no need to buffer it back into memory).
|
||||
using var stream = new FileStream(
|
||||
@@ -435,7 +435,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// M8 E2: prepares the Map sub-section state for a freshly loaded preview.
|
||||
/// Prepares the Map sub-section state for a freshly loaded preview.
|
||||
/// When the preview carries no required site/connection mappings this is a
|
||||
/// no-op (the Map section is hidden) and we skip the site/connection reads
|
||||
/// entirely — central-config-only bundles never touch the destination's
|
||||
@@ -564,7 +564,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// M8 E2: folds the operator's Map-step choices into a <see cref="BundleNameMap"/>.
|
||||
/// Folds the operator's Map-step choices into a <see cref="BundleNameMap"/>.
|
||||
/// A concrete chosen target → <see cref="MappingAction.MapToExisting"/> with that
|
||||
/// target identifier/name; the "Create new" sentinel → <see cref="MappingAction.CreateNew"/>
|
||||
/// with a null target. Iterates the preview's required mappings so the map's shape
|
||||
@@ -607,7 +607,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// M8 E2: parses a Modified item's <c>FieldDiffJson</c> and returns the
|
||||
/// Parses a Modified item's <c>FieldDiffJson</c> and returns the
|
||||
/// <c>lineDiff</c> object for the first code field that carries one, or null
|
||||
/// when the diff has no line-level payload (ordinary fields render as a coarse
|
||||
/// summary instead). Tolerant of malformed/absent JSON — a parse failure
|
||||
@@ -772,7 +772,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
try
|
||||
{
|
||||
var user = await Auth.GetCurrentUsernameAsync();
|
||||
// M8 E2: fold the operator's Map-step choices into the name map. For
|
||||
// Fold the operator's Map-step choices into the name map. For
|
||||
// central-config-only bundles (no required mappings) this is
|
||||
// BundleNameMap.Empty, which the importer normalises away.
|
||||
var nameMap = BuildNameMap();
|
||||
@@ -814,7 +814,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
_confirmEnvironmentText = string.Empty;
|
||||
_result = null;
|
||||
_validationErrors = null;
|
||||
// M8 E2: clear the Map sub-section state too.
|
||||
// Clear the Map sub-section state too.
|
||||
_targetSites = Array.Empty<Site>();
|
||||
_targetConnections.Clear();
|
||||
_siteChoices.Clear();
|
||||
@@ -822,7 +822,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// CentralUI-031: deletes the staged bundle temp file if any. Swallows IO
|
||||
/// Deletes the staged bundle temp file if any. Swallows IO
|
||||
/// failures — an undeletable temp file is best-effort cleanup and must not
|
||||
/// block the wizard.
|
||||
/// </summary>
|
||||
@@ -852,7 +852,7 @@ public partial class TransportImport : ComponentBase, IDisposable
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// CentralUI-031: ensures the staged temp file does not survive circuit
|
||||
/// Ensures the staged temp file does not survive circuit
|
||||
/// teardown. Blazor invokes Dispose when the user navigates away or the
|
||||
/// circuit ends, so an abandoned wizard cleans up automatically.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user