# Customer Domain - Final Cleanup ## Problems Identified ### 1. Unnecessary Infra Mapper (BFF) **Current:** ``` BFF: @prisma/client User → user.mapper.ts → domain/customer/providers/portal → UserAuth ``` **Problem:** Double mapping! BFF adapter just converts Prisma type to domain raw type, then calls domain mapper. **Better:** ``` BFF: @prisma/client User → directly use domain/customer/providers/portal/mapper → UserAuth ``` The BFF mapper is redundant - we should use the domain mapper directly. ### 2. Unused Legacy WHMCS Types **Never used in BFF:** - ❌ `CustomerEmailPreferences` (0 occurrences) - ❌ `CustomerUser` (sub-users, 0 occurrences) - ❌ `CustomerStats` (billing stats, 0 occurrences) - ❌ `Customer` (full WHMCS schema - only used internally in WHMCS mapper) **Schemas for unused types:** - ❌ `customerEmailPreferencesSchema` (~40 lines) - ❌ `customerUserSchema` (~25 lines) - ❌ `customerStatsSchema` (~50 lines) - ❌ `customerSchema` (~35 lines) **Total bloat:** ~150 lines of unused code! ### 3. Not Following Schema-First in Domain Mapper **Current:** `packages/domain/customer/providers/portal/mapper.ts` ```typescript // Manually constructs object - NO SCHEMA! export function mapPrismaUserToUserAuth(raw: PrismaUserRaw): UserAuth { return { id: raw.id, email: raw.email, // ... manual construction }; } ``` **Should be:** ```typescript // Use schema for validation! export function mapPrismaUserToUserAuth(raw: PrismaUserRaw): UserAuth { return userAuthSchema.parse({ id: raw.id, email: raw.email, // ... }); } ``` ## Cleanup Plan ### Step 1: Remove Unused Types **File:** `packages/domain/customer/types.ts` Remove: - `customerEmailPreferencesSchema` + type - `customerUserSchema` + type - `customerStatsSchema` + type - `customerSchema` + type (full WHMCS schema) - Helper functions for these types **Keep only:** - `userAuthSchema` → `UserAuth` - `userSchema` → `User` - `customerDataSchema` → `CustomerData` - `customerAddressSchema` → `CustomerAddress` - `addressFormSchema` → `AddressFormData` ### Step 2: Update Customer Index Exports **File:** `packages/domain/customer/index.ts` Remove exports: - `CustomerEmailPreferences` - `CustomerUser` - `CustomerStats` - `Customer` - All related schemas ### Step 3: Clean WHMCS Mapper (Internal Use Only) **File:** `packages/domain/customer/providers/whmcs/mapper.ts` Since `Customer` type is removed, the WHMCS mapper can: - Either define types inline (internal to mapper) - Or export minimal `WhmcsCustomer` type just for mapper use ### Step 4: Use Schema in Portal Mapper **File:** `packages/domain/customer/providers/portal/mapper.ts` ```typescript import { userAuthSchema } from "../../types"; import type { PrismaUserRaw } from "./types"; import type { UserAuth } from "../../types"; export function mapPrismaUserToUserAuth(raw: PrismaUserRaw): UserAuth { return userAuthSchema.parse({ id: raw.id, email: raw.email, role: raw.role, mfaEnabled: !!raw.mfaSecret, emailVerified: raw.emailVerified, lastLoginAt: raw.lastLoginAt?.toISOString(), createdAt: raw.createdAt.toISOString(), updatedAt: raw.updatedAt.toISOString(), }); } ``` ### Step 5: Eliminate BFF Infra Mapper **Delete:** `apps/bff/src/infra/mappers/user.mapper.ts` **Update all 7 usages** to directly import from domain: ```typescript // OLD (double mapping - BAD!) import { mapPrismaUserToDomain } from "@bff/infra/mappers"; const userAuth = mapPrismaUserToDomain(prismaUser); // NEW (direct - GOOD!) import { mapPrismaUserToUserAuth } from "@customer-portal/domain/customer/providers/portal"; const userAuth = mapPrismaUserToUserAuth(prismaUser); ``` Files to update (7 total): 1. `apps/bff/src/modules/auth/presentation/strategies/jwt.strategy.ts` 2. `apps/bff/src/modules/auth/infra/workflows/workflows/whmcs-link-workflow.service.ts` 3. `apps/bff/src/modules/auth/infra/workflows/workflows/signup-workflow.service.ts` 4. `apps/bff/src/modules/auth/infra/workflows/workflows/password-workflow.service.ts` 5. `apps/bff/src/modules/auth/infra/token/token.service.ts` 6. `apps/bff/src/modules/auth/application/auth.facade.ts` 7. Any other imports of `mapPrismaUserToDomain` ## Result **Before:** - 342 lines in types.ts (lots of unused code) - BFF infra mapper (unnecessary layer) - Manual object construction (no schema validation) **After:** - ~190 lines in types.ts (lean, only what's used) - Direct domain mapper usage (proper architecture) - Schema-validated mapping (type safe + runtime safe) **Types kept:** ```typescript // User entity types User // Complete user UserAuth // Auth state UserRole // Role enum // Address CustomerAddress // Address structure AddressFormData // Form validation // Profile data (internal) CustomerData // WHMCS profile fields ``` **Clean, minimal, schema-first! 🎯**