mirror of
https://github.com/torrentpier/torrentpier
synced 2025-08-22 06:13:58 -07:00
feat(architecture): implement hexagonal architecture foundation with DDD structure
- Add comprehensive hexagonal architecture directory structure for TorrentPier 3.0 - Create Domain, Application, Infrastructure, and Presentation layers - Establish bounded contexts for Forum, Tracker, and User domains - Add detailed README.md files for each layer and subdirectory with implementation guidance - Include hexagonal architecture specification document with migration strategy - Update composer dependencies to support new architecture - Set up foundation for CQRS, event-driven design, and clean separation of concerns This establishes the structural foundation for migrating TorrentPier to Domain-Driven Design principles using ports and adapters pattern. Future features will be built using this architecture while existing code remains functional during gradual migration. BREAKING CHANGE: New directory structure changes development workflow for new features
This commit is contained in:
parent
8a0f91304d
commit
6b160c6ac8
49 changed files with 1033 additions and 0 deletions
53
config/README.md
Normal file
53
config/README.md
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# Application Configuration
|
||||||
|
|
||||||
|
System configuration files using PHP arrays for type safety and IDE support:
|
||||||
|
|
||||||
|
- **app.php**: Core application settings
|
||||||
|
- Site name, URL, timezone
|
||||||
|
- Debug mode, environment
|
||||||
|
- Feature flags and toggles
|
||||||
|
|
||||||
|
- **database.php**: Database connection settings
|
||||||
|
- Multiple connection definitions
|
||||||
|
- Read/write splitting configuration
|
||||||
|
- Connection pooling settings
|
||||||
|
|
||||||
|
- **cache.php**: Cache driver configurations
|
||||||
|
- Redis, Memcached, file-based settings
|
||||||
|
- TTL defaults per cache type
|
||||||
|
- Cache key prefixes
|
||||||
|
|
||||||
|
- **tracker.php**: BitTorrent tracker settings
|
||||||
|
- Announce intervals
|
||||||
|
- Peer limits
|
||||||
|
- Ratio requirements
|
||||||
|
|
||||||
|
- **environments/**: Environment-specific overrides
|
||||||
|
- Development, staging, production settings
|
||||||
|
- Local developer configurations
|
||||||
|
|
||||||
|
Example database configuration:
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'default' => env('DB_CONNECTION', 'mysql'),
|
||||||
|
|
||||||
|
'connections' => [
|
||||||
|
'mysql' => [
|
||||||
|
'driver' => 'mysql',
|
||||||
|
'host' => env('DB_HOST', '127.0.0.1'),
|
||||||
|
'port' => env('DB_PORT', 3306),
|
||||||
|
'database' => env('DB_DATABASE', 'tp'),
|
||||||
|
'username' => env('DB_USERNAME', 'root'),
|
||||||
|
'password' => env('DB_PASSWORD', ''),
|
||||||
|
'charset' => 'utf8mb4',
|
||||||
|
'collation' => 'utf8mb4_unicode_ci',
|
||||||
|
'options' => [
|
||||||
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
|
PDO::ATTR_EMULATE_PREPARES => false,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
```
|
431
docs/specs/hexagonal-architecture-spec.md
Normal file
431
docs/specs/hexagonal-architecture-spec.md
Normal file
|
@ -0,0 +1,431 @@
|
||||||
|
# Hexagonal Architecture Directory Structure Specification
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This document specifies the new hexagonal architecture directory structure for TorrentPier 3.0. The structure follows Domain-Driven Design (DDD) principles and implements a clean separation of concerns through hexagonal architecture (ports and adapters pattern).
|
||||||
|
|
||||||
|
## Directory Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
/src/
|
||||||
|
├── Domain/ # Core business logic - no framework dependencies
|
||||||
|
│ ├── Forum/ # Forum bounded context
|
||||||
|
│ │ ├── Model/ # Aggregates and entities
|
||||||
|
│ │ ├── ValueObject/ # Value objects (PostId, ThreadTitle, etc.)
|
||||||
|
│ │ ├── Repository/ # Repository interfaces
|
||||||
|
│ │ └── Exception/ # Domain-specific exceptions
|
||||||
|
│ ├── Tracker/ # BitTorrent tracker bounded context
|
||||||
|
│ │ ├── Model/ # Torrent, Peer aggregates
|
||||||
|
│ │ ├── ValueObject/ # InfoHash, PeerId, etc.
|
||||||
|
│ │ ├── Repository/ # Repository interfaces
|
||||||
|
│ │ └── Exception/ # Tracker-specific exceptions
|
||||||
|
│ ├── User/ # User management bounded context
|
||||||
|
│ │ ├── Model/ # User aggregate
|
||||||
|
│ │ ├── ValueObject/ # UserId, Email, Username
|
||||||
|
│ │ ├── Repository/ # User repository interface
|
||||||
|
│ │ └── Exception/ # Authentication/authorization exceptions
|
||||||
|
│ └── Shared/ # Shared kernel - minimal shared concepts
|
||||||
|
│ ├── Model/ # Base classes (AggregateRoot, Entity)
|
||||||
|
│ ├── ValueObject/ # Common value objects (Id, DateTime)
|
||||||
|
│ └── Event/ # Domain events base classes
|
||||||
|
│
|
||||||
|
├── Application/ # Application services - orchestration layer
|
||||||
|
│ ├── Forum/
|
||||||
|
│ │ ├── Command/ # Commands (CreatePost, LockThread)
|
||||||
|
│ │ ├── Query/ # Queries (GetThreadList, SearchPosts)
|
||||||
|
│ │ └── Handler/ # Command and query handlers
|
||||||
|
│ ├── Tracker/
|
||||||
|
│ │ ├── Command/ # Commands (RegisterTorrent, ProcessAnnounce)
|
||||||
|
│ │ ├── Query/ # Queries (GetPeerList, GetTorrentStats)
|
||||||
|
│ │ └── Handler/ # Command and query handlers
|
||||||
|
│ └── User/
|
||||||
|
│ ├── Command/ # Commands (RegisterUser, ChangePassword)
|
||||||
|
│ ├── Query/ # Queries (GetUserProfile, SearchUsers)
|
||||||
|
│ └── Handler/ # Command and query handlers
|
||||||
|
│
|
||||||
|
├── Infrastructure/ # External concerns and implementations
|
||||||
|
│ ├── Persistence/ # Data persistence layer
|
||||||
|
│ │ ├── Database/ # Database adapter and connection management
|
||||||
|
│ │ ├── Migration/ # Database migrations
|
||||||
|
│ │ └── Repository/ # Repository implementations
|
||||||
|
│ ├── Cache/ # Caching implementations
|
||||||
|
│ │ ├── Redis/ # Redis adapter
|
||||||
|
│ │ ├── Memcached/ # Memcached adapter
|
||||||
|
│ │ └── File/ # File-based cache adapter
|
||||||
|
│ ├── Email/ # Email service implementations
|
||||||
|
│ │ ├── Template/ # Email templates
|
||||||
|
│ │ └── Transport/ # SMTP, API transports
|
||||||
|
│ └── FileStorage/ # File storage abstractions
|
||||||
|
│ ├── Local/ # Local filesystem storage
|
||||||
|
│ └── S3/ # AWS S3 storage adapter
|
||||||
|
│
|
||||||
|
└── Presentation/ # User interface layer
|
||||||
|
├── Http/ # Web interface
|
||||||
|
│ ├── Controllers/ # HTTP controllers
|
||||||
|
│ │ ├── Admin/ # Admin panel controllers
|
||||||
|
│ │ ├── Api/ # REST API controllers
|
||||||
|
│ │ └── Web/ # Web UI controllers
|
||||||
|
│ ├── Middleware/ # HTTP middleware (auth, CORS, etc.)
|
||||||
|
│ ├── Requests/ # Request DTOs and validation
|
||||||
|
│ └── Responses/ # Response transformers
|
||||||
|
└── Cli/ # Command line interface
|
||||||
|
└── Commands/ # Console commands
|
||||||
|
|
||||||
|
# Additional directories (outside /src/)
|
||||||
|
/config/ # Application configuration
|
||||||
|
├── app.php # Main application settings
|
||||||
|
├── database.php # Database connections
|
||||||
|
├── cache.php # Cache drivers configuration
|
||||||
|
├── tracker.php # BitTorrent tracker settings
|
||||||
|
└── environments/ # Environment-specific overrides
|
||||||
|
|
||||||
|
/tests/ # Test suites (Pest)
|
||||||
|
├── Unit/ # Unit tests (mirrors src/ structure)
|
||||||
|
├── Feature/ # Feature/Integration tests
|
||||||
|
├── Pest.php # Pest configuration
|
||||||
|
└── TestCase.php # Base test case
|
||||||
|
```
|
||||||
|
|
||||||
|
## Directory README.md Templates
|
||||||
|
|
||||||
|
### Domain Layer READMEs
|
||||||
|
|
||||||
|
#### `/src/Domain/README.md`
|
||||||
|
```markdown
|
||||||
|
# Domain Layer
|
||||||
|
|
||||||
|
This directory contains the core business logic of TorrentPier. Code here should:
|
||||||
|
- Have no dependencies on frameworks or infrastructure
|
||||||
|
- Represent pure business rules and domain models
|
||||||
|
- Be testable in isolation
|
||||||
|
- Use only PHP language features and domain concepts
|
||||||
|
|
||||||
|
## Bounded Contexts
|
||||||
|
- **Forum**: Discussion forums, posts, threads
|
||||||
|
- **Tracker**: BitTorrent tracking, peers, torrents
|
||||||
|
- **User**: User management, authentication, profiles
|
||||||
|
- **Shared**: Minimal shared concepts between contexts
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `/src/Domain/Tracker/Model/README.md`
|
||||||
|
```markdown
|
||||||
|
# Tracker Domain Models
|
||||||
|
|
||||||
|
Contains aggregate roots and entities for the BitTorrent tracker:
|
||||||
|
- `Torrent`: Aggregate root for torrent management
|
||||||
|
- `Peer`: Entity representing a BitTorrent peer
|
||||||
|
- `TorrentStatistics`: Value object for torrent stats
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class Torrent extends AggregateRoot
|
||||||
|
{
|
||||||
|
public function announce(Peer $peer, AnnounceEvent $event): void
|
||||||
|
{
|
||||||
|
// Business logic for handling announces
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `/src/Domain/Tracker/ValueObject/README.md`
|
||||||
|
```markdown
|
||||||
|
# Tracker Value Objects
|
||||||
|
|
||||||
|
Immutable objects representing domain concepts:
|
||||||
|
- `InfoHash`: 20-byte torrent identifier
|
||||||
|
- `PeerId`: Peer client identifier
|
||||||
|
- `Port`: Network port (1-65535)
|
||||||
|
- `BytesTransferred`: Upload/download bytes
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
final class InfoHash
|
||||||
|
{
|
||||||
|
private string $hash;
|
||||||
|
|
||||||
|
public function __construct(string $hash)
|
||||||
|
{
|
||||||
|
$this->guardAgainstInvalidHash($hash);
|
||||||
|
$this->hash = $hash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Application Layer READMEs
|
||||||
|
|
||||||
|
#### `/src/Application/README.md`
|
||||||
|
```markdown
|
||||||
|
# Application Layer
|
||||||
|
|
||||||
|
Contains application services that orchestrate domain objects to fulfill use cases.
|
||||||
|
- Commands: Write operations that change state
|
||||||
|
- Queries: Read operations for data retrieval
|
||||||
|
- Handlers: Process commands and queries
|
||||||
|
|
||||||
|
This layer should:
|
||||||
|
- Coordinate domain objects
|
||||||
|
- Handle transactions
|
||||||
|
- Dispatch domain events
|
||||||
|
- Not contain business logic
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `/src/Application/Tracker/Command/README.md`
|
||||||
|
```markdown
|
||||||
|
# Tracker Commands
|
||||||
|
|
||||||
|
Commands representing write operations:
|
||||||
|
- `RegisterTorrentCommand`: Register new torrent
|
||||||
|
- `UpdateTorrentCommand`: Modify torrent details
|
||||||
|
- `DeleteTorrentCommand`: Remove torrent from tracker
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
final class RegisterTorrentCommand
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public readonly string $infoHash,
|
||||||
|
public readonly int $uploaderId,
|
||||||
|
public readonly string $name,
|
||||||
|
public readonly int $size
|
||||||
|
) {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Infrastructure Layer READMEs
|
||||||
|
|
||||||
|
#### `/src/Infrastructure/README.md`
|
||||||
|
```markdown
|
||||||
|
# Infrastructure Layer
|
||||||
|
|
||||||
|
Technical implementations and external service adapters:
|
||||||
|
- Database persistence
|
||||||
|
- Caching mechanisms
|
||||||
|
- Email services
|
||||||
|
- File storage
|
||||||
|
- Third-party integrations
|
||||||
|
|
||||||
|
Infrastructure depends on domain, not vice versa.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `/src/Infrastructure/Persistence/Repository/README.md`
|
||||||
|
```markdown
|
||||||
|
# Repository Implementations
|
||||||
|
|
||||||
|
Concrete implementations of domain repository interfaces:
|
||||||
|
- Uses database adapter for persistence
|
||||||
|
- Implements caching strategies
|
||||||
|
- Handles query optimization
|
||||||
|
- Supports multiple database backends
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class TorrentRepository implements TorrentRepositoryInterface
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private DatabaseAdapterInterface $db
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public function findByInfoHash(InfoHash $infoHash): ?Torrent
|
||||||
|
{
|
||||||
|
// Database adapter implementation
|
||||||
|
$row = $this->db->select('torrents')
|
||||||
|
->where('info_hash', $infoHash->toString())
|
||||||
|
->first();
|
||||||
|
|
||||||
|
return $row ? $this->hydrateFromRow($row) : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Presentation Layer READMEs
|
||||||
|
|
||||||
|
#### `/src/Presentation/README.md`
|
||||||
|
```markdown
|
||||||
|
# Presentation Layer
|
||||||
|
|
||||||
|
User interface implementations:
|
||||||
|
- HTTP controllers for web and API
|
||||||
|
- CLI commands for console operations
|
||||||
|
- Request/response handling
|
||||||
|
- Input validation
|
||||||
|
- Output formatting
|
||||||
|
|
||||||
|
This layer translates between external format and application format.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `/src/Presentation/Http/Controllers/Api/README.md`
|
||||||
|
```markdown
|
||||||
|
# API Controllers
|
||||||
|
|
||||||
|
RESTful API endpoints following OpenAPI specification:
|
||||||
|
- JSON request/response format
|
||||||
|
- Proper HTTP status codes
|
||||||
|
- HATEOAS where applicable
|
||||||
|
- Rate limiting aware
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class UserController
|
||||||
|
{
|
||||||
|
public function register(RegisterRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$command = new RegisterUserCommand(
|
||||||
|
$request->getUsername(),
|
||||||
|
$request->getEmail(),
|
||||||
|
$request->getPassword()
|
||||||
|
);
|
||||||
|
|
||||||
|
$userId = $this->commandBus->handle($command);
|
||||||
|
|
||||||
|
return new JsonResponse([
|
||||||
|
'id' => $userId,
|
||||||
|
'username' => $request->getUsername()
|
||||||
|
], Response::HTTP_CREATED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `/src/Presentation/Http/Controllers/Admin/README.md`
|
||||||
|
```markdown
|
||||||
|
# Admin Panel Controllers
|
||||||
|
|
||||||
|
Administrative interface controllers with enhanced security:
|
||||||
|
- Role-based access control (RBAC)
|
||||||
|
- Audit logging for all actions
|
||||||
|
- Additional authentication checks
|
||||||
|
- Administrative dashboards and reports
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class AdminUserController
|
||||||
|
{
|
||||||
|
public function index(Request $request): Response
|
||||||
|
{
|
||||||
|
$query = new GetUsersQuery(
|
||||||
|
page: $request->getPage(),
|
||||||
|
filters: $request->getFilters()
|
||||||
|
);
|
||||||
|
|
||||||
|
$users = $this->queryBus->handle($query);
|
||||||
|
|
||||||
|
return $this->render('admin/users/index', [
|
||||||
|
'users' => $users,
|
||||||
|
'filters' => $request->getFilters()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `/config/README.md`
|
||||||
|
```markdown
|
||||||
|
# Application Configuration
|
||||||
|
|
||||||
|
System configuration files using PHP arrays for type safety and IDE support:
|
||||||
|
|
||||||
|
- **app.php**: Core application settings
|
||||||
|
- Site name, URL, timezone
|
||||||
|
- Debug mode, environment
|
||||||
|
- Feature flags and toggles
|
||||||
|
|
||||||
|
- **database.php**: Database connection settings
|
||||||
|
- Multiple connection definitions
|
||||||
|
- Read/write splitting configuration
|
||||||
|
- Connection pooling settings
|
||||||
|
|
||||||
|
- **cache.php**: Cache driver configurations
|
||||||
|
- Redis, Memcached, file-based settings
|
||||||
|
- TTL defaults per cache type
|
||||||
|
- Cache key prefixes
|
||||||
|
|
||||||
|
- **tracker.php**: BitTorrent tracker settings
|
||||||
|
- Announce intervals
|
||||||
|
- Peer limits
|
||||||
|
- Ratio requirements
|
||||||
|
|
||||||
|
- **environments/**: Environment-specific overrides
|
||||||
|
- Development, staging, production settings
|
||||||
|
- Local developer configurations
|
||||||
|
|
||||||
|
Example database configuration:
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'default' => env('DB_CONNECTION', 'mysql'),
|
||||||
|
|
||||||
|
'connections' => [
|
||||||
|
'mysql' => [
|
||||||
|
'driver' => 'mysql',
|
||||||
|
'host' => env('DB_HOST', '127.0.0.1'),
|
||||||
|
'port' => env('DB_PORT', 3306),
|
||||||
|
'database' => env('DB_DATABASE', 'tp'),
|
||||||
|
'username' => env('DB_USERNAME', 'root'),
|
||||||
|
'password' => env('DB_PASSWORD', ''),
|
||||||
|
'charset' => 'utf8mb4',
|
||||||
|
'collation' => 'utf8mb4_unicode_ci',
|
||||||
|
'options' => [
|
||||||
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
|
PDO::ATTR_EMULATE_PREPARES => false,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
## Implementation Order
|
||||||
|
|
||||||
|
1. **Phase 1: Foundation**
|
||||||
|
- Create directory structure
|
||||||
|
- Set up base classes in Domain/Shared
|
||||||
|
- Configure dependency injection
|
||||||
|
|
||||||
|
2. **Phase 2: Domain Modeling**
|
||||||
|
- Implement core aggregates
|
||||||
|
- Create value objects
|
||||||
|
- Define repository interfaces
|
||||||
|
|
||||||
|
3. **Phase 3: Application Services**
|
||||||
|
- Create commands and queries
|
||||||
|
- Implement handlers
|
||||||
|
- Set up event dispatching
|
||||||
|
|
||||||
|
4. **Phase 4: Infrastructure**
|
||||||
|
- Implement repositories
|
||||||
|
- Configure database adapter
|
||||||
|
- Set up caching
|
||||||
|
|
||||||
|
5. **Phase 5: Presentation**
|
||||||
|
- Create controllers
|
||||||
|
- Implement middleware
|
||||||
|
- Build CLI commands
|
||||||
|
|
||||||
|
## Migration Strategy
|
||||||
|
|
||||||
|
- Existing code remains in current locations
|
||||||
|
- New features built in hexagonal architecture
|
||||||
|
- Gradual migration using strangler fig pattern
|
||||||
|
- Legacy adapters bridge old and new code
|
||||||
|
- Feature flags control rollout
|
||||||
|
|
||||||
|
## Key Principles
|
||||||
|
|
||||||
|
1. **Dependency Rule**: Dependencies point inward (Presentation → Application → Domain)
|
||||||
|
2. **Domain Isolation**: Business logic has no framework dependencies
|
||||||
|
3. **Interface Segregation**: Small, focused interfaces
|
||||||
|
4. **CQRS**: Separate read and write models
|
||||||
|
5. **Event-Driven**: Domain events for cross-context communication
|
||||||
|
|
||||||
|
## Testing Strategy
|
||||||
|
|
||||||
|
- **Domain**: Pure unit tests, no mocks needed
|
||||||
|
- **Application**: Unit tests with mocked repositories
|
||||||
|
- **Infrastructure**: Integration tests with real services
|
||||||
|
- **Presentation**: E2E tests for user journeys
|
||||||
|
|
||||||
|
## Notes for Developers
|
||||||
|
|
||||||
|
- Start reading code from the Domain layer
|
||||||
|
- Business rules live in aggregates, not services
|
||||||
|
- Use value objects for type safety
|
||||||
|
- Prefer composition over inheritance
|
||||||
|
- Keep bounded contexts loosely coupled
|
10
src/Application/Forum/Command/README.md
Normal file
10
src/Application/Forum/Command/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Forum Commands
|
||||||
|
|
||||||
|
Commands representing write operations:
|
||||||
|
- `CreateThreadCommand`: Start new discussion
|
||||||
|
- `CreatePostCommand`: Reply to thread
|
||||||
|
- `EditPostCommand`: Modify existing post
|
||||||
|
- `LockThreadCommand`: Lock thread from replies
|
||||||
|
- `DeletePostCommand`: Remove post
|
||||||
|
|
||||||
|
Commands are simple DTOs containing operation data.
|
8
src/Application/Forum/Handler/README.md
Normal file
8
src/Application/Forum/Handler/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Forum Handlers
|
||||||
|
|
||||||
|
Command and query handlers for forum operations:
|
||||||
|
- `CreateThreadHandler`: Handles thread creation
|
||||||
|
- `CreatePostHandler`: Handles post creation
|
||||||
|
- `GetThreadListHandler`: Retrieves thread listings
|
||||||
|
|
||||||
|
Handlers coordinate between domain and infrastructure layers.
|
9
src/Application/Forum/Query/README.md
Normal file
9
src/Application/Forum/Query/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Forum Queries
|
||||||
|
|
||||||
|
Read-only queries for forum data:
|
||||||
|
- `GetThreadListQuery`: Paginated thread listing
|
||||||
|
- `GetPostsByThreadQuery`: Thread posts with pagination
|
||||||
|
- `SearchPostsQuery`: Full-text post search
|
||||||
|
- `GetForumStatsQuery`: Forum statistics
|
||||||
|
|
||||||
|
Queries return DTOs optimized for presentation.
|
12
src/Application/README.md
Normal file
12
src/Application/README.md
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# Application Layer
|
||||||
|
|
||||||
|
Contains application services that orchestrate domain objects to fulfill use cases.
|
||||||
|
- Commands: Write operations that change state
|
||||||
|
- Queries: Read operations for data retrieval
|
||||||
|
- Handlers: Process commands and queries
|
||||||
|
|
||||||
|
This layer should:
|
||||||
|
- Coordinate domain objects
|
||||||
|
- Handle transactions
|
||||||
|
- Dispatch domain events
|
||||||
|
- Not contain business logic
|
19
src/Application/Tracker/Command/README.md
Normal file
19
src/Application/Tracker/Command/README.md
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Tracker Commands
|
||||||
|
|
||||||
|
Commands representing write operations:
|
||||||
|
- `RegisterTorrentCommand`: Register new torrent
|
||||||
|
- `UpdateTorrentCommand`: Modify torrent details
|
||||||
|
- `DeleteTorrentCommand`: Remove torrent from tracker
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
final class RegisterTorrentCommand
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public readonly string $infoHash,
|
||||||
|
public readonly int $uploaderId,
|
||||||
|
public readonly string $name,
|
||||||
|
public readonly int $size
|
||||||
|
) {}
|
||||||
|
}
|
||||||
|
```
|
8
src/Application/Tracker/Handler/README.md
Normal file
8
src/Application/Tracker/Handler/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Tracker Handlers
|
||||||
|
|
||||||
|
Command and query handlers for tracker operations:
|
||||||
|
- `RegisterTorrentHandler`: Processes torrent registration
|
||||||
|
- `GetTorrentDetailsHandler`: Retrieves torrent information
|
||||||
|
- `UpdateTorrentHandler`: Handles torrent updates
|
||||||
|
|
||||||
|
Note: High-performance announce operations bypass this layer.
|
9
src/Application/Tracker/Query/README.md
Normal file
9
src/Application/Tracker/Query/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Tracker Queries
|
||||||
|
|
||||||
|
Read-only queries for tracker data:
|
||||||
|
- `GetTorrentDetailsQuery`: Single torrent information
|
||||||
|
- `GetPeerListQuery`: Active peers for torrent
|
||||||
|
- `GetTorrentStatsQuery`: Download/upload statistics
|
||||||
|
- `SearchTorrentsQuery`: Browse and filter torrents
|
||||||
|
|
||||||
|
Optimized for high-performance read operations.
|
10
src/Application/User/Command/README.md
Normal file
10
src/Application/User/Command/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# User Commands
|
||||||
|
|
||||||
|
Commands for user management operations:
|
||||||
|
- `RegisterUserCommand`: New user registration
|
||||||
|
- `ChangePasswordCommand`: Password update
|
||||||
|
- `UpdateProfileCommand`: Profile modifications
|
||||||
|
- `ActivateUserCommand`: Account activation
|
||||||
|
- `BanUserCommand`: User suspension
|
||||||
|
|
||||||
|
These commands trigger domain events for cross-context synchronization.
|
8
src/Application/User/Handler/README.md
Normal file
8
src/Application/User/Handler/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# User Handlers
|
||||||
|
|
||||||
|
Command and query handlers for user operations:
|
||||||
|
- `RegisterUserHandler`: Processes user registration
|
||||||
|
- `ChangePasswordHandler`: Handles password changes
|
||||||
|
- `GetUserProfileHandler`: Retrieves user profiles
|
||||||
|
|
||||||
|
Handlers manage transactions and event dispatching.
|
9
src/Application/User/Query/README.md
Normal file
9
src/Application/User/Query/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# User Queries
|
||||||
|
|
||||||
|
Read operations for user data:
|
||||||
|
- `GetUserProfileQuery`: User profile details
|
||||||
|
- `SearchUsersQuery`: User search with filters
|
||||||
|
- `GetUserStatisticsQuery`: Upload/download stats
|
||||||
|
- `GetUserPermissionsQuery`: Authorization data
|
||||||
|
|
||||||
|
Returns DTOs suitable for presentation layer.
|
7
src/Domain/Forum/Exception/README.md
Normal file
7
src/Domain/Forum/Exception/README.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Forum Domain Exceptions
|
||||||
|
|
||||||
|
Domain-specific exceptions for forum operations:
|
||||||
|
- `ThreadLockedException`: Attempt to post in locked thread
|
||||||
|
- `PostEditTimeExpiredException`: Edit time limit exceeded
|
||||||
|
- `ForumAccessDeniedException`: Insufficient permissions
|
||||||
|
- `InvalidPostContentException`: Post validation failed
|
13
src/Domain/Forum/Model/README.md
Normal file
13
src/Domain/Forum/Model/README.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Forum Domain Models
|
||||||
|
|
||||||
|
Contains aggregate roots and entities for the forum system:
|
||||||
|
- `Forum`: Forum category aggregate
|
||||||
|
- `Thread`: Discussion thread aggregate root
|
||||||
|
- `Post`: Individual post entity
|
||||||
|
- `Attachment`: File attachment entity
|
||||||
|
|
||||||
|
Business rules enforced at this level:
|
||||||
|
- Post editing time limits
|
||||||
|
- Thread locking rules
|
||||||
|
- Forum access permissions
|
||||||
|
- Post moderation workflow
|
8
src/Domain/Forum/Repository/README.md
Normal file
8
src/Domain/Forum/Repository/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Forum Repository Interfaces
|
||||||
|
|
||||||
|
Repository interfaces for forum aggregates:
|
||||||
|
- `ForumRepositoryInterface`: Forum aggregate persistence
|
||||||
|
- `ThreadRepositoryInterface`: Thread aggregate persistence
|
||||||
|
- `PostRepositoryInterface`: Post queries (read-only)
|
||||||
|
|
||||||
|
These interfaces define contracts that infrastructure must implement.
|
9
src/Domain/Forum/ValueObject/README.md
Normal file
9
src/Domain/Forum/ValueObject/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Forum Value Objects
|
||||||
|
|
||||||
|
Immutable objects representing forum concepts:
|
||||||
|
- `PostId`: Unique post identifier
|
||||||
|
- `ThreadTitle`: Thread title with validation
|
||||||
|
- `PostContent`: Formatted post content
|
||||||
|
- `ForumSlug`: URL-friendly forum identifier
|
||||||
|
|
||||||
|
These objects ensure type safety and encapsulate validation rules.
|
13
src/Domain/README.md
Normal file
13
src/Domain/README.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Domain Layer
|
||||||
|
|
||||||
|
This directory contains the core business logic of TorrentPier. Code here should:
|
||||||
|
- Have no dependencies on frameworks or infrastructure
|
||||||
|
- Represent pure business rules and domain models
|
||||||
|
- Be testable in isolation
|
||||||
|
- Use only PHP language features and domain concepts
|
||||||
|
|
||||||
|
## Bounded Contexts
|
||||||
|
- **Forum**: Discussion forums, posts, threads
|
||||||
|
- **Tracker**: BitTorrent tracking, peers, torrents
|
||||||
|
- **User**: User management, authentication, profiles
|
||||||
|
- **Shared**: Minimal shared concepts between contexts
|
13
src/Domain/Shared/Event/README.md
Normal file
13
src/Domain/Shared/Event/README.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Domain Events
|
||||||
|
|
||||||
|
Base classes and interfaces for domain event system:
|
||||||
|
- `DomainEvent`: Base event interface
|
||||||
|
- `EventRecording`: Trait for aggregate event recording
|
||||||
|
- `AggregateHistory`: Event sourcing support
|
||||||
|
|
||||||
|
Example events:
|
||||||
|
- `UserRegisteredEvent`
|
||||||
|
- `TorrentUploadedEvent`
|
||||||
|
- `ThreadCreatedEvent`
|
||||||
|
|
||||||
|
Events enable loose coupling between bounded contexts.
|
9
src/Domain/Shared/Exception/README.md
Normal file
9
src/Domain/Shared/Exception/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Shared Domain Exceptions
|
||||||
|
|
||||||
|
Base exception classes used across all bounded contexts:
|
||||||
|
- `DomainException`: Base domain exception
|
||||||
|
- `InvalidArgumentException`: Invalid input validation
|
||||||
|
- `EntityNotFoundException`: Generic entity not found
|
||||||
|
- `BusinessRuleViolationException`: Business rule violations
|
||||||
|
|
||||||
|
These provide common exception handling patterns without coupling contexts.
|
9
src/Domain/Shared/Model/README.md
Normal file
9
src/Domain/Shared/Model/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Shared Domain Models
|
||||||
|
|
||||||
|
Base classes and interfaces used across bounded contexts:
|
||||||
|
- `AggregateRoot`: Base class for all aggregates
|
||||||
|
- `Entity`: Base class for entities
|
||||||
|
- `DomainEvent`: Interface for domain events
|
||||||
|
- `ValueObject`: Base value object interface
|
||||||
|
|
||||||
|
These provide common functionality while maintaining context boundaries.
|
9
src/Domain/Shared/Repository/README.md
Normal file
9
src/Domain/Shared/Repository/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Shared Repository Interfaces
|
||||||
|
|
||||||
|
Common repository patterns and base interfaces:
|
||||||
|
- `RepositoryInterface`: Base repository contract
|
||||||
|
- `ReadOnlyRepositoryInterface`: Query-only operations
|
||||||
|
- `AggregateRepositoryInterface`: Aggregate-specific methods
|
||||||
|
- `Specification`: Query specification pattern
|
||||||
|
|
||||||
|
These define common persistence patterns without implementation details.
|
9
src/Domain/Shared/ValueObject/README.md
Normal file
9
src/Domain/Shared/ValueObject/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Shared Value Objects
|
||||||
|
|
||||||
|
Common value objects used across contexts:
|
||||||
|
- `Id`: Generic identifier base class
|
||||||
|
- `DateTime`: Immutable datetime wrapper
|
||||||
|
- `Money`: Monetary value representation
|
||||||
|
- `Percentage`: Percentage value (0-100)
|
||||||
|
|
||||||
|
These are minimal shared concepts that don't violate bounded context principles.
|
7
src/Domain/Tracker/Exception/README.md
Normal file
7
src/Domain/Tracker/Exception/README.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Tracker Domain Exceptions
|
||||||
|
|
||||||
|
Domain-specific exceptions for tracker operations:
|
||||||
|
- `InvalidInfoHashException`: Malformed info hash
|
||||||
|
- `InactiveTorrentException`: Torrent not active
|
||||||
|
- `PeerLimitExceededException`: Too many peers
|
||||||
|
- `InvalidAnnounceException`: Protocol violation
|
17
src/Domain/Tracker/Model/README.md
Normal file
17
src/Domain/Tracker/Model/README.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Tracker Domain Models
|
||||||
|
|
||||||
|
Contains aggregate roots and entities for the BitTorrent tracker:
|
||||||
|
- `Torrent`: Aggregate root for torrent management
|
||||||
|
- `Peer`: Entity representing a BitTorrent peer
|
||||||
|
- `TorrentStatistics`: Value object for torrent stats
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class Torrent extends AggregateRoot
|
||||||
|
{
|
||||||
|
public function announce(Peer $peer, AnnounceEvent $event): void
|
||||||
|
{
|
||||||
|
// Business logic for handling announces
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
8
src/Domain/Tracker/Repository/README.md
Normal file
8
src/Domain/Tracker/Repository/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Tracker Repository Interfaces
|
||||||
|
|
||||||
|
Repository interfaces for tracker aggregates:
|
||||||
|
- `TorrentRepositoryInterface`: Torrent aggregate persistence
|
||||||
|
- `PeerRepositoryInterface`: Peer data access
|
||||||
|
- `TrackerStatsRepositoryInterface`: Statistics queries
|
||||||
|
|
||||||
|
These define persistence contracts without implementation details.
|
21
src/Domain/Tracker/ValueObject/README.md
Normal file
21
src/Domain/Tracker/ValueObject/README.md
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# Tracker Value Objects
|
||||||
|
|
||||||
|
Immutable objects representing domain concepts:
|
||||||
|
- `InfoHash`: 20-byte torrent identifier
|
||||||
|
- `PeerId`: Peer client identifier
|
||||||
|
- `Port`: Network port (1-65535)
|
||||||
|
- `BytesTransferred`: Upload/download bytes
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
final class InfoHash
|
||||||
|
{
|
||||||
|
private string $hash;
|
||||||
|
|
||||||
|
public function __construct(string $hash)
|
||||||
|
{
|
||||||
|
$this->guardAgainstInvalidHash($hash);
|
||||||
|
$this->hash = $hash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
8
src/Domain/User/Exception/README.md
Normal file
8
src/Domain/User/Exception/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# User Domain Exceptions
|
||||||
|
|
||||||
|
Domain-specific exceptions for user operations:
|
||||||
|
- `UserNotFoundException`: User not found
|
||||||
|
- `DuplicateUsernameException`: Username already taken
|
||||||
|
- `InvalidCredentialsException`: Authentication failed
|
||||||
|
- `UserNotActivatedException`: Account not activated
|
||||||
|
- `PasswordComplexityException`: Weak password
|
13
src/Domain/User/Model/README.md
Normal file
13
src/Domain/User/Model/README.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# User Domain Models
|
||||||
|
|
||||||
|
Contains user management aggregates and entities:
|
||||||
|
- `User`: User aggregate root
|
||||||
|
- `UserProfile`: User profile information
|
||||||
|
- `UserCredentials`: Authentication credentials
|
||||||
|
- `UserPermissions`: Authorization rules
|
||||||
|
|
||||||
|
Business rules:
|
||||||
|
- Password complexity requirements
|
||||||
|
- Username uniqueness
|
||||||
|
- Email verification workflow
|
||||||
|
- Account activation/deactivation
|
9
src/Domain/User/Repository/README.md
Normal file
9
src/Domain/User/Repository/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# User Repository Interface
|
||||||
|
|
||||||
|
Repository interface for user aggregate:
|
||||||
|
- `UserRepositoryInterface`: User persistence and retrieval
|
||||||
|
- `findById(UserId $id): ?User`
|
||||||
|
- `findByUsername(Username $username): ?User`
|
||||||
|
- `findByEmail(Email $email): ?User`
|
||||||
|
- `save(User $user): void`
|
||||||
|
- `delete(User $user): void`
|
10
src/Domain/User/ValueObject/README.md
Normal file
10
src/Domain/User/ValueObject/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# User Value Objects
|
||||||
|
|
||||||
|
Immutable objects for user domain:
|
||||||
|
- `UserId`: Unique user identifier
|
||||||
|
- `Username`: Username with validation
|
||||||
|
- `Email`: Email address with format validation
|
||||||
|
- `HashedPassword`: Secure password representation
|
||||||
|
- `UserRole`: User role enumeration
|
||||||
|
|
||||||
|
These ensure data integrity and type safety.
|
8
src/Infrastructure/Cache/File/README.md
Normal file
8
src/Infrastructure/Cache/File/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# File Cache Adapter
|
||||||
|
|
||||||
|
File system-based caching implementation:
|
||||||
|
- Simple file-based storage
|
||||||
|
- Suitable for single-server deployments
|
||||||
|
- Directory structure optimization
|
||||||
|
- Lock file support for concurrency
|
||||||
|
- Automatic garbage collection
|
8
src/Infrastructure/Cache/Memcached/README.md
Normal file
8
src/Infrastructure/Cache/Memcached/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Memcached Cache Adapter
|
||||||
|
|
||||||
|
Memcached-based caching implementation:
|
||||||
|
- Simple key-value caching
|
||||||
|
- Distributed cache support
|
||||||
|
- Automatic key expiration
|
||||||
|
- Connection pooling
|
||||||
|
- Consistent hashing for distribution
|
8
src/Infrastructure/Cache/Redis/README.md
Normal file
8
src/Infrastructure/Cache/Redis/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Redis Cache Adapter
|
||||||
|
|
||||||
|
Redis-based caching implementation:
|
||||||
|
- High-performance key-value storage
|
||||||
|
- Support for data structures (lists, sets, hashes)
|
||||||
|
- TTL management
|
||||||
|
- Pub/sub for cache invalidation
|
||||||
|
- Cluster support for scalability
|
14
src/Infrastructure/Email/Template/README.md
Normal file
14
src/Infrastructure/Email/Template/README.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# Email Templates
|
||||||
|
|
||||||
|
Email template management:
|
||||||
|
- HTML and plain text templates
|
||||||
|
- Template variables and placeholders
|
||||||
|
- Multi-language support
|
||||||
|
- Template caching
|
||||||
|
- Preview functionality
|
||||||
|
|
||||||
|
Common templates:
|
||||||
|
- User registration confirmation
|
||||||
|
- Password reset
|
||||||
|
- Torrent notifications
|
||||||
|
- Forum post notifications
|
9
src/Infrastructure/Email/Transport/README.md
Normal file
9
src/Infrastructure/Email/Transport/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Email Transport
|
||||||
|
|
||||||
|
Email delivery mechanisms:
|
||||||
|
- `SmtpTransport`: Traditional SMTP delivery
|
||||||
|
- `SendgridTransport`: SendGrid API integration
|
||||||
|
- `MailgunTransport`: Mailgun API integration
|
||||||
|
- `NullTransport`: Testing/development transport
|
||||||
|
|
||||||
|
Supports queuing and retry mechanisms.
|
10
src/Infrastructure/FileStorage/Local/README.md
Normal file
10
src/Infrastructure/FileStorage/Local/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Local File Storage
|
||||||
|
|
||||||
|
Local filesystem storage implementation:
|
||||||
|
- Direct disk storage
|
||||||
|
- Directory structure management
|
||||||
|
- File permissions handling
|
||||||
|
- Atomic file operations
|
||||||
|
- Cleanup and maintenance
|
||||||
|
|
||||||
|
Used for torrent files, avatars, and attachments.
|
10
src/Infrastructure/FileStorage/S3/README.md
Normal file
10
src/Infrastructure/FileStorage/S3/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# S3 File Storage
|
||||||
|
|
||||||
|
Amazon S3 (or compatible) storage implementation:
|
||||||
|
- Cloud object storage
|
||||||
|
- Pre-signed URLs for direct uploads
|
||||||
|
- CDN integration support
|
||||||
|
- Lifecycle policies
|
||||||
|
- Multi-region support
|
||||||
|
|
||||||
|
Provides scalable storage for large deployments.
|
8
src/Infrastructure/Persistence/Database/README.md
Normal file
8
src/Infrastructure/Persistence/Database/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Database Adapter
|
||||||
|
|
||||||
|
Database connection and query building layer:
|
||||||
|
- `DatabaseAdapterInterface`: Common database operations
|
||||||
|
- `QueryBuilder`: Fluent query construction
|
||||||
|
- `ConnectionPool`: Connection management
|
||||||
|
|
||||||
|
Provides abstraction over raw database access.
|
9
src/Infrastructure/Persistence/Migration/README.md
Normal file
9
src/Infrastructure/Persistence/Migration/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Database Migrations
|
||||||
|
|
||||||
|
Schema version control and migration management:
|
||||||
|
- Migration files for schema changes
|
||||||
|
- Seed data for initial setup
|
||||||
|
- Rollback support
|
||||||
|
- Migration history tracking
|
||||||
|
|
||||||
|
Uses Phinx or similar migration tool.
|
27
src/Infrastructure/Persistence/Repository/README.md
Normal file
27
src/Infrastructure/Persistence/Repository/README.md
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# Repository Implementations
|
||||||
|
|
||||||
|
Concrete implementations of domain repository interfaces:
|
||||||
|
- Uses database adapter for persistence
|
||||||
|
- Implements caching strategies
|
||||||
|
- Handles query optimization
|
||||||
|
- Supports multiple database backends
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class TorrentRepository implements TorrentRepositoryInterface
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private DatabaseAdapterInterface $db
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public function findByInfoHash(InfoHash $infoHash): ?Torrent
|
||||||
|
{
|
||||||
|
// Database adapter implementation
|
||||||
|
$row = $this->db->select('torrents')
|
||||||
|
->where('info_hash', $infoHash->toString())
|
||||||
|
->first();
|
||||||
|
|
||||||
|
return $row ? $this->hydrateFromRow($row) : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
10
src/Infrastructure/README.md
Normal file
10
src/Infrastructure/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Infrastructure Layer
|
||||||
|
|
||||||
|
Technical implementations and external service adapters:
|
||||||
|
- Database persistence
|
||||||
|
- Caching mechanisms
|
||||||
|
- Email services
|
||||||
|
- File storage
|
||||||
|
- Third-party integrations
|
||||||
|
|
||||||
|
Infrastructure depends on domain, not vice versa.
|
9
src/Presentation/Cli/Commands/README.md
Normal file
9
src/Presentation/Cli/Commands/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# CLI Commands
|
||||||
|
|
||||||
|
Console commands for administrative tasks:
|
||||||
|
- `UserCreateCommand`: Create users from CLI
|
||||||
|
- `CacheClearCommand`: Clear cache stores
|
||||||
|
- `MigrateCommand`: Run database migrations
|
||||||
|
- `CronCommand`: Execute scheduled tasks
|
||||||
|
|
||||||
|
Built using Symfony Console component.
|
28
src/Presentation/Http/Controllers/Admin/README.md
Normal file
28
src/Presentation/Http/Controllers/Admin/README.md
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
# Admin Panel Controllers
|
||||||
|
|
||||||
|
Administrative interface controllers with enhanced security:
|
||||||
|
- Role-based access control (RBAC)
|
||||||
|
- Audit logging for all actions
|
||||||
|
- Additional authentication checks
|
||||||
|
- Administrative dashboards and reports
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class AdminUserController
|
||||||
|
{
|
||||||
|
public function index(Request $request): Response
|
||||||
|
{
|
||||||
|
$query = new GetUsersQuery(
|
||||||
|
page: $request->getPage(),
|
||||||
|
filters: $request->getFilters()
|
||||||
|
);
|
||||||
|
|
||||||
|
$users = $this->queryBus->handle($query);
|
||||||
|
|
||||||
|
return $this->render('admin/users/index', [
|
||||||
|
'users' => $users,
|
||||||
|
'filters' => $request->getFilters()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
29
src/Presentation/Http/Controllers/Api/README.md
Normal file
29
src/Presentation/Http/Controllers/Api/README.md
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# API Controllers
|
||||||
|
|
||||||
|
RESTful API endpoints following OpenAPI specification:
|
||||||
|
- JSON request/response format
|
||||||
|
- Proper HTTP status codes
|
||||||
|
- HATEOAS where applicable
|
||||||
|
- Rate limiting aware
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class UserController
|
||||||
|
{
|
||||||
|
public function register(RegisterRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$command = new RegisterUserCommand(
|
||||||
|
$request->getUsername(),
|
||||||
|
$request->getEmail(),
|
||||||
|
$request->getPassword()
|
||||||
|
);
|
||||||
|
|
||||||
|
$userId = $this->commandBus->handle($command);
|
||||||
|
|
||||||
|
return new JsonResponse([
|
||||||
|
'id' => $userId,
|
||||||
|
'username' => $request->getUsername()
|
||||||
|
], Response::HTTP_CREATED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
14
src/Presentation/Http/Controllers/Web/README.md
Normal file
14
src/Presentation/Http/Controllers/Web/README.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# Web Controllers
|
||||||
|
|
||||||
|
Traditional web interface controllers:
|
||||||
|
- HTML response generation
|
||||||
|
- Template rendering
|
||||||
|
- Form handling
|
||||||
|
- Session management
|
||||||
|
- CSRF protection
|
||||||
|
|
||||||
|
Controllers for:
|
||||||
|
- Forum browsing and posting
|
||||||
|
- Torrent browsing and downloading
|
||||||
|
- User profiles and settings
|
||||||
|
- Search functionality
|
11
src/Presentation/Http/Middleware/README.md
Normal file
11
src/Presentation/Http/Middleware/README.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# HTTP Middleware
|
||||||
|
|
||||||
|
Request/response pipeline middleware:
|
||||||
|
- `AuthenticationMiddleware`: User authentication
|
||||||
|
- `AuthorizationMiddleware`: Permission checks
|
||||||
|
- `CsrfProtectionMiddleware`: CSRF token validation
|
||||||
|
- `RateLimitMiddleware`: Request throttling
|
||||||
|
- `LocalizationMiddleware`: Language detection
|
||||||
|
- `CorsMiddleware`: Cross-origin resource sharing
|
||||||
|
|
||||||
|
Middleware follows PSR-15 standard.
|
23
src/Presentation/Http/Requests/README.md
Normal file
23
src/Presentation/Http/Requests/README.md
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# HTTP Requests
|
||||||
|
|
||||||
|
Request objects and validation:
|
||||||
|
- Request DTOs with validation rules
|
||||||
|
- Type-safe access to request data
|
||||||
|
- File upload handling
|
||||||
|
- Input sanitization
|
||||||
|
- Custom validation rules
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```php
|
||||||
|
class RegisterRequest extends FormRequest
|
||||||
|
{
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'username' => ['required', 'string', 'min:3', 'max:20', 'unique:users'],
|
||||||
|
'email' => ['required', 'email', 'unique:users'],
|
||||||
|
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
10
src/Presentation/Http/Responses/README.md
Normal file
10
src/Presentation/Http/Responses/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# HTTP Responses
|
||||||
|
|
||||||
|
Response transformation and formatting:
|
||||||
|
- Response factories
|
||||||
|
- JSON transformers
|
||||||
|
- View presenters
|
||||||
|
- Error response formatting
|
||||||
|
- Content negotiation
|
||||||
|
|
||||||
|
Ensures consistent API responses and proper HTTP semantics.
|
10
src/Presentation/README.md
Normal file
10
src/Presentation/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Presentation Layer
|
||||||
|
|
||||||
|
User interface implementations:
|
||||||
|
- HTTP controllers for web and API
|
||||||
|
- CLI commands for console operations
|
||||||
|
- Request/response handling
|
||||||
|
- Input validation
|
||||||
|
- Output formatting
|
||||||
|
|
||||||
|
This layer translates between external format and application format.
|
Loading…
Add table
Add a link
Reference in a new issue