Skip to main content

Design Patterns Overview

CreditNexus follows established design patterns to ensure maintainability, testability, and scalability. This document outlines the key patterns used throughout the codebase. Code Reference: .cursor/rules/architecture.mdc, .cursor/rules/service-layer.mdc

Dependency Injection Pattern

Overview

FastAPI’s dependency injection system is used throughout the application to manage dependencies and ensure testability. Code Reference: app/db/__init__.py, app/auth/jwt_auth.py, app/services/policy_service.py

Implementation

Key Principles

  • ALWAYS use FastAPI’s Depends() for dependency injection
  • ALWAYS create dependency functions in appropriate modules
  • NEVER create database sessions directly - always use get_db() dependency
  • NEVER access global state directly - inject dependencies

Service Layer Pattern

Overview

Business logic is encapsulated in service classes, separating concerns from API routes and database models. Code Reference: app/services/ directory

Implementation

Key Principles

  • ALWAYS create service classes for business logic
  • ALWAYS keep services stateless (no instance variables)
  • ALWAYS inject dependencies into service constructors
  • ALWAYS use service layer between API routes and database models

Repository Pattern (Implicit)

Overview

SQLAlchemy models serve as repositories, providing query methods and data access. Code Reference: app/db/models.py

Implementation

Key Principles

  • Use SQLAlchemy models directly as repositories
  • ALWAYS use joinedload() for eager loading relationships
  • ALWAYS use query methods on models, not raw SQL
  • ALWAYS handle transactions explicitly with db.commit() / db.rollback()

Factory Pattern

Overview

Factory functions centralize object creation and configuration. Code Reference: app/core/llm_client.py, app/services/policy_engine_factory.py

Implementation

Key Principles

  • ALWAYS use factory functions for creating complex objects
  • ALWAYS centralize configuration in factory functions
  • Examples: get_chat_model(), get_policy_engine(), load_ssl_context()

Lifespan Management Pattern

Overview

FastAPI’s lifespan context manager handles application startup and shutdown. Code Reference: server.py (lifespan function)

Implementation

Key Principles

  • ALWAYS use FastAPI’s lifespan context manager
  • ALWAYS initialize global resources in lifespan function
  • ALWAYS clean up resources in shutdown phase
  • ALWAYS handle initialization errors gracefully

CDM Event Pattern

Overview

All state changes and policy decisions are stored as CDM-compliant events. Code Reference: app/models/cdm_events.py

Implementation

Key Principles

  • ALWAYS generate CDM events for state changes
  • ALWAYS include required CDM fields: eventType, eventDate, meta.globalKey
  • ALWAYS link events to transactions via transaction_id
  • ALWAYS store events in database

Policy-as-Code Pattern

Overview

Policy rules are defined as YAML files and evaluated deterministically. Code Reference: app/policies/, app/services/policy_service.py

Implementation

Key Principles

  • ALWAYS define policies as YAML files
  • ALWAYS evaluate policies deterministically
  • ALWAYS store policy decisions as CDM events
  • ALWAYS handle three decision types: ALLOW, BLOCK, FLAG

LLM Abstraction Pattern

Overview

LLM clients are abstracted to support multiple providers (OpenAI, vLLM, HuggingFace). Code Reference: app/core/llm_client.py

Implementation

Key Principles

  • NEVER directly instantiate ChatOpenAI or OpenAIEmbeddings
  • ALWAYS use get_chat_model() and get_embeddings_model()
  • ALWAYS support multiple providers via configuration
  • ALWAYS use provider-agnostic interfaces

Audit Trail Pattern

Overview

All state-changing operations are logged with audit trails. Code Reference: app/utils/audit.py

Implementation

Key Principles

  • ALWAYS log audit actions for state changes
  • ALWAYS include user ID and timestamp
  • ALWAYS include relevant metadata
  • ALWAYS link audit logs to entities

Error Handling Pattern

Overview

Consistent error handling with appropriate HTTP status codes and error messages. Code Reference: app/api/routes.py (error handling)

Implementation

Key Principles

  • ALWAYS use HTTPException for API errors
  • ALWAYS log errors before raising
  • ALWAYS provide clear error messages
  • ALWAYS use appropriate status codes

Additional Resources


Last Updated: 2026-01-14
Code Reference: .cursor/rules/architecture.mdc, app/services/, app/core/llm_client.py