Files
pos-system/docs/en/templates/skill-pattern.md
Ho Ngoc Hai c851fd97eb docs: Revise architecture and template documentation for GoodGo Platform
- Updated the architecture documentation to enhance clarity with detailed diagrams and descriptions for the GoodGo Microservices Platform.
- Revised the .NET and Node.js template documentation to reflect new naming conventions, project structures, and setup instructions for local development.
- Improved the guide documentation with verification checklists, troubleshooting steps, and real-world examples to assist developers in deploying and managing services effectively.
- Ensured bilingual support in documentation to enhance accessibility for a wider audience.
2026-01-14 12:38:41 +07:00

14 KiB

[Pattern Name] Pattern / Pattern [Tên Pattern]

EN: Brief English description of when and why to use this pattern VI: Mô tả ngắn gọn bằng tiếng Việt về khi nào và tại sao sử dụng pattern này

Pattern Overview / Tổng quan Pattern

graph LR
    Input[Input/Request] --> Process[Pattern Process]
    Process --> Output[Output/Result]
    
    subgraph Pattern["Pattern Implementation"]
        Process --> Step1[Step 1]
        Step1 --> Step2[Step 2]
        Step2 --> Step3[Step 3]
    end
    
    style Input fill:#e1f5ff
    style Output fill:#d4edda
    style Pattern fill:#f0e1ff

When to Use / Khi nào sử dụng

EN: Use this pattern when

  • Scenario 1: Description of when this pattern is beneficial
  • Scenario 2: Another use case
  • Scenario 3: Additional context

DO use this pattern for:

  • Use case 1
  • Use case 2

DON'T use this pattern for:

  • Anti-pattern 1
  • Anti-pattern 2

VI: Sử dụng pattern này khi

  • Tình huống 1: Mô tả khi pattern này có lợi
  • Tình huống 2: Trường hợp sử dụng khác
  • Tình huống 3: Bối cảnh bổ sung

NÊN sử dụng pattern này cho:

  • Trường hợp 1
  • Trường hợp 2

KHÔNG NÊN sử dụng pattern này cho:

  • Anti-pattern 1
  • Anti-pattern 2

Core Concepts / Khái niệm Cốt lõi

EN: Key Principles

  1. Principle 1: Description of the first core principle
  2. Principle 2: Description of the second core principle
  3. Principle 3: Description of the third core principle

VI: Nguyên tắc Chính

  1. Nguyên tắc 1: Mô tả nguyên tắc cốt lõi đầu tiên
  2. Nguyên tắc 2: Mô tả nguyên tắc cốt lõi thứ hai
  3. Nguyên tắc 3: Mô tả nguyên tắc cốt lõi thứ ba

Implementation / Triển khai

Basic Implementation / Triển khai Cơ bản

EN: Step-by-step explanation of how to implement this pattern.

VI: Giải thích từng bước về cách triển khai pattern này.

// EN: Basic implementation example
// VI: Ví dụ triển khai cơ bản

/**
 * EN: Pattern implementation class
 * VI: Class triển khai pattern
 */
export class ExamplePattern {
  /**
   * EN: Constructor with dependencies
   * VI: Constructor với các dependencies
   */
  constructor(
    private dependency1: Dependency1,
    private dependency2: Dependency2
  ) {}

  /**
   * EN: Core method implementing the pattern
   * VI: Phương thức cốt lõi triển khai pattern
   * 
   * @param input - EN: Input data / VI: Dữ liệu đầu vào
   * @returns EN: Processed result / VI: Kết quả đã xử lý
   */
  async execute(input: InputType): Promise<OutputType> {
    // EN: Step 1: Validate input
    // VI: Bước 1: Validate đầu vào
    this.validateInput(input);

    // EN: Step 2: Process
    // VI: Bước 2: Xử lý
    const processed = await this.process(input);

    // EN: Step 3: Return result
    // VI: Bước 3: Trả về kết quả
    return this.formatOutput(processed);
  }

  private validateInput(input: InputType): void {
    // EN: Validation logic
    // VI: Logic validation
    if (!input) {
      throw new Error('Input is required / Đầu vào là bắt buộc');
    }
  }

  private async process(input: InputType): Promise<ProcessedType> {
    // EN: Core business logic
    // VI: Logic nghiệp vụ cốt lõi
    return await this.dependency1.transform(input);
  }

  private formatOutput(processed: ProcessedType): OutputType {
    // EN: Format for output
    // VI: Định dạng cho đầu ra
    return {
      success: true,
      data: processed,
    };
  }
}

File Location / Vị trí File:

Advanced Implementation / Triển khai Nâng cao

EN: More complex implementation with additional features like caching and error handling.

VI: Triển khai phức tạp hơn với các tính năng bổ sung như caching và xử lý lỗi.

// EN: Advanced .NET implementation with caching
// VI: Triển khai .NET nâng cao với caching

public class CachedStorageProvider : IStorageProvider
{
    private readonly IStorageProvider _innerProvider;
    private readonly IDistributedCache _cache;
    private readonly ILogger<CachedStorageProvider> _logger;

    public async Task<string> UploadFileAsync(Stream fileStream, string fileName, CancellationToken ct)
    {
        try
        {
            // EN: Upload file
            // VI: Upload file
            var result = await _innerProvider.UploadFileAsync(fileStream, fileName, ct);

            // EN: Invalidate cache
            // VI: Vô hiệu hóa cache
            await _cache.RemoveAsync($"file:{fileName}", ct);

            return result;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to upload file {FileName}", fileName);
            throw;
        }
    }
}

Pattern Diagram / Sơ đồ Pattern

Class Structure / Cấu trúc Class

classDiagram
    class ExamplePattern {
        -dependency1: Dependency1
        -dependency2: Dependency2
        +execute(input: InputType): OutputType
        -validateInput(input: InputType): void
        -process(input: InputType): ProcessedType
        -formatOutput(processed: ProcessedType): OutputType
    }
    
    class AdvancedExamplePattern {
        -cache: CacheService
        -logger: Logger
        +execute(input: InputType): OutputType
        -getCacheKey(input: InputType): string
    }
    
    class Dependency1 {
        +transform(input: InputType): ProcessedType
    }
    
    class CacheService {
        +get(key: string): Promise~any~
        +set(key: string, value: any, ttl: number): Promise~void~
    }
    
    ExamplePattern <|-- AdvancedExamplePattern
    ExamplePattern --> Dependency1
    AdvancedExamplePattern --> CacheService

Sequence Flow / Luồng Tuần tự

sequenceDiagram
    participant Client
    participant Pattern as ExamplePattern
    participant Dep1 as Dependency1
    participant Cache as CacheService
    
    Client->>Pattern: execute(input)
    Pattern->>Cache: get(cacheKey)
    Cache-->>Pattern: null (cache miss)
    Pattern->>Pattern: validateInput(input)
    Pattern->>Dep1: transform(input)
    Dep1-->>Pattern: processed
    Pattern->>Pattern: formatOutput(processed)
    Pattern->>Cache: set(cacheKey, result, ttl)
    Cache-->>Pattern: void
    Pattern-->>Client: result

Usage Examples / Ví dụ Sử dụng

Example 1: Multi-Provider Storage Pattern (Real-World)

EN: Real implementation from Storage Service.

VI: Triển khai thực tế từ Storage Service.

// Domain interface
public interface IStorageProvider
{
    Task<string> UploadFileAsync(Stream fileStream, string fileName, CancellationToken ct);
    Task<string> GeneratePresignedUrlAsync(string objectKey, int expiryMinutes, CancellationToken ct);
}

// Factory pattern
public class StorageProviderFactory
{
    public IStorageProvider CreateProvider(string providerName)
    {
        return providerName?.ToLower() switch
        {
            "minio" => _serviceProvider.GetRequiredService<MinioStorageProvider>(),
            "aliyun" => _serviceProvider.GetRequiredService<AliyunOssStorageProvider>(),
            _ => throw new InvalidOperationException($"Unknown provider: {providerName}")
        };
    }
}

File Reference: services/storage-service-net/src/StorageService.Infrastructure/Providers/


Example 2: CQRS with MediatR (Real-World)

EN: Command handler pattern from actual services.

VI: Pattern command handler từ các services thực tế.

// Command
public record CreateFileCommand(string FileName, Stream FileStream, string UserId) 
    : IRequest<CreateFileCommandResult>;

// Handler
public class CreateFileCommandHandler : IRequestHandler<CreateFileCommand, CreateFileCommandResult>
{
    private readonly IStorageProvider _storageProvider;
    private readonly IFileRepository _fileRepository;

    public async Task<CreateFileCommandResult> Handle(CreateFileCommand request, CancellationToken ct)
    {
        // Upload to storage
        var objectKey = await _storageProvider.UploadFileAsync(
            request.FileStream, 
            request.FileName, 
            ct
        );

        // Save metadata
        var file = new File(request.FileName, objectKey, request.UserId);
        await _fileRepository.AddAsync(file, ct);

        return new CreateFileCommandResult(file.Id);
    }
}

File Reference: See CQRS with MediatR Skill

Best Practices / Thực hành Tốt nhất

  1. Practice 1: Description of best practice with reasoning
  2. Practice 2: Another important guideline
  3. Practice 3: Additional recommendation

Configuration / Cấu hình:

const config = {
  timeout: 5000,
  retries: 3,
  cacheTime: 300, // 5 minutes
};

VI: Thực hành Được đề xuất

  1. Nguyên tắc 1: Mô tả best practice với lý do
  2. Nguyên tắc 2: Hướng dẫn quan trọng khác
  3. Nguyên tắc 3: Khuyến nghị bổ sung

Common Mistakes / Lỗi Thường gặp

EN: Mistakes to Avoid

Mistake 1 / Lỗi 1: [Description]

// ❌ BAD: Incorrect implementation
const result = await pattern.execute(null); // Will throw error
// ✅ GOOD: Correct implementation
if (input) {
  const result = await pattern.execute(input);
}

EN Why: Explanation of why the first approach is bad and the second is good.

VI Tại sao: Giải thích tại sao cách tiếp cận đầu tiên là không tốt và cách thứ hai là tốt.

Mistake 2 / Lỗi 2: [Description]

(Repeat pattern for each common mistake)

Performance Considerations / Cân nhắc Hiệu suất

EN: Performance characteristics and optimization tips.

VI: Đặc điểm hiệu suất và mẹo tối ưu hóa.

Aspect / Khía cạnh Impact / Tác động Mitigation / Giảm thiểu
Memory usage / Sử dụng RAM Medium / Trung bình Use caching strategically / Sử dụng caching có chiến lược
CPU usage / Sử dụng CPU Low / Thấp N/A
I/O operations / Thao tác I/O High / Cao Implement connection pooling / Triển khai connection pooling

Testing / Kiểm thử

Unit Test Example for .NET / Ví dụ Unit Test cho .NET

// EN: Unit test for CQRS command handler
// VI: Unit test cho CQRS command handler

using Xunit;
using NSubstitute;

public class CreateFileCommandHandlerTests
{
    private readonly IStorageProvider _storageProvider;
    private readonly IFileRepository _fileRepository;
    private readonly CreateFileCommandHandler _handler;

    public CreateFileCommandHandlerTests()
    {
        _storageProvider = Substitute.For<IStorageProvider>();
        _fileRepository = Substitute.For<IFileRepository>();
        _handler = new CreateFileCommandHandler(_storageProvider, _fileRepository);
    }

    [Fact]
    public async Task Handle_ValidCommand_CreatesFileSuccessfully()
    {
        // Arrange
        var command = new CreateFileCommand("test.txt", Stream.Null, "user-123");
        _storageProvider.UploadFileAsync(Arg.Any<Stream>(), Arg.Any<string>(), Arg.Any<CancellationToken>())
            .Returns("object-key-123");

        // Act
        var result = await _handler.Handle(command, CancellationToken.None);

        // Assert
        Assert.NotNull(result);
        Assert.NotEmpty(result.FileId);
        await _fileRepository.Received(1).AddAsync(Arg.Any<File>(), Arg.Any<CancellationToken>());
    }
}

Reference: See Testing Patterns Skill

EN: Other patterns that complement or relate to this one.

VI: Các patterns khác bổ sung hoặc liên quan đến pattern này.

GoodGo Skills:

Real-World Examples / Ví dụ Thực tế

EN: Examples of this pattern used in the GoodGo codebase.

VI: Ví dụ về pattern này được sử dụng trong codebase GoodGo.

Storage Service - Multi-Provider Pattern

File: services/storage-service-net/src/StorageService.Infrastructure/Providers/

Pattern: Factory pattern for switching between MinIO and Aliyun OSS providers.

IAM Service - RBAC Pattern

File: services/iam-service-net/

Pattern: Role-Based Access Control implementation with permission caching.

Additional Resources / Tài nguyên Bổ sung

VI: Tài liệu Liên quan

External Resources / Tài nguyên Bên ngoài


Complexity / Độ phức tạp: Beginner/Intermediate/Advanced
Category / Danh mục: [Category Name]
Authors / Tác giả: VelikHo (hongochai10@icloud.com)