2025-09-17 18:43:43 +09:00
# Portal Architecture
This document outlines the new feature-driven architecture implemented for the customer portal.
## Folder Structure
```
apps/portal/src/
2025-09-18 16:39:57 +09:00
├── app/ # Next.js App Router entry points (route groups only)
│ ├── (public)/ # Marketing + auth routes, pages import feature views
│ ├── (authenticated)/ # Signed-in portal routes, thin wrappers around features
│ ├── api/ # App Router API routes
│ ├── favicon.ico / globals.css # Global assets
│ └── layout.tsx # Root layout/providers
├── components/ # Shared UI components (design system atoms/molecules)
│ ├── ui/
│ ├── layout/
│ └── common/
├── core/ # App-wide configuration (env, logger, providers)
├── features/ # Feature-specific modules composed by routes
│ ├── account/
│ ├── auth/
│ ├── billing/
│ ├── catalog/
│ ├── dashboard/
│ ├── marketing/
│ ├── orders/
│ ├── service-management/
│ ├── subscriptions/
│ └── support/
├── shared/ # Cross-feature helpers (e.g., constants, locale data)
├── styles/ # Global styles and design tokens
└── types/ # Portal-specific TypeScript types
2025-09-17 18:43:43 +09:00
```
## Design Principles
### 1. Feature-First Organization
Related functionality is grouped together in feature modules, making it easier to understand and maintain code.
### 2. Atomic Design
UI components are organized hierarchically:
- **Atoms**: Basic building blocks (Button, Input, etc.)
- **Molecules**: Combinations of atoms (SearchBar, DataTable, etc.)
- **Organisms**: Complex components (Layout, Header, etc.)
### 3. Separation of Concerns
Each feature module contains:
- `components/` : UI components specific to the feature
- `hooks/` : React hooks for state and operations
- `services/` : Business logic and API calls
- `types/` : TypeScript type definitions
- `utils/` : Utility functions
### 4. Centralized Shared Resources
2025-09-18 16:39:57 +09:00
Common utilities, types, and components are centralized in the `core/` , `shared/` , and `components/` directories.
2025-09-17 18:43:43 +09:00
## Feature Module Structure
Each feature follows a consistent internal structure:
```
features/[feature-name]/
├── components/ # Feature-specific components
│ ├── [Component]/
│ │ ├── Component.tsx
│ │ ├── Component.test.tsx
│ │ └── index.ts
│ └── index.ts
├── hooks/ # Feature-specific hooks
│ ├── use[Feature].ts
│ └── index.ts
├── services/ # Feature business logic
│ ├── [feature].service.ts
│ └── index.ts
├── types/ # Feature-specific types
│ ├── [feature].types.ts
│ └── index.ts
├── utils/ # Feature utilities
└── index.ts # Feature public API
```
## Design System
The design system is built with:
### Design Tokens
- CSS custom properties for consistent theming
- TypeScript constants for type safety
- Semantic color and spacing systems
### Component Library
- Reusable UI components following atomic design
- Consistent styling and behavior patterns
- Accessibility-first approach
### Responsive Design
- Mobile-first responsive utilities
- Consistent breakpoint system
- Container queries for component-level responsiveness
## TypeScript Configuration
Enhanced TypeScript configuration with:
- Strict type checking enabled
- Path mappings for clean imports
- Enhanced error detection
- Import/export validation
## Import Patterns
### Recommended Import Patterns
```typescript
// Feature imports
import { LoginForm, useAuth } from '@/features/auth ';
// Component imports
import { Button, Input } from '@/components/ui ';
import { DataTable } from '@/components/common ';
// Type imports
import type { User, ApiResponse } from '@/types ';
// Utility imports
2025-09-18 16:39:57 +09:00
import { QueryProvider } from '@/core/providers ';
// Prefer feature services/hooks over direct api usage in pages
import { logger } from '@/core/config ';
2025-09-17 18:43:43 +09:00
```
### Path Mappings
- `@/*` - Root src directory
- `@/components/*` - Component library
2025-09-18 16:39:57 +09:00
- `@/core/*` - App-wide configuration and providers
2025-09-17 18:43:43 +09:00
- `@/features/*` - Feature modules
2025-09-18 16:39:57 +09:00
- `@/shared/*` - Shared helpers/constants
2025-09-17 18:43:43 +09:00
- `@/styles/*` - Style files
2025-09-18 16:39:57 +09:00
- `@/types/*` - Portal-specific types
- `@shared/*` - Shared package exports
2025-09-17 18:43:43 +09:00
## Migration Strategy
The migration to this new architecture will be done incrementally:
1. **Foundation** (Current): Set up folder structure and design system
2. **Core Components** : Migrate base UI components
3. **Feature Modules** : Migrate features one by one
4. **Optimization** : Performance and bundle optimization
5. **Cleanup** : Remove old code and dependencies
## Benefits
### Developer Experience
- Predictable code organization
- Easy to find and modify code
- Consistent patterns across features
- Better IntelliSense and type safety
### Maintainability
- Clear separation of concerns
- Reusable components and utilities
- Centralized design system
- Easier testing and debugging
### Performance
- Tree-shakeable exports
- Code splitting by feature
- Optimized bundle size
- Better caching strategies
### Scalability
- Easy to add new features
- Consistent architecture patterns
- Modular and composable design
- Clear boundaries between features
## Pages vs Features
- Route pages under `src/app/**` are thin shells and do not call APIs directly.
- Data fetching and business logic live in `src/features/**` :
- `services/` : centralized feature services built on the shared `apiClient`
- `hooks/` : React Query hooks that wrap services and expose typed operations
- `components/` : feature UI composed from shared atoms/molecules/organisms
This ensures pages remain declarative and the feature layer encapsulates logic.
2025-09-18 16:39:57 +09:00
### Route Layering
- `(public)` : marketing landing and authentication flows. These routes render feature views such as `marketing/PublicLandingView` and `auth` screens while remaining server components by default.
- `(authenticated)` : signed-in portal experience. Pages import dashboard, billing, subscriptions, etc. from the feature layer and rely on the shared route-group layout to provide navigation.
- `api/` : App Router API endpoints remain colocated under `src/app/api` and can reuse feature services for data access.
Only `layout.tsx` , `page.tsx` , and `loading.tsx` files live inside the route groups. All reusable UI, hooks, and services live under `src/features/**` to keep routing concerns thin.
2025-09-17 18:43:43 +09:00
### Current Feature Hooks/Services
- Catalog
- Hooks: `useInternetCatalog` , `useSimCatalog` , `useVpnCatalog` , `useProducts*` , `useCalculateOrder` , `useSubmitOrder`
- Service: `catalogService` (internet/sim/vpn endpoints consolidated)
- Billing
- Hooks: `useInvoices` , `usePaymentMethods` , `usePaymentGateways` , `usePaymentRefresh`
- Service: `BillingService`
- Orders
- Service: `ordersService` (list/detail/create)
- Account
- Service: `accountService` (`/me/address` )
2025-09-18 16:39:57 +09:00
- Support
- Views: `SupportCasesView` , `NewSupportCaseView` (mock data, ready for API wiring)
- Marketing
- Views: `PublicLandingView` , `PublicLandingLoadingView`