Skip to content

Latest commit

ย 

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Domain-Driven Design Task Management Application

A complete React + TypeScript application demonstrating Domain-Driven Design (DDD) principles with Domain Events, built with a clean architecture.

๐ŸŽฏ What This Demo Shows

This application demonstrates advanced DDD concepts:

  • โœ… Value Objects - Encapsulated business rules (TaskId, TaskTitle, TaskPriority, etc.)
  • โœ… Entities - Rich domain models with business logic (Task entity)
  • โœ… Domain Events - Decoupled side effects (TaskCompleted, TaskAssigned, TaskPriorityEscalated)
  • โœ… Domain Services - Multi-entity operations (TaskDependencyService)
  • โœ… Repositories - Data persistence abstraction
  • โœ… Use Cases - Application layer orchestration
  • โœ… Event-Driven Architecture - Publisher/Subscriber pattern
  • โœ… Dependency Injection - Service container pattern
  • โœ… Clean Architecture - Layered separation of concerns

๐Ÿ“ Project Structure

src/
โ”œโ”€โ”€ domain/                      # Business logic (Framework-independent)
โ”‚   โ”œโ”€โ”€ entities/
โ”‚   โ”‚   โ””โ”€โ”€ Task.ts             # Rich domain entity with business rules
โ”‚   โ”œโ”€โ”€ valueObjects/           # Immutable value objects
โ”‚   โ”‚   โ”œโ”€โ”€ TaskId.ts
โ”‚   โ”‚   โ”œโ”€โ”€ TaskTitle.ts
โ”‚   โ”‚   โ”œโ”€โ”€ TaskStatus.ts
โ”‚   โ”‚   โ”œโ”€โ”€ TaskPriority.ts
โ”‚   โ”‚   โ”œโ”€โ”€ TaskAssignment.ts
โ”‚   โ”‚   โ”œโ”€โ”€ TaskDependency.ts
โ”‚   โ”‚   โ””โ”€โ”€ UserId.ts
โ”‚   โ”œโ”€โ”€ events/                 # Domain events
โ”‚   โ”‚   โ”œโ”€โ”€ DomainEvent.ts
โ”‚   โ”‚   โ”œโ”€โ”€ TaskCompletedEvent.ts
โ”‚   โ”‚   โ”œโ”€โ”€ TaskAssignedEvent.ts
โ”‚   โ”‚   โ””โ”€โ”€ TaskPriorityEscalatedEvent.ts
โ”‚   โ”œโ”€โ”€ services/               # Domain services
โ”‚   โ”‚   โ””โ”€โ”€ TaskDependencyService.ts
โ”‚   โ””โ”€โ”€ repositories/           # Repository interfaces
โ”‚       โ””โ”€โ”€ ITaskRepository.ts
โ”‚
โ”œโ”€โ”€ application/                # Application logic
โ”‚   โ”œโ”€โ”€ useCases/              # Business use cases
โ”‚   โ”‚   โ”œโ”€โ”€ CreateTaskUseCase.ts
โ”‚   โ”‚   โ”œโ”€โ”€ AssignTaskUseCase.ts
โ”‚   โ”‚   โ”œโ”€โ”€ CompleteTaskUseCase.ts
โ”‚   โ”‚   โ””โ”€โ”€ GetAllTasksUseCase.ts
โ”‚   โ”œโ”€โ”€ services/              # Application services
โ”‚   โ”‚   โ””โ”€โ”€ DomainEventPublisher.ts
โ”‚   โ””โ”€โ”€ eventHandlers/         # Event handlers (side effects)
โ”‚       โ”œโ”€โ”€ TaskCompletedEventHandler.ts
โ”‚       โ”œโ”€โ”€ TaskAssignedEventHandler.ts
โ”‚       โ””โ”€โ”€ TaskPriorityEscalatedEventHandler.ts
โ”‚
โ”œโ”€โ”€ infrastructure/            # External concerns
โ”‚   โ”œโ”€โ”€ repositories/
โ”‚   โ”‚   โ””โ”€โ”€ LocalStorageTaskRepository.ts
โ”‚   โ”œโ”€โ”€ events/
โ”‚   โ”‚   โ””โ”€โ”€ EventPublisherFactory.ts
โ”‚   โ””โ”€โ”€ di/
โ”‚       โ””โ”€โ”€ ServiceContainer.ts
โ”‚
โ””โ”€โ”€ presentation/              # UI layer
    โ”œโ”€โ”€ components/
    โ”‚   โ””โ”€โ”€ TaskManagementApp.tsx
    โ””โ”€โ”€ hooks/
        โ””โ”€โ”€ useTaskManagement.ts

๐Ÿš€ Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn

Installation

# Install dependencies
npm install

# Start development server
npm run dev

# Build for production
npm run build

The application will be available at http://localhost:5173

๐ŸŽฎ Features & Demo

1. Create Tasks with Business Rules

  • Task titles are validated (1-200 characters)
  • Priority levels: Low, Medium, High, Critical
  • Domain events are automatically triggered

2. Task Assignment

  • Assign tasks to users
  • Only assigned users can complete tasks
  • Assignment events trigger notifications

3. Task Completion

  • Complete tasks and see completion events
  • Completed tasks cannot be modified
  • Completion triggers multiple event handlers

4. Domain Events Log

  • Real-time event log in the sidebar
  • See all domain events as they occur
  • Console shows detailed event information

5. Business Rules Enforcement

  • Tasks must be assigned before starting
  • Completed tasks cannot be reassigned
  • Dependency management prevents circular dependencies
  • Priority auto-escalation based on age

๐Ÿ—๏ธ Architecture Highlights

Value Objects (Immutability + Validation)

// TaskTitle enforces business rules
const title = TaskTitle.create("My Task"); // โœ… Valid
const invalid = TaskTitle.create(""); // โŒ Throws error

Rich Domain Entities

// Business logic lives in the domain
task.assignTo(userId, assignedBy);
task.complete(userId);
task.checkAndEscalatePriority();

Domain Events (Decoupling)

// Events are created in domain logic
task.complete(userId); // Creates TaskCompletedEvent

// Event handlers respond independently
TaskCompletedEventHandler โ†’ Send notifications
TaskCompletedEventHandler โ†’ Update analytics

Repository Pattern (Persistence Abstraction)

// Easy to swap implementations
const repository = new LocalStorageTaskRepository();
// Could easily become: new ApiTaskRepository()

๐Ÿ’ก Key DDD Concepts Demonstrated

1. Ubiquitous Language

Code uses business terms: Task, Assignment, Priority, Dependencies

2. Bounded Context

Task Management is a complete bounded context

3. Aggregate Roots

Task is an aggregate root managing its own consistency

4. Domain Events

Business events trigger cross-cutting concerns

5. Value Objects

Immutable, validated objects with business meaning

6. Entities

Objects with identity and lifecycle

7. Domain Services

Operations spanning multiple entities

๐Ÿงช Testing Domain Logic

The domain layer is completely framework-independent and easily testable:

describe('Task', () => {
  it('should not allow completing a task twice', () => {
    const task = Task.create(TaskTitle.create('Test'));
    const userId = UserId.create('user-1');
    
    task.complete(userId);
    
    expect(() => task.complete(userId))
      .toThrow('Task is already completed');
  });
});
  • yarn test:coverage: Runs the test suite and generates a coverage report.

Test Coverage

The test coverage report is automatically generated and published to GitHub Pages on every push to the main branch.

View Coverage Report

This application demonstrates patterns from:

  • Eric Evans' "Domain-Driven Design"
  • Vaughn Vernon's "Implementing Domain-Driven Design"
  • Martin Fowler's "Patterns of Enterprise Application Architecture"

๐Ÿ“ Next Steps

To extend this application:

  1. Add More Domain Logic: Task dependencies, subtasks, time tracking
  2. Implement API Repository: Replace localStorage with REST API
  3. Add Authentication: Real user management
  4. Create More Events: TaskStarted, TaskBlocked, etc.
  5. Add Specifications: Complex query patterns
  6. Implement CQRS: Separate read and write models

๐Ÿค Contributing

This is a demonstration project for learning DDD principles. Feel free to:

  • Fork and experiment
  • Add new features following DDD patterns
  • Share improvements

๐Ÿ“„ License

MIT


Built with โค๏ธ to demonstrate Domain-Driven Design in React + TypeScript

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages