Implements Unit 2 "Offerings" (backend module, admin CRUD UI with drag-and-drop reordering, public GET /api/v1/offerings endpoint) and executes the feature's D-15 CI/CD cutover, switching the deploy pipeline's build/publish target from SlpModularCms.Api to SlpModularCms.Api.SlpSoftware. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FWyStNL2ZsjrS7FLd7xvvN
1.5 KiB
Logical Components — Unit: Offerings
Component: OfferingsService Transactional Operations
Type: Application-service logic (existing component from Application Design, no new class) — three of its methods gain an explicit transaction boundary per NFR Design Pattern 1.
Scope: CreateAsync/UpdateAsync (when Featured transitions to true), ReorderAsync, MoveUpAsync, MoveDownAsync. Each wraps its read-modify-write sequence in a single EF Core transaction, committed on success and rolled back on any exception (letting the exception propagate to GlobalExceptionHandler unchanged — no new error-handling path).
Component: offerings-public Rate-Limiting Policy
Type: Configuration + attribute, not a new class — an addition to the existing AddCmsRateLimiting registration (see tech-stack-decisions.md), applied via [EnableRateLimiting("offerings-public")] on OfferingsController's public GET action only.
Consumers: OfferingsController (public GET action).
Component: Structured Audit Logging in OfferingsService
Type: Logging calls within the existing service, not a new component — ILogger<OfferingsService>.LogInformation on create/update/delete, per NFR Design Pattern 3's field list.
No Other New Logical Components
This unit introduces no new queues, caches, background jobs, or infrastructure components — the only additions are the transaction boundary around three existing service methods, one rate-limiting policy, and structured logging calls.