refactor: rename ScadaLink → ZB.MOM.WW.ScadaBridge (code + projects + namespaces)
Solution + 23 src projects + 26 test projects renamed; folders, csproj, namespaces, and ScadaLinkDbContext/ScadaBridgeDbContext class updated. ActorSystem "scadalink" → "scadabridge", Akka seed-node URLs migrated. SQL roles/logins, LDAP domains, CLI command name, and CLI config dir (~/.scadalink → ~/.scadabridge) also renamed. Build green; 5 Host.Tests fail awaiting SQL login rename in next commit. Pre-existing StaleTagMonitor timing flakes unchanged. Rename script committed at tools/rename-to-scadabridge.sh.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
|
||||
**Tech Stack:** .NET 10, xUnit, ASP.NET Core Minimal API, `Microsoft.Extensions.Options.IOptionsMonitor`.
|
||||
|
||||
**Ground rules (every task):** create + work on branch `feature/inbound-api-full-response-audit` — never commit to `main`. TDD: failing test first, then minimal implementation, then verify. Edit in place; never edit `infra/*`, `alog.md`, or `docker/*` unless a task names them (none here). Stage with explicit `git add <path>` — never `git add .` / `commit -am`. Solution stays green: `dotnet build ScadaLink.slnx` 0 warnings (`TreatWarningsAsErrors` on). Do not push.
|
||||
**Ground rules (every task):** create + work on branch `feature/inbound-api-full-response-audit` — never commit to `main`. TDD: failing test first, then minimal implementation, then verify. Edit in place; never edit `infra/*`, `alog.md`, or `docker/*` unless a task names them (none here). Stage with explicit `git add <path>` — never `git add .` / `commit -am`. Solution stays green: `dotnet build ZB.MOM.WW.ScadaBridge.slnx` 0 warnings (`TreatWarningsAsErrors` on). Do not push.
|
||||
|
||||
---
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
1. `git status --short` — confirm you are starting from the `main` revision that already contains commit `0670864` (`docs(audit): design — full request/response capture for inbound API rows`).
|
||||
2. `git checkout -b feature/inbound-api-full-response-audit`.
|
||||
3. `git branch --show-current` — expect `feature/inbound-api-full-response-audit`.
|
||||
4. `dotnet build ScadaLink.slnx` from repo root — expect 0 warnings, 0 errors.
|
||||
4. `dotnet build ZB.MOM.WW.ScadaBridge.slnx` from repo root — expect 0 warnings, 0 errors.
|
||||
|
||||
**Acceptance:** on the feature branch; solution builds clean.
|
||||
|
||||
@@ -33,14 +33,14 @@
|
||||
**What:** New `int InboundMaxBytes` property on `AuditLogOptions` with default 1 048 576 bytes, validated to `[8192, 16777216]`.
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/ScadaLink.AuditLog/Configuration/AuditLogOptions.cs` — add property + XML doc.
|
||||
- Modify: `src/ScadaLink.AuditLog/Configuration/AuditLogOptionsValidator.cs` — add min/max constants + validation branch.
|
||||
- Modify: `tests/ScadaLink.AuditLog.Tests/Configuration/AuditLogOptionsBindingTests.cs` — extend the binding test to assert the new field round-trips from JSON.
|
||||
- Test (new): `tests/ScadaLink.AuditLog.Tests/Configuration/AuditLogOptionsValidatorTests.cs` — if this file does not exist, create it with the four cases below; if a validator-tests file already exists (search for it under `tests/ScadaLink.AuditLog.Tests/Configuration/`), extend it instead.
|
||||
- Modify: `src/ZB.MOM.WW.ScadaBridge.AuditLog/Configuration/AuditLogOptions.cs` — add property + XML doc.
|
||||
- Modify: `src/ZB.MOM.WW.ScadaBridge.AuditLog/Configuration/AuditLogOptionsValidator.cs` — add min/max constants + validation branch.
|
||||
- Modify: `tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/Configuration/AuditLogOptionsBindingTests.cs` — extend the binding test to assert the new field round-trips from JSON.
|
||||
- Test (new): `tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/Configuration/AuditLogOptionsValidatorTests.cs` — if this file does not exist, create it with the four cases below; if a validator-tests file already exists (search for it under `tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/Configuration/`), extend it instead.
|
||||
|
||||
**Step 1: Write the failing tests**
|
||||
|
||||
Add to a validator-tests file (create if missing — namespace `ScadaLink.AuditLog.Tests.Configuration`):
|
||||
Add to a validator-tests file (create if missing — namespace `ZB.MOM.WW.ScadaBridge.AuditLog.Tests.Configuration`):
|
||||
|
||||
```csharp
|
||||
public class AuditLogOptionsValidatorTests
|
||||
@@ -89,7 +89,7 @@ Extend `AuditLogOptionsBindingTests.AuditLog_Section_Binds_AllFields` — add `"
|
||||
**Step 2: Run tests — confirm they fail**
|
||||
|
||||
```
|
||||
dotnet test tests/ScadaLink.AuditLog.Tests \
|
||||
dotnet test tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests \
|
||||
--filter "FullyQualifiedName~AuditLogOptionsValidatorTests|FullyQualifiedName~AuditLogOptionsBindingTests"
|
||||
```
|
||||
|
||||
@@ -134,7 +134,7 @@ if (options.InboundMaxBytes < MinInboundMaxBytes || options.InboundMaxBytes > Ma
|
||||
**Step 5: Run tests — confirm they pass**
|
||||
|
||||
```
|
||||
dotnet test tests/ScadaLink.AuditLog.Tests
|
||||
dotnet test tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests
|
||||
```
|
||||
|
||||
Expected: all green, including the extended binding test and the new validator tests.
|
||||
@@ -142,7 +142,7 @@ Expected: all green, including the extended binding test and the new validator t
|
||||
**Step 6: Build the whole solution**
|
||||
|
||||
```
|
||||
dotnet build ScadaLink.slnx
|
||||
dotnet build ZB.MOM.WW.ScadaBridge.slnx
|
||||
```
|
||||
|
||||
Expected: 0 warnings, 0 errors.
|
||||
@@ -150,10 +150,10 @@ Expected: 0 warnings, 0 errors.
|
||||
**Step 7: Commit**
|
||||
|
||||
```
|
||||
git add src/ScadaLink.AuditLog/Configuration/AuditLogOptions.cs \
|
||||
src/ScadaLink.AuditLog/Configuration/AuditLogOptionsValidator.cs \
|
||||
tests/ScadaLink.AuditLog.Tests/Configuration/AuditLogOptionsBindingTests.cs \
|
||||
tests/ScadaLink.AuditLog.Tests/Configuration/AuditLogOptionsValidatorTests.cs
|
||||
git add src/ZB.MOM.WW.ScadaBridge.AuditLog/Configuration/AuditLogOptions.cs \
|
||||
src/ZB.MOM.WW.ScadaBridge.AuditLog/Configuration/AuditLogOptionsValidator.cs \
|
||||
tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/Configuration/AuditLogOptionsBindingTests.cs \
|
||||
tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/Configuration/AuditLogOptionsValidatorTests.cs
|
||||
git commit -m "feat(auditlog): add AuditLog:InboundMaxBytes option (default 1 MiB, [8 KiB, 16 MiB])"
|
||||
```
|
||||
|
||||
@@ -164,23 +164,23 @@ git commit -m "feat(auditlog): add AuditLog:InboundMaxBytes option (default 1 Mi
|
||||
**What:** When `AuditEvent.Channel == AuditChannel.ApiInbound`, the filter selects `InboundMaxBytes` as the truncation cap instead of `DefaultCapBytes` / `ErrorCapBytes`. Redaction stages run unchanged.
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/ScadaLink.AuditLog/Payload/DefaultAuditPayloadFilter.cs` — change the one cap-selection line.
|
||||
- Test (new): `tests/ScadaLink.AuditLog.Tests/Payload/InboundChannelCapTests.cs` — pin the new behaviour.
|
||||
- Modify: `src/ZB.MOM.WW.ScadaBridge.AuditLog/Payload/DefaultAuditPayloadFilter.cs` — change the one cap-selection line.
|
||||
- Test (new): `tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/Payload/InboundChannelCapTests.cs` — pin the new behaviour.
|
||||
|
||||
**Step 1: Write the failing tests**
|
||||
|
||||
Create `tests/ScadaLink.AuditLog.Tests/Payload/InboundChannelCapTests.cs`:
|
||||
Create `tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/Payload/InboundChannelCapTests.cs`:
|
||||
|
||||
```csharp
|
||||
using System.Text;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using ScadaLink.AuditLog.Configuration;
|
||||
using ScadaLink.AuditLog.Payload;
|
||||
using ScadaLink.AuditLog.Tests.Configuration; // for TestOptionsMonitor — confirm namespace via existing file
|
||||
using ScadaLink.Commons.Entities.Audit;
|
||||
using ScadaLink.Commons.Types.Enums;
|
||||
using ZB.MOM.WW.ScadaBridge.AuditLog.Configuration;
|
||||
using ZB.MOM.WW.ScadaBridge.AuditLog.Payload;
|
||||
using ZB.MOM.WW.ScadaBridge.AuditLog.Tests.Configuration; // for TestOptionsMonitor — confirm namespace via existing file
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Audit;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums;
|
||||
|
||||
namespace ScadaLink.AuditLog.Tests.Payload;
|
||||
namespace ZB.MOM.WW.ScadaBridge.AuditLog.Tests.Payload;
|
||||
|
||||
/// <summary>
|
||||
/// Pins the docs/plans/2026-05-23-inbound-api-full-response-audit-design.md
|
||||
@@ -283,18 +283,18 @@ public class InboundChannelCapTests
|
||||
}
|
||||
```
|
||||
|
||||
Verify the `TestOptionsMonitor<T>` helper lives in `tests/ScadaLink.AuditLog.Tests/`. Grep:
|
||||
Verify the `TestOptionsMonitor<T>` helper lives in `tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/`. Grep:
|
||||
|
||||
```
|
||||
grep -rn "class TestOptionsMonitor" tests/ScadaLink.AuditLog.Tests
|
||||
grep -rn "class TestOptionsMonitor" tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests
|
||||
```
|
||||
|
||||
If its namespace differs from `ScadaLink.AuditLog.Tests.Configuration`, update the `using` accordingly.
|
||||
If its namespace differs from `ZB.MOM.WW.ScadaBridge.AuditLog.Tests.Configuration`, update the `using` accordingly.
|
||||
|
||||
**Step 2: Run tests — confirm they fail**
|
||||
|
||||
```
|
||||
dotnet test tests/ScadaLink.AuditLog.Tests \
|
||||
dotnet test tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests \
|
||||
--filter "FullyQualifiedName~InboundChannelCapTests"
|
||||
```
|
||||
|
||||
@@ -324,7 +324,7 @@ var cap = rawEvent.Channel == AuditChannel.ApiInbound
|
||||
**Step 4: Run tests — confirm they pass**
|
||||
|
||||
```
|
||||
dotnet test tests/ScadaLink.AuditLog.Tests
|
||||
dotnet test tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests
|
||||
```
|
||||
|
||||
Expected: all green. The existing `FilterIntegrationTests`, `BodyRegexRedactionTests`, `RedactionSafetyNetTests`, `SqlParamRedactionTests`, etc., MUST stay passing — the change is channel-scoped and the non-inbound cases never see the new branch.
|
||||
@@ -332,7 +332,7 @@ Expected: all green. The existing `FilterIntegrationTests`, `BodyRegexRedactionT
|
||||
**Step 5: Build the whole solution**
|
||||
|
||||
```
|
||||
dotnet build ScadaLink.slnx
|
||||
dotnet build ZB.MOM.WW.ScadaBridge.slnx
|
||||
```
|
||||
|
||||
Expected: 0 warnings.
|
||||
@@ -340,8 +340,8 @@ Expected: 0 warnings.
|
||||
**Step 6: Commit**
|
||||
|
||||
```
|
||||
git add src/ScadaLink.AuditLog/Payload/DefaultAuditPayloadFilter.cs \
|
||||
tests/ScadaLink.AuditLog.Tests/Payload/InboundChannelCapTests.cs
|
||||
git add src/ZB.MOM.WW.ScadaBridge.AuditLog/Payload/DefaultAuditPayloadFilter.cs \
|
||||
tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests/Payload/InboundChannelCapTests.cs
|
||||
git commit -m "feat(auditlog): payload filter uses InboundMaxBytes for ApiInbound rows"
|
||||
```
|
||||
|
||||
@@ -352,8 +352,8 @@ git commit -m "feat(auditlog): payload filter uses InboundMaxBytes for ApiInboun
|
||||
**What:** Implement the M5-deferred response-body capture. Wrap `HttpContext.Response.Body` with a buffering `MemoryStream` BEFORE `_next(ctx)`, restore + copy the buffered bytes back to the original stream AFTER the pipeline runs, then read the buffer as UTF-8 into `ResponseSummary` on the audit event. The `AuditEvent.ResponseSummary = null` line goes away.
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/ScadaLink.InboundAPI/Middleware/AuditWriteMiddleware.cs`.
|
||||
- Modify: `tests/ScadaLink.InboundAPI.Tests/Middleware/AuditWriteMiddlewareTests.cs` — extend.
|
||||
- Modify: `src/ZB.MOM.WW.ScadaBridge.InboundAPI/Middleware/AuditWriteMiddleware.cs`.
|
||||
- Modify: `tests/ZB.MOM.WW.ScadaBridge.InboundAPI.Tests/Middleware/AuditWriteMiddlewareTests.cs` — extend.
|
||||
|
||||
**Step 1: Write the failing tests**
|
||||
|
||||
@@ -458,7 +458,7 @@ public async Task ResponseBody_OnHandlerThrow_BodyCapturedUpToTheThrow()
|
||||
**Step 2: Run tests — confirm they fail**
|
||||
|
||||
```
|
||||
dotnet test tests/ScadaLink.InboundAPI.Tests \
|
||||
dotnet test tests/ZB.MOM.WW.ScadaBridge.InboundAPI.Tests \
|
||||
--filter "FullyQualifiedName~AuditWriteMiddlewareTests"
|
||||
```
|
||||
|
||||
@@ -480,7 +480,7 @@ Edit `AuditWriteMiddleware.cs`:
|
||||
/// returns, the buffered bytes are copied to the original stream (transparent
|
||||
/// to the real client) and read into <see cref="AuditEvent.ResponseSummary"/>.
|
||||
/// Truncation to the configured inbound ceiling happens in
|
||||
/// <see cref="ScadaLink.AuditLog.Payload.DefaultAuditPayloadFilter"/>; the
|
||||
/// <see cref="ZB.MOM.WW.ScadaBridge.AuditLog.Payload.DefaultAuditPayloadFilter"/>; the
|
||||
/// middleware itself stores the full buffered content.
|
||||
/// </para>
|
||||
```
|
||||
@@ -607,7 +607,7 @@ private void EmitInboundAudit(
|
||||
**Step 4: Run tests — confirm they pass**
|
||||
|
||||
```
|
||||
dotnet test tests/ScadaLink.InboundAPI.Tests
|
||||
dotnet test tests/ZB.MOM.WW.ScadaBridge.InboundAPI.Tests
|
||||
```
|
||||
|
||||
Expected: all green, including the four new response-body tests AND every pre-existing middleware test.
|
||||
@@ -615,7 +615,7 @@ Expected: all green, including the four new response-body tests AND every pre-ex
|
||||
**Step 5: Build the whole solution**
|
||||
|
||||
```
|
||||
dotnet build ScadaLink.slnx
|
||||
dotnet build ZB.MOM.WW.ScadaBridge.slnx
|
||||
```
|
||||
|
||||
Expected: 0 warnings.
|
||||
@@ -623,8 +623,8 @@ Expected: 0 warnings.
|
||||
**Step 6: Commit**
|
||||
|
||||
```
|
||||
git add src/ScadaLink.InboundAPI/Middleware/AuditWriteMiddleware.cs \
|
||||
tests/ScadaLink.InboundAPI.Tests/Middleware/AuditWriteMiddlewareTests.cs
|
||||
git add src/ZB.MOM.WW.ScadaBridge.InboundAPI/Middleware/AuditWriteMiddleware.cs \
|
||||
tests/ZB.MOM.WW.ScadaBridge.InboundAPI.Tests/Middleware/AuditWriteMiddlewareTests.cs
|
||||
git commit -m "feat(inboundapi): AuditWriteMiddleware captures response body on ApiInbound audit rows"
|
||||
```
|
||||
|
||||
@@ -706,16 +706,16 @@ git commit -m "docs(inboundapi): note request/response bodies captured in full t
|
||||
|
||||
**Steps:**
|
||||
|
||||
1. `dotnet build ScadaLink.slnx` from the repo root — expect 0 warnings, 0 errors.
|
||||
1. `dotnet build ZB.MOM.WW.ScadaBridge.slnx` from the repo root — expect 0 warnings, 0 errors.
|
||||
|
||||
2. Run the affected test projects:
|
||||
|
||||
```
|
||||
dotnet test tests/ScadaLink.AuditLog.Tests
|
||||
dotnet test tests/ScadaLink.InboundAPI.Tests
|
||||
dotnet test tests/ZB.MOM.WW.ScadaBridge.AuditLog.Tests
|
||||
dotnet test tests/ZB.MOM.WW.ScadaBridge.InboundAPI.Tests
|
||||
```
|
||||
|
||||
Expect both green. (The wider solution test run is optional but cheap — `dotnet test ScadaLink.slnx` if you want full coverage.)
|
||||
Expect both green. (The wider solution test run is optional but cheap — `dotnet test ZB.MOM.WW.ScadaBridge.slnx` if you want full coverage.)
|
||||
|
||||
3. `git log --oneline main..HEAD` — expect exactly five commits:
|
||||
- feat(auditlog): add AuditLog:InboundMaxBytes option …
|
||||
|
||||
Reference in New Issue
Block a user