Commit Graph

6 Commits

Author SHA1 Message Date
kjh2064 c289a698c5 feat(wbs): AEG-VS-01-05 Event/Job/Inbox - Part 2-3 Complete (Outbox/Inbox + Consumers)
Part 2: Transaction + Outbox Integration
- RegisterIdentityEndpoint: DbConnection → DbTransaction → Outbox write
- RegisterIdentitySql: Accept NpgsqlConnection + NpgsqlTransaction (Dapper)
- Fixed schema references: identity.identity → public.identity
- Hash computation (SHA256) for Outbox payload integrity

Part 3: Consumer + Job Implementation
- IdentityCreatedConsumer: SignalR group 'identity-notifications'
- MfaReminderJob: Hangfire job, 24-hour reminder, idempotent via DB tracking
- IdentityAuditConsumer: Immutable append-only audit trail
- Migration 0043: identity_mfa_reminder + identity_audit_log tables

Testing
- Unit: IdentityCreated event serialization + immutability (4 tests)
- Integration: RegisterIdentityWithOutbox (3 tests: happy path, rollback, duplicate email)
- Updated existing tests: Transaction management (6 test methods)

Architecture
- Outbox/Inbox pattern ensures exactly-once delivery
- Consumers decouple from identity creation (async, independent retry)
- Audit trail immutable (trigger prevents updates/deletes)
- MFA reminder idempotent (tracked in DB)

Status: 40% COMPLETE (event + endpoint + 3 consumers)
Next: E2E tests + Hangfire job registration + Admin UI

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-17 18:41:10 +09:00
kjh2064 023bfa97bf feat(wbs): AEG-VS-01-05 Event/Job/Inbox - Part 1 (Event Contracts)
- Added IdentityCreated domain event (Guid, Email, DisplayName, CorrelationId, OccurredAt)
- Purpose: Trigger MFA enrollment reminder, welcome email, audit logging via Outbox → Inbox pattern
- Design: Immutable record with required properties for type safety
- Correlation ID for audit trail linking

ARCHITECTURE:
Identity creation flow:
  1. RegisterIdentity Endpoint creates identity
  2. IdentityCreated event → Outbox table (next session)
  3. OutboxPollerJob reads Outbox
  4. Consumers (IdentityCreatedConsumer) handle async via Inbox

NEXT SESSIONS:
- Part 2: Update RegisterIdentityEndpoint with transaction + Outbox writer
- Part 3: IdentityCreatedConsumer (SignalR notification, email job, audit logging)
- Part 4: Hangfire job for MFA reminder emails

AGENTS.md v16.0:
 Event sourcing (domain events as source of truth)
 Outbox/Inbox pattern (reliable async messaging)
 Idempotent consumers (no duplicate processing)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-17 18:19:43 +09:00
kjh2064 3adbfd9a8e feat(wbs): AEG-VS-01-04 BE Vertical Slice - Part 2 Complete (DI + Endpoints + Tests)
 Part 1: Domain layer (IdentityState, RoleAssignmentState)
 Part 2: DI setup + Endpoints + Integration tests

CHANGES:
- Fixed FastEndpoints API: Send.OkAsync() pattern (was SendOkAsync)
- Removed Handler layer (simplified to endpoint-only pattern)
- Updated Response records with default field values
- Added IdentityAccessModule.cs for DI registration
- Added unit test projects + integration test projects
- Fixed TypeScript error in useFormFieldNavigation (HTMLElement[] cast)
- Removed old Handler test files

ARCHITECTURE:
Endpoint (FastEndpoints) → IRegisterIdentitySql/IRequestMfaSetupSql (Dapper)
  → Domain state machines (IdentityState, RoleAssignmentState)
  → PostgreSQL (optimistic concurrency via revision_version)

BUILD:  SUCCESS (0 errors, 0 warnings, 59 seconds)
TESTS:  READY (IdentityStateTests 9, integration tests 10)

Endpoints:
- POST /api/identities (RegisterIdentity)
- PUT /api/identities/{id}/request-mfa (RequestMfaSetup)

AGENTS.md v16.0 Compliance:
 Endpoint authority (validation in endpoint)
 Optimistic concurrency (revision tracking)
 Error handling (Send.StatusCodeAsync)
 Domain-driven state machines
 Dapper SQL with ON CONFLICT patterns

S1 Progress: 4/7 (57%)
- 01-01  Policy/Scope
- 01-02  Identity Data Contract
- 01-03  Domain Policy
- 01-04  BE Vertical Slice (COMPLETE)
- 01-05/06/07  Remaining slices

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-17 18:00:19 +09:00
kjh2064 dc8f3466c9 WIP: AEG-VS-01-04 Part 2 - DI setup + Endpoint refactoring (token budget constraint)
- Added IdentityAccessModule.cs with DI registration
- Added KArtSell.Modules.IdentityAccess.csproj with FastEndpoints deps
- Added project files for UnitTests & IntegrationTests
- Updated Program.cs to register IdentityAccessModule
- Updated Host.csproj to reference IdentityAccess module
- Fixed Directory.Packages.props with Moq + MS.Extensions.DependencyInjection

ISSUES (to fix next session):
- FastEndpoints Send/SendAsync/SendOkAsync method resolution incomplete
- Response record initialization requires field values
- Need to refactor endpoints to match ModelOperations pattern exactly

WORKING:
- Domain layer (IdentityState, RoleAssignmentState) 
- SQL repositories (Dapper) 
- Unit tests (RegisterIdentity, RequestMfaSetup handlers) 
- Integration test structure ready 

Next: Simplify endpoints using 'Endpoint<Req,Resp>' pattern from GetApprovalQueue sample

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-17 17:50:25 +09:00
kjh2064 b3cb9032ac feat(wbs): AEG-VS-01-04 BE Vertical Slice - Endpoints & Handlers (Part 1)
- RegisterIdentity endpoint (POST /api/identities)
- RequestMfaSetup endpoint (PUT /api/identities/{id}/request-mfa)
- SQL repositories w/ optimistic concurrency (revision tracking)
- Application handlers (IEndpointHandler pattern)
- ValidationException + ProblemDetails error handling
- Unit tests: RegisterIdentityHandlerTests (4), RequestMfaSetupHandlerTests (4)
- Domain state machines integrated (IdentityState lifecycle)
- AGENTS.md v16.0: endpoint authority, idempotency, correlation ID ready

DI registration & integration tests deferred to next session.
17 new files, 500+ LOC, 8/8 unit tests ready to run

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-17 17:43:31 +09:00
kjh2064 8ea4e20f36 feat(wbs): AEG-VS-01-03 Domain policy implementation
AEG-VS-01-03: Identity & Role Assignment State Machines

Implementation:
1. IdentityState.cs
   - 7 states: UNDEFINED → ACTIVE → REQUIRES_MFA_SETUP → MFA_CONFIGURED → MFA_SUSPENDED → INACTIVE → REVOKED
   - Immutable value object with typed transitions
   - State queries (IsActive, IsMfaRequired, CanReceiveRoles)
   - No infrastructure dependencies (pure domain logic)

2. RoleAssignmentState.cs
   - Maker-Checker workflow: PENDING_APPROVAL → APPROVED_BY_1 → APPROVED_BY_2 → ACTIVE → EXPIRED/REVOKED/REJECTED
   - Approval count constraints enforced at state level
   - Immutable state transitions

3. IdentityStateTests.cs
   - 9 unit tests covering all transitions
   - Boundary testing (invalid transitions throw)
   - State query tests
   - Value object equality

Principles:
- 정공법: State machine encoded in domain, not middleware
- SOLID: Single responsibility (state transitions)
- 과유불액: Only what contract requires
- 안정성: Immutable value objects, exception-based validation
- 재현성: Pure C# logic, no DB/external dependencies

All tests PASSING (9/9)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-17 17:37:35 +09:00