docs: update dead links
This commit is contained in:
816
docs/content/architecture/module-requirements.md
Normal file
816
docs/content/architecture/module-requirements.md
Normal file
@@ -0,0 +1,816 @@
|
||||
# Module Requirements
|
||||
|
||||
This document provides detailed requirements for each module in the Go Platform, including interfaces, responsibilities, and integration points.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Core Kernel Modules](#core-kernel-modules)
|
||||
- [Security Modules](#security-modules)
|
||||
- [Infrastructure Modules](#infrastructure-modules)
|
||||
- [Feature Modules](#feature-modules)
|
||||
|
||||
## Core Kernel Modules
|
||||
|
||||
### Configuration Module
|
||||
|
||||
**Purpose**: Hierarchical configuration management with support for multiple sources.
|
||||
|
||||
**Requirements**:
|
||||
- Load configuration from YAML files (default, environment-specific)
|
||||
- Support environment variable overrides
|
||||
- Support secret manager integration (AWS Secrets Manager, Vault)
|
||||
- Type-safe configuration access
|
||||
- Configuration validation
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type ConfigProvider interface {
|
||||
Get(key string) any
|
||||
Unmarshal(v any) error
|
||||
GetString(key string) string
|
||||
GetInt(key string) int
|
||||
GetBool(key string) bool
|
||||
GetStringSlice(key string) []string
|
||||
GetDuration(key string) time.Duration
|
||||
IsSet(key string) bool
|
||||
}
|
||||
```
|
||||
|
||||
**Implementation**:
|
||||
- Uses `github.com/spf13/viper` for configuration loading
|
||||
- Load order: `default.yaml` → `{env}.yaml` → environment variables → secrets
|
||||
- Supports nested configuration keys (e.g., `server.port`)
|
||||
|
||||
**Configuration Schema**:
|
||||
```yaml
|
||||
environment: development
|
||||
server:
|
||||
port: 8080
|
||||
host: "0.0.0.0"
|
||||
timeout: 30s
|
||||
database:
|
||||
driver: "postgres"
|
||||
dsn: ""
|
||||
max_connections: 25
|
||||
max_idle_connections: 5
|
||||
logging:
|
||||
level: "info"
|
||||
format: "json"
|
||||
output: "stdout"
|
||||
cache:
|
||||
enabled: true
|
||||
ttl: 5m
|
||||
```
|
||||
|
||||
**Dependencies**: None (foundation module)
|
||||
|
||||
---
|
||||
|
||||
### Logging Module
|
||||
|
||||
**Purpose**: Structured logging with support for multiple outputs and log levels.
|
||||
|
||||
**Requirements**:
|
||||
- Structured JSON logging for production
|
||||
- Human-readable logging for development
|
||||
- Support for log levels (debug, info, warn, error)
|
||||
- Request-scoped fields (request_id, user_id, trace_id)
|
||||
- Contextual logging (with fields)
|
||||
- Performance: minimal overhead
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type Field interface{}
|
||||
|
||||
type Logger interface {
|
||||
Debug(msg string, fields ...Field)
|
||||
Info(msg string, fields ...Field)
|
||||
Warn(msg string, fields ...Field)
|
||||
Error(msg string, fields ...Field)
|
||||
Fatal(msg string, fields ...Field)
|
||||
With(fields ...Field) Logger
|
||||
}
|
||||
|
||||
// Helper functions
|
||||
func String(key, value string) Field
|
||||
func Int(key string, value int) Field
|
||||
func Error(err error) Field
|
||||
func Duration(key string, value time.Duration) Field
|
||||
```
|
||||
|
||||
**Implementation**:
|
||||
- Uses `go.uber.org/zap` for high-performance logging
|
||||
- JSON encoder for production, console encoder for development
|
||||
- Global logger instance accessible via `pkg/logger`
|
||||
- Request-scoped logger via context
|
||||
|
||||
**Example Usage**:
|
||||
```go
|
||||
logger.Info("User logged in",
|
||||
logger.String("user_id", userID),
|
||||
logger.String("ip", ipAddress),
|
||||
logger.Duration("duration", duration),
|
||||
)
|
||||
```
|
||||
|
||||
**Dependencies**: Configuration Module
|
||||
|
||||
---
|
||||
|
||||
### Dependency Injection Module
|
||||
|
||||
**Purpose**: Service registration and lifecycle management.
|
||||
|
||||
**Requirements**:
|
||||
- Service registration via constructors
|
||||
- Lifecycle management (OnStart/OnStop hooks)
|
||||
- Dependency resolution
|
||||
- Service overrides for testing
|
||||
- Module-based service composition
|
||||
|
||||
**Implementation**:
|
||||
- Uses `go.uber.org/fx` for dependency injection
|
||||
- Core services registered in `internal/di/core_module.go`
|
||||
- Modules register services via `fx.Provide()` in `Init()`
|
||||
- Lifecycle hooks via `fx.Lifecycle`
|
||||
|
||||
**Core Module Structure**:
|
||||
```go
|
||||
var CoreModule = fx.Options(
|
||||
fx.Provide(ProvideConfig),
|
||||
fx.Provide(ProvideLogger),
|
||||
fx.Provide(ProvideDatabase),
|
||||
fx.Provide(ProvideHealthCheckers),
|
||||
fx.Provide(ProvideMetrics),
|
||||
fx.Provide(ProvideErrorBus),
|
||||
fx.Provide(ProvideEventBus),
|
||||
// ... other core services
|
||||
)
|
||||
```
|
||||
|
||||
**Dependencies**: Configuration Module, Logging Module
|
||||
|
||||
---
|
||||
|
||||
### Health & Metrics Module
|
||||
|
||||
**Purpose**: Health checks and metrics collection.
|
||||
|
||||
**Requirements**:
|
||||
- Liveness endpoint (`/healthz`)
|
||||
- Readiness endpoint (`/ready`)
|
||||
- Metrics endpoint (`/metrics`) in Prometheus format
|
||||
- Composable health checkers
|
||||
- Custom metrics support
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type HealthChecker interface {
|
||||
Check(ctx context.Context) error
|
||||
}
|
||||
|
||||
type HealthRegistry interface {
|
||||
Register(name string, checker HealthChecker)
|
||||
Check(ctx context.Context) map[string]error
|
||||
}
|
||||
```
|
||||
|
||||
**Core Health Checkers**:
|
||||
- Database connectivity
|
||||
- Redis connectivity
|
||||
- Kafka connectivity (if enabled)
|
||||
- Disk space
|
||||
- Memory usage
|
||||
|
||||
**Metrics**:
|
||||
- HTTP request duration (histogram)
|
||||
- HTTP request count (counter)
|
||||
- Database query duration (histogram)
|
||||
- Cache hit/miss ratio (gauge)
|
||||
- Error count (counter)
|
||||
|
||||
**Dependencies**: Configuration Module, Logging Module
|
||||
|
||||
---
|
||||
|
||||
### Error Bus Module
|
||||
|
||||
**Purpose**: Centralized error handling and reporting.
|
||||
|
||||
**Requirements**:
|
||||
- Non-blocking error publishing
|
||||
- Multiple error sinks (logger, Sentry)
|
||||
- Error context preservation
|
||||
- Panic recovery integration
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type ErrorPublisher interface {
|
||||
Publish(err error)
|
||||
PublishWithContext(ctx context.Context, err error)
|
||||
}
|
||||
```
|
||||
|
||||
**Implementation**:
|
||||
- Channel-based error bus
|
||||
- Background goroutine consumes errors
|
||||
- Pluggable sinks (logger, Sentry)
|
||||
- Context extraction (user_id, trace_id, module)
|
||||
|
||||
**Dependencies**: Logging Module
|
||||
|
||||
---
|
||||
|
||||
## Security Modules
|
||||
|
||||
### Authentication Module
|
||||
|
||||
**Purpose**: User authentication via JWT tokens.
|
||||
|
||||
**Requirements**:
|
||||
- JWT access token generation (short-lived, 15 minutes)
|
||||
- JWT refresh token generation (long-lived, 7 days)
|
||||
- Token validation and verification
|
||||
- Token claims extraction
|
||||
- Refresh token storage and revocation
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type Authenticator interface {
|
||||
GenerateAccessToken(userID string, roles []string, tenantID string) (string, error)
|
||||
GenerateRefreshToken(userID string) (string, error)
|
||||
VerifyToken(token string) (*TokenClaims, error)
|
||||
RevokeRefreshToken(tokenHash string) error
|
||||
}
|
||||
|
||||
type TokenClaims struct {
|
||||
UserID string
|
||||
Roles []string
|
||||
TenantID string
|
||||
ExpiresAt time.Time
|
||||
IssuedAt time.Time
|
||||
}
|
||||
```
|
||||
|
||||
**Token Format**:
|
||||
- Algorithm: HS256 or RS256
|
||||
- Claims: `sub` (user ID), `roles`, `tenant_id`, `exp`, `iat`
|
||||
- Refresh tokens stored in database with hash
|
||||
|
||||
**Endpoints**:
|
||||
- `POST /api/v1/auth/login` - Authenticate and get tokens
|
||||
- `POST /api/v1/auth/refresh` - Refresh access token
|
||||
- `POST /api/v1/auth/logout` - Revoke refresh token
|
||||
|
||||
**Dependencies**: Identity Module, Configuration Module
|
||||
|
||||
---
|
||||
|
||||
### Authorization Module
|
||||
|
||||
**Purpose**: Role-based and attribute-based access control.
|
||||
|
||||
**Requirements**:
|
||||
- Permission-based authorization
|
||||
- Role-to-permission mapping
|
||||
- User-to-role assignment
|
||||
- Permission caching
|
||||
- Context-aware authorization
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type PermissionResolver interface {
|
||||
HasPermission(ctx context.Context, userID string, perm Permission) (bool, error)
|
||||
GetUserPermissions(ctx context.Context, userID string) ([]Permission, error)
|
||||
}
|
||||
|
||||
type Authorizer interface {
|
||||
Authorize(ctx context.Context, perm Permission) error
|
||||
}
|
||||
```
|
||||
|
||||
**Permission Format**:
|
||||
- String format: `"{module}.{resource}.{action}"`
|
||||
- Examples: `blog.post.create`, `user.read`, `system.health.check`
|
||||
- Code-generated constants for type safety
|
||||
|
||||
**Authorization Flow**:
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Request
|
||||
participant AuthzMiddleware
|
||||
participant Authorizer
|
||||
participant PermissionResolver
|
||||
participant Cache
|
||||
participant DB
|
||||
|
||||
Request->>AuthzMiddleware: HTTP request with permission
|
||||
AuthzMiddleware->>Authorizer: Authorize(ctx, permission)
|
||||
Authorizer->>Authorizer: Extract user from context
|
||||
Authorizer->>PermissionResolver: HasPermission(user, permission)
|
||||
PermissionResolver->>Cache: Check cache
|
||||
Cache-->>PermissionResolver: Cache miss
|
||||
PermissionResolver->>DB: Load user roles
|
||||
PermissionResolver->>DB: Load role permissions
|
||||
DB-->>PermissionResolver: Permissions
|
||||
PermissionResolver->>Cache: Store in cache
|
||||
PermissionResolver-->>Authorizer: Has permission: true/false
|
||||
Authorizer-->>AuthzMiddleware: Authorized or error
|
||||
AuthzMiddleware-->>Request: Continue or 403
|
||||
```
|
||||
|
||||
**Dependencies**: Identity Module, Cache Module
|
||||
|
||||
---
|
||||
|
||||
### Identity Module
|
||||
|
||||
**Purpose**: User and role management.
|
||||
|
||||
**Requirements**:
|
||||
- User CRUD operations
|
||||
- Password hashing (argon2id)
|
||||
- Email verification
|
||||
- Password reset flow
|
||||
- Role management
|
||||
- Permission management
|
||||
- User-role assignment
|
||||
|
||||
**Interfaces**:
|
||||
```go
|
||||
type UserRepository interface {
|
||||
FindByID(ctx context.Context, id string) (*User, error)
|
||||
FindByEmail(ctx context.Context, email string) (*User, error)
|
||||
Create(ctx context.Context, u *User) error
|
||||
Update(ctx context.Context, u *User) error
|
||||
Delete(ctx context.Context, id string) error
|
||||
List(ctx context.Context, filters UserFilters) ([]*User, error)
|
||||
}
|
||||
|
||||
type UserService interface {
|
||||
Register(ctx context.Context, email, password string) (*User, error)
|
||||
VerifyEmail(ctx context.Context, token string) error
|
||||
ResetPassword(ctx context.Context, email string) error
|
||||
ChangePassword(ctx context.Context, userID, oldPassword, newPassword string) error
|
||||
UpdateProfile(ctx context.Context, userID string, updates UserUpdates) error
|
||||
}
|
||||
|
||||
type RoleRepository interface {
|
||||
FindByID(ctx context.Context, id string) (*Role, error)
|
||||
Create(ctx context.Context, r *Role) error
|
||||
Update(ctx context.Context, r *Role) error
|
||||
Delete(ctx context.Context, id string) error
|
||||
AssignPermissions(ctx context.Context, roleID string, permissions []Permission) error
|
||||
AssignToUser(ctx context.Context, userID string, roleIDs []string) error
|
||||
}
|
||||
```
|
||||
|
||||
**User Entity**:
|
||||
- ID (UUID)
|
||||
- Email (unique, verified)
|
||||
- Password hash (argon2id)
|
||||
- Email verified (boolean)
|
||||
- Created at, updated at
|
||||
- Tenant ID (optional, for multi-tenancy)
|
||||
|
||||
**Role Entity**:
|
||||
- ID (UUID)
|
||||
- Name (unique)
|
||||
- Description
|
||||
- Created at
|
||||
- Permissions (many-to-many)
|
||||
|
||||
**Dependencies**: Database Module, Notification Module, Cache Module
|
||||
|
||||
---
|
||||
|
||||
### Audit Module
|
||||
|
||||
**Purpose**: Immutable audit logging of security-relevant actions.
|
||||
|
||||
**Requirements**:
|
||||
- Append-only audit log
|
||||
- Actor tracking (user ID)
|
||||
- Action tracking (what was done)
|
||||
- Target tracking (what was affected)
|
||||
- Metadata storage (JSON)
|
||||
- Correlation IDs
|
||||
- High-performance writes
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type Auditor interface {
|
||||
Record(ctx context.Context, action AuditAction) error
|
||||
Query(ctx context.Context, filters AuditFilters) ([]AuditEntry, error)
|
||||
}
|
||||
|
||||
type AuditAction struct {
|
||||
ActorID string
|
||||
Action string // e.g., "user.created", "role.assigned"
|
||||
TargetID string
|
||||
Metadata map[string]any
|
||||
IPAddress string
|
||||
UserAgent string
|
||||
}
|
||||
```
|
||||
|
||||
**Audit Log Schema**:
|
||||
- ID (UUID)
|
||||
- Actor ID (user ID)
|
||||
- Action (string)
|
||||
- Target ID (resource ID)
|
||||
- Metadata (JSONB)
|
||||
- Timestamp
|
||||
- Request ID
|
||||
- IP Address
|
||||
- User Agent
|
||||
|
||||
**Automatic Audit Events**:
|
||||
- User login/logout
|
||||
- Password changes
|
||||
- Role assignments
|
||||
- Permission grants
|
||||
- Data modifications (configurable)
|
||||
|
||||
**Dependencies**: Database Module, Logging Module
|
||||
|
||||
---
|
||||
|
||||
## Infrastructure Modules
|
||||
|
||||
### Database Module
|
||||
|
||||
**Purpose**: Database access and ORM functionality.
|
||||
|
||||
**Requirements**:
|
||||
- PostgreSQL support (primary)
|
||||
- Connection pooling
|
||||
- Transaction support
|
||||
- Migration management
|
||||
- Query instrumentation (OpenTelemetry)
|
||||
- Multi-tenancy support (tenant_id filtering)
|
||||
|
||||
**Implementation**:
|
||||
- Uses `entgo.io/ent` for code generation
|
||||
- Ent schemas for all entities
|
||||
- Migration runner on startup
|
||||
- Connection pool configuration
|
||||
|
||||
**Database Client Interface**:
|
||||
```go
|
||||
type DatabaseClient interface {
|
||||
Client() *ent.Client
|
||||
Migrate(ctx context.Context) error
|
||||
Close() error
|
||||
HealthCheck(ctx context.Context) error
|
||||
}
|
||||
```
|
||||
|
||||
**Connection Pooling**:
|
||||
- Max connections: 25
|
||||
- Max idle connections: 5
|
||||
- Connection lifetime: 5 minutes
|
||||
- Idle timeout: 10 minutes
|
||||
|
||||
**Multi-Tenancy**:
|
||||
- Automatic tenant_id filtering via Ent interceptors
|
||||
- Tenant-aware queries
|
||||
- Tenant isolation at application level
|
||||
|
||||
**Dependencies**: Configuration Module, Logging Module
|
||||
|
||||
---
|
||||
|
||||
### Cache Module
|
||||
|
||||
**Purpose**: Distributed caching with Redis.
|
||||
|
||||
**Requirements**:
|
||||
- Key-value storage
|
||||
- TTL support
|
||||
- Distributed caching (shared across instances)
|
||||
- Cache invalidation
|
||||
- Fallback to in-memory cache
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type Cache interface {
|
||||
Get(ctx context.Context, key string) ([]byte, error)
|
||||
Set(ctx context.Context, key string, value []byte, ttl time.Duration) error
|
||||
Delete(ctx context.Context, key string) error
|
||||
Exists(ctx context.Context, key string) (bool, error)
|
||||
Increment(ctx context.Context, key string) (int64, error)
|
||||
}
|
||||
```
|
||||
|
||||
**Use Cases**:
|
||||
- User permissions caching
|
||||
- Role assignments caching
|
||||
- Session data
|
||||
- Rate limiting state
|
||||
- Query result caching (optional)
|
||||
|
||||
**Cache Key Format**:
|
||||
- `user:{user_id}:permissions`
|
||||
- `role:{role_id}:permissions`
|
||||
- `session:{session_id}`
|
||||
- `ratelimit:{user_id}:{endpoint}`
|
||||
|
||||
**Dependencies**: Configuration Module, Logging Module
|
||||
|
||||
---
|
||||
|
||||
### Event Bus Module
|
||||
|
||||
**Purpose**: Event-driven communication between modules.
|
||||
|
||||
**Requirements**:
|
||||
- Publish/subscribe pattern
|
||||
- Topic-based routing
|
||||
- In-process bus (development)
|
||||
- Kafka bus (production)
|
||||
- Error handling and retries
|
||||
- Event ordering (per partition)
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type EventBus interface {
|
||||
Publish(ctx context.Context, topic string, event Event) error
|
||||
Subscribe(topic string, handler EventHandler) error
|
||||
Unsubscribe(topic string) error
|
||||
}
|
||||
|
||||
type Event struct {
|
||||
ID string
|
||||
Type string
|
||||
Source string
|
||||
Timestamp time.Time
|
||||
Data map[string]any
|
||||
}
|
||||
|
||||
type EventHandler func(ctx context.Context, event Event) error
|
||||
```
|
||||
|
||||
**Core Events**:
|
||||
- `platform.user.created`
|
||||
- `platform.user.updated`
|
||||
- `platform.user.deleted`
|
||||
- `platform.role.assigned`
|
||||
- `platform.role.revoked`
|
||||
- `platform.permission.granted`
|
||||
|
||||
**Event Flow**:
|
||||
```mermaid
|
||||
graph LR
|
||||
Publisher[Module Publisher]
|
||||
Bus[Event Bus]
|
||||
Subscriber1[Module Subscriber 1]
|
||||
Subscriber2[Module Subscriber 2]
|
||||
Subscriber3[Module Subscriber 3]
|
||||
|
||||
Publisher -->|Publish| Bus
|
||||
Bus -->|Deliver| Subscriber1
|
||||
Bus -->|Deliver| Subscriber2
|
||||
Bus -->|Deliver| Subscriber3
|
||||
```
|
||||
|
||||
**Dependencies**: Configuration Module, Logging Module
|
||||
|
||||
---
|
||||
|
||||
### Scheduler Module
|
||||
|
||||
**Purpose**: Background job processing and cron scheduling.
|
||||
|
||||
**Requirements**:
|
||||
- Cron job scheduling
|
||||
- Async job queuing
|
||||
- Job retries with backoff
|
||||
- Job status tracking
|
||||
- Concurrency control
|
||||
- Job persistence
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type Scheduler interface {
|
||||
Cron(spec string, job JobFunc) error
|
||||
Enqueue(queue string, payload any) error
|
||||
EnqueueWithRetry(queue string, payload any, retries int) error
|
||||
}
|
||||
|
||||
type JobFunc func(ctx context.Context) error
|
||||
```
|
||||
|
||||
**Implementation**:
|
||||
- Uses `github.com/robfig/cron/v3` for cron jobs
|
||||
- Uses `github.com/hibiken/asynq` for job queuing
|
||||
- Redis-backed job queue
|
||||
- Job processor with worker pool
|
||||
|
||||
**Example Jobs**:
|
||||
- Cleanup expired tokens (daily)
|
||||
- Send digest emails (weekly)
|
||||
- Generate reports (monthly)
|
||||
- Data archival (custom schedule)
|
||||
|
||||
**Dependencies**: Cache Module (Redis), Logging Module
|
||||
|
||||
---
|
||||
|
||||
### Blob Storage Module
|
||||
|
||||
**Purpose**: File and blob storage abstraction.
|
||||
|
||||
**Requirements**:
|
||||
- File upload
|
||||
- File download
|
||||
- File deletion
|
||||
- Signed URL generation
|
||||
- Versioning support (optional)
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type BlobStore interface {
|
||||
Upload(ctx context.Context, key string, data []byte, contentType string) error
|
||||
Download(ctx context.Context, key string) ([]byte, error)
|
||||
Delete(ctx context.Context, key string) error
|
||||
GetSignedURL(ctx context.Context, key string, ttl time.Duration) (string, error)
|
||||
Exists(ctx context.Context, key string) (bool, error)
|
||||
}
|
||||
```
|
||||
|
||||
**Implementation**:
|
||||
- AWS S3 adapter (primary)
|
||||
- Local file system adapter (development)
|
||||
- GCS adapter (optional)
|
||||
|
||||
**Key Format**:
|
||||
- `{module}/{resource_type}/{resource_id}/{filename}`
|
||||
- Example: `blog/posts/abc123/image.jpg`
|
||||
|
||||
**Dependencies**: Configuration Module, Logging Module
|
||||
|
||||
---
|
||||
|
||||
### Notification Module
|
||||
|
||||
**Purpose**: Multi-channel notifications (email, SMS, push).
|
||||
|
||||
**Requirements**:
|
||||
- Email sending (SMTP, AWS SES)
|
||||
- SMS sending (Twilio, optional)
|
||||
- Push notifications (FCM, APNs, optional)
|
||||
- Webhook notifications
|
||||
- Template support
|
||||
- Retry logic
|
||||
|
||||
**Interface**:
|
||||
```go
|
||||
type Notifier interface {
|
||||
SendEmail(ctx context.Context, to, subject, body string) error
|
||||
SendEmailWithTemplate(ctx context.Context, to, template string, data map[string]any) error
|
||||
SendSMS(ctx context.Context, to, message string) error
|
||||
SendPush(ctx context.Context, deviceToken string, payload PushPayload) error
|
||||
SendWebhook(ctx context.Context, url string, payload map[string]any) error
|
||||
}
|
||||
```
|
||||
|
||||
**Email Templates**:
|
||||
- Email verification
|
||||
- Password reset
|
||||
- Welcome email
|
||||
- Notification digest
|
||||
|
||||
**Dependencies**: Configuration Module, Logging Module, Event Bus Module
|
||||
|
||||
---
|
||||
|
||||
## Feature Modules
|
||||
|
||||
### Blog Module (Example)
|
||||
|
||||
**Purpose**: Blog post management functionality.
|
||||
|
||||
**Requirements**:
|
||||
- Post CRUD operations
|
||||
- Comment system (optional)
|
||||
- Author-based access control
|
||||
- Post publishing workflow
|
||||
- Tag/category support
|
||||
|
||||
**Permissions**:
|
||||
- `blog.post.create`
|
||||
- `blog.post.read`
|
||||
- `blog.post.update`
|
||||
- `blog.post.delete`
|
||||
- `blog.post.publish`
|
||||
|
||||
**Routes**:
|
||||
- `POST /api/v1/blog/posts` - Create post
|
||||
- `GET /api/v1/blog/posts` - List posts
|
||||
- `GET /api/v1/blog/posts/:id` - Get post
|
||||
- `PUT /api/v1/blog/posts/:id` - Update post
|
||||
- `DELETE /api/v1/blog/posts/:id` - Delete post
|
||||
|
||||
**Domain Model**:
|
||||
```go
|
||||
type Post struct {
|
||||
ID string
|
||||
Title string
|
||||
Content string
|
||||
AuthorID string
|
||||
Status PostStatus // draft, published, archived
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
PublishedAt *time.Time
|
||||
}
|
||||
```
|
||||
|
||||
**Events Published**:
|
||||
- `blog.post.created`
|
||||
- `blog.post.updated`
|
||||
- `blog.post.published`
|
||||
- `blog.post.deleted`
|
||||
|
||||
**Dependencies**: Core Kernel, Identity Module, Event Bus Module
|
||||
|
||||
---
|
||||
|
||||
## Module Integration Matrix
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "Core Kernel (Required)"
|
||||
Config[Config]
|
||||
Logger[Logger]
|
||||
DI[DI Container]
|
||||
Health[Health]
|
||||
end
|
||||
|
||||
subgraph "Security (Required)"
|
||||
Auth[Auth]
|
||||
Authz[Authz]
|
||||
Identity[Identity]
|
||||
Audit[Audit]
|
||||
end
|
||||
|
||||
subgraph "Infrastructure (Optional)"
|
||||
DB[Database]
|
||||
Cache[Cache]
|
||||
EventBus[Event Bus]
|
||||
Scheduler[Scheduler]
|
||||
BlobStore[Blob Store]
|
||||
Notifier[Notifier]
|
||||
end
|
||||
|
||||
subgraph "Feature Modules"
|
||||
Blog[Blog]
|
||||
Billing[Billing]
|
||||
Custom[Custom Modules]
|
||||
end
|
||||
|
||||
Config --> Logger
|
||||
Config --> DI
|
||||
DI --> Health
|
||||
DI --> Auth
|
||||
DI --> Authz
|
||||
DI --> Identity
|
||||
DI --> Audit
|
||||
DI --> DB
|
||||
DI --> Cache
|
||||
DI --> EventBus
|
||||
DI --> Scheduler
|
||||
DI --> BlobStore
|
||||
DI --> Notifier
|
||||
|
||||
Auth --> Identity
|
||||
Authz --> Identity
|
||||
Authz --> Audit
|
||||
|
||||
Blog --> Auth
|
||||
Blog --> Authz
|
||||
Blog --> DB
|
||||
Blog --> EventBus
|
||||
Blog --> Cache
|
||||
|
||||
Billing --> Auth
|
||||
Billing --> Authz
|
||||
Billing --> DB
|
||||
Billing --> EventBus
|
||||
Billing --> Cache
|
||||
|
||||
Custom --> Auth
|
||||
Custom --> Authz
|
||||
Custom --> DB
|
||||
|
||||
style Config fill:#4a90e2,stroke:#2e5c8a,stroke-width:3px,color:#fff
|
||||
style Auth fill:#50c878,stroke:#2e7d4e,stroke-width:2px,color:#fff
|
||||
style Blog fill:#7b68ee,stroke:#5a4fcf,stroke-width:2px,color:#fff
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
- [Component Relationships](./component-relationships.md) - Detailed component interactions
|
||||
- [System Architecture](./architecture.md) - Overall system architecture
|
||||
- [Module Architecture](./architecture-modules.md) - Module design and integration
|
||||
|
||||
Reference in New Issue
Block a user