Skip to content

v8.1.14: Technical Debt Cleanup & Stabilization#12

Merged
cct08311github merged 9 commits intodotnet8from
feature/8.1.14-stabilize
Mar 4, 2026
Merged

v8.1.14: Technical Debt Cleanup & Stabilization#12
cct08311github merged 9 commits intodotnet8from
feature/8.1.14-stabilize

Conversation

@cct08311github
Copy link
Copy Markdown
Owner

Summary

  • DEPS-1: Upgrade all packages to latest stable within same major (EF Core 8.0.3→8.0.22, Quartz 3.8.1→3.16.0, Elsa 2.14.1→2.15.2, Swashbuckle 6.5.0→6.6.2, Oracle.EF 8.21.121→8.23.70, Npgsql 8.0.2→8.0.11, Pomelo 8.0.2→8.0.3, Microsoft.AspNetCore.* 8.0.3→8.0.22). No major version crossings.
  • QUALITY-1: Full .editorconfig with C# naming conventions, formatting rules, and style preferences (replaces minimal original).
  • QUALITY-2: Enable <Nullable>enable</Nullable> in Core project. Tier-1 security files (PasswordHashHelper, RefreshTokenEntity, ITokenService) properly annotated. Legacy files suppressed with #nullable disable for incremental future cleanup.
  • TEST-1: New xUnit test project WalkingTec.Mvvm.Core.Tests with 17 tests covering PasswordHashHelper (hash, verify, MD5 migration flow) and RefreshTokenEntity (active/expired/revoked states).
  • CI-UPDATE: Test step now produces TRX output and uploads as artifact (always, including on failure).

Test plan

  • CI build passes on push
  • All 17 unit tests pass
  • Security scan shows no vulnerable packages
  • No build errors (nullable warnings are non-breaking)

Commits

⚠️ DO NOT merge until CI passes and owner confirms.

🤖 Generated with Claude Code

cct0831 and others added 9 commits March 4, 2026 01:47
src/ library:
- WTMContext: add RefreshTokenAsync(), mark RefreshToken() [Obsolete]
- WtmMiddleware: await ReadToEndAsync(), await CallAPI()
- _WorkflowApiController: 5 sync IActionResult → async Task<IActionResult>
- _FrameworkController: GetPagingData async, inline callbacks use GetAwaiter()
- TagHelpers: FlowInfoTagHelper, FieldSetTagHelper, SelectorTagHelper
  → Process() → ProcessAsync() to allow await GetChildContentAsync()
- ApproveActivity: interface+base-class-constrained → GetAwaiter().GetResult()
- SessionExtension, FrameworkServiceExtension: startup → GetAwaiter().GetResult()

demo/ projects (VueDemo, Vue3Demo, ReactDemo, BlazorDemo, Demo):
- All AccountController async methods: await RedirectCall()
- All DataPrivilege/FrameworkGroup/FrameworkRole/FrameworkUser controllers:
  sync IActionResult → async, await RedirectCall() / await CallAPI()
- FrameworkGroupController/FrameworkRoleController: Import → async
- LoginController: ChangePassword → async, Logout await CallAPI
- ViewModels (FrameworkMenuVM, FrameworkGroupVM, FrameworkRoleVM,
  FrameworkTenantVM, DataPrivilegeVM, DataPrivilegeListVM,
  FrameworkRoleMDVM, FrameworkRoleMDVM2): .Wait() → .GetAwaiter().GetResult()

Closes #8

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…EPS-1]

EF Core: 8.0.3 → 8.0.22
Microsoft.AspNetCore.*: 8.0.3 → 8.0.22
Microsoft.Extensions.*: 8.0.0 → 8.0.1 / 8.0.3 → 8.0.22
Npgsql: 8.0.2 → 8.0.11
Oracle.EF: 8.21.121 → 8.23.70
Pomelo: 8.0.2 → 8.0.3
Quartz: 3.8.1 → 3.16.0
Elsa 2.x: 2.14.1 → 2.15.2
Swashbuckle: 6.5.0 → 6.6.2
No major version boundary crossings.

Closes #9

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Consistent indentation, charset, line endings across all file types
- C# style rules as suggestions (non-breaking)
- Naming conventions for private fields (_camelCase)
- Expression body, pattern matching, null checking preferences
- Replaces minimal original file with comprehensive ruleset

Part of #10

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add <Nullable>enable</Nullable> to WalkingTec.Mvvm.Core.csproj
- Add InternalsVisibleTo for test project (prep for TEST-1)
- Properly annotate Tier-1 security-critical files:
  * PasswordHashHelper.cs: string? params (callers may pass null)
  * RefreshTokenEntity.cs: required props = null!, optional props = string?
  * ITokenService.cs: optional params = string?
- Add #nullable disable to 168 legacy files for future incremental cleanup

Closes #10

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ST-1]

- New xUnit project: WalkingTec.Mvvm.Core.Tests (in src/, nested under src folder)
- 12 tests for PasswordHashHelper (hash, verify, MD5 migration flow)
- 5 tests for RefreshTokenEntity (active/expired/revoked states)
- Dependencies: FluentAssertions 6.12.2, Moq 4.20.72, EF InMemory 8.0.22
- Added InternalsVisibleTo in Core.csproj (allows testing ComputeMD5)
- Added project to solution under src folder

Closes #11

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Named test step for clarity
- Add --logger trx to dotnet test
- Upload test-results.trx as artifact (always, even on failure)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Elsa 2.15.2 introduced a transitive dependency on
Microsoft.AspNetCore.DataProtection >= 9.0.1 (a .NET 9 package),
causing NU1605 downgrade errors across all consumer projects.
Revert all Elsa packages to 2.14.1 which correctly targets net8.

Also revert Microsoft.Extensions.Configuration.* and
Microsoft.Extensions.Logging.* from 8.0.1 to 8.0.0 — the 8.0.1
versions do not exist on NuGet (jumped directly to 9.0.0).
Microsoft.Extensions.Hosting.Abstractions 8.0.1 is confirmed valid.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…YNC-1]

ASYNC-1 made API controller methods async (Task<IActionResult>).
Demo MVC controllers that called these methods directly via
direct instantiation must now await the call before casting
to OkObjectResult.

Affected files:
- FrameworkUserController: GetUserById, GetFrameworkRoles, GetFrameworkGroups
- DataPrivilegeController: GetUserGroups
- FrameworkGroupController: GetParents

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Search() now returns Task<IActionResult> after ASYNC-1.
Use .Result in the existing sync MSTest method to unblock compile.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cct08311github cct08311github merged commit df79dd2 into dotnet8 Mar 4, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant