# CTO Fix Tracker — Post-Audit Action Plan > Generated: 2026-03-13 | Source: Per-service code audit (24 SERVICE_DOCS.md) > Status: ALL WAVES COMPLETE ✅ --- ## Executive Summary Audit 24 microservices phát hiện **6 loại vấn đề cross-cutting** và **nhiều bug cụ thể per-service**. Ưu tiên theo impact: Security > Runtime Bugs > Code Quality > Tech Debt. --- ## P0 — CRITICAL (Security & Runtime Failures) ### P0-1: Missing Authentication/Authorization **Impact**: Tất cả endpoints public, bất kỳ ai cũng gọi được API **Affected**: 18/24 services (chỉ IAM + merchant có auth đầy đủ) | Service | Status | Fix | |---------|--------|-----| | catalog-service-net | No [Authorize] | Add auth middleware + attributes | | order-service-net | No [Authorize] | Add auth middleware + attributes | | booking-service-net | Public endpoints (only admin has auth) | Add [Authorize] to public controllers | | fnb-engine-net | No [Authorize] | Add auth middleware + attributes | | inventory-service-net | No [Authorize] | Add auth middleware + attributes | | social-service-net | No JWT middleware in pipeline | Add UseAuthentication/UseAuthorization | | mining-service-net | No [Authorize] | Add auth middleware + attributes | | chat-service-net | Has [Authorize] ✅ | OK | | membership-service-net | No [Authorize] | Add auth middleware + attributes | | wallet-service-net | Has [Authorize] ✅ | OK | | storage-service-net | Has [Authorize] ✅ | OK | | ads-manager-service-net | No auth middleware | Add UseAuthentication/UseAuthorization | | ads-serving-service-net | No auth middleware | Add UseAuthentication/UseAuthorization | | ads-billing-service-net | No auth middleware | Add UseAuthentication/UseAuthorization | | ads-tracking-service-net | No auth middleware | Add UseAuthentication/UseAuthorization | | ads-analytics-service-net | No auth middleware | Add UseAuthentication/UseAuthorization | | promotion-service-net | No [Authorize] | Add auth middleware + attributes | | mission-service-net | No [Authorize] | Add auth middleware + attributes | | mkt-facebook-service-net | No auth middleware | Add UseAuthentication/UseAuthorization | | mkt-whatsapp-service-net | No [Authorize] | Add auth middleware + attributes | | mkt-x-service-net | No [Authorize] | Add auth middleware + attributes | | mkt-zalo-service-net | No [Authorize] | Add auth middleware + attributes | ### P0-2: Template Artifacts (Runtime Failures) **Impact**: Services connect to wrong database or fail to build Docker image | Service | Issue | Fix | |---------|-------|-----| | mission-service-net | DB name `myservice_db` instead of `mission_service` | Fix appsettings connection string | | mkt-facebook-service-net | Dockerfile references `MyService.API` | Rename to FacebookService.API | | mkt-whatsapp-service-net | DbContext file named `MyServiceContext.cs`, DB `myservice_db` | Rename file + fix connection string | | promotion-service-net | docker-compose uses template naming | Fix service naming | ### P0-3: Critical Handler Bugs | Service | Bug | Impact | |---------|-----|--------| | ads-tracking-service-net | `TrackPixelEventCommandHandler` creates PixelEvent but NEVER persists | All tracking data lost | | ads-tracking-service-net | `RecordConversionCommand` has handler but NO controller exposes it | Dead code | | booking-service-net | `UpdateResourceCommand` accepts Name/Capacity but only applies IsActive | Silent data loss | | ads-manager-service-net | `ListPendingAdsQuery` filters "Pending" but enum is "pending_review" | Always returns empty | | mining-service-net | `BanMinerCommand` calls Suspend() not Ban(); `ResetMinerStreakCommand` is no-op | Admin actions broken | | order-service-net | Missing DB columns referenced by Dapper queries | Runtime SQL errors | | mkt-x-service-net | Only ISampleRepository in DI; 8 other repos missing registration | Runtime DI failures | --- ## P1 — HIGH (Data Integrity & Correctness) ### P1-1: Missing FluentValidation Validators **Impact**: Invalid data enters system without validation | Service | Commands without validators | |---------|---------------------------| | ads-manager-service-net | ALL 10 commands | | ads-serving-service-net | ALL queries (no commands exist) | | ads-billing-service-net | ALL 3 commands | | ads-tracking-service-net | 2/3 commands | | ads-analytics-service-net | ALL commands | | mining-service-net | ALL commands | | mission-service-net | ALL 4 commands | | promotion-service-net | ALL 12 commands | | social-service-net | ALL 8 commands | ### P1-2: Missing Command/Query Handlers | Service | Missing Handler | |---------|----------------| | promotion-service-net | ExchangeVoucherCommand, PurchaseVoucherCommand (no handlers) | | promotion-service-net | SearchVouchersQuery, GetCampaignStatisticsQuery, GetCampaignVouchersQuery (no handlers) | | mission-service-net | GetUserMissionProgressQuery (no handler) | | mkt-facebook-service-net | GetConversationsQuery, GetCustomersQuery (no handlers) | | mkt-whatsapp-service-net | GetConversationsQuery (no handler, controller queries repo directly) | | ads-manager-service-net | Audience query handlers missing | ### P1-3: Repository Pattern Violations | Service | Issue | |---------|-------| | catalog-service-net | Category handlers use DbContext directly, bypass repository | | booking-service-net | 3 repo interfaces in Infrastructure instead of Domain | | ads-billing-service-net | No repository pattern at all, direct DbContext | | ads-analytics-service-net | No repository pattern | | ads-serving-service-net | No repository pattern | --- ## P2 — MEDIUM (Code Quality & Conventions) ### P2-1: Response Format Inconsistency Standard: `{ success: bool, data: T }` — Many services return raw DTOs | Service | Issue | |---------|-------| | chat-service-net | Returns raw DTOs | | membership-service-net | Mixed (Members raw, StampCards wrapped) | | social-service-net | Returns raw DTOs | | ads-* services | Returns raw DTOs | | booking-service-net | Returns raw DTOs | ### P2-2: Domain Events Defined but No Handlers | Service | Unused Events | |---------|--------------| | membership-service-net | MembershipLevelChangedDomainEvent (never raised) | | social-service-net | UserUnblockedDomainEvent (never raised) | | ads-manager-service-net | All events dispatched but no handlers | | promotion-service-net | VoucherRedeemedDomainEvent (never consumed) | | booking-service-net | Events defined but unused | ### P2-3: Missing EF Migrations | Service | Issue | |---------|-------| | mkt-facebook-service-net | No migrations exist | | ads-billing-service-net | Spurious InvoiceId1 FK column | | ads-analytics-service-net | ClientRequest table missing from migration | ### P2-4: Unused Dependencies (Tech Debt) Redis, Dapper, Polly registered but unused in: booking, social, mining, mission, promotion, ads-* services --- ## Fix Execution Plan ### Wave 1 — P0 Security + Template (Parallel Agents) - Agent 1: Fix auth for core services (catalog, order, booking, fnb-engine, inventory) - Agent 2: Fix auth for social services (social, mining, membership, mission) - Agent 3: Fix auth for ads services (ads-manager, ads-serving, ads-billing, ads-tracking, ads-analytics) - Agent 4: Fix auth for mkt services (mkt-facebook, mkt-whatsapp, mkt-x, mkt-zalo, promotion) - Agent 5: Fix template artifacts (mission, mkt-facebook, mkt-whatsapp, promotion) - Agent 6: Fix critical handler bugs (ads-tracking, booking, ads-manager, mining, mkt-x) ### Wave 2 — P1 Validators + Missing Handlers - Agent 7-12: Add FluentValidation per service group - Agent 13-15: Implement missing handlers ### Wave 3 — P2 Code Quality - Response format standardization - Migration fixes - Cleanup unused dependencies --- ## Progress Tracking | Wave | Task | Status | Commit | |------|------|--------|--------| | 1 | Auth: core services (catalog, order, booking, fnb, inventory) | ✅ DONE | f8606e0 | | 1 | Auth: social services (social, mining, membership, mission) | ✅ DONE | f8606e0 | | 1 | Auth: ads services (5 services) | ✅ DONE | f8606e0 | | 1 | Auth: mkt services + promotion | ✅ DONE | f8606e0 | | 1 | Template artifacts (mission, mkt-facebook, mkt-whatsapp, promotion) | ✅ DONE | f8606e0 | | 1 | Critical handler bugs (7 bugs across 5 services) | ✅ DONE | f8606e0 | | 2 | Validators: ads services (16 validators) | ✅ DONE | 59b2cec | | 2 | Validators: social+mining+mission+promotion (41 validators) | ✅ DONE | 59b2cec | | 2 | Missing handlers (10 handlers across 4 services) | ✅ DONE | 59b2cec | | 3 | Response format standardization (30 controllers, 8 services) | ✅ DONE | efabe49 | | 3 | Migration fixes (InvoiceId1 FK, idempotency cleanup) | ✅ DONE | efabe49 | | 3 | Cleanup unused dependencies (no DI registrations found) | ✅ N/A | — |