Skip to main content

System Layers

Sercha Core is organized into four distinct layers, each with specific responsibilities and dependency rules.

Layer Overview

Layer Details

1. Driving Layer (Adapters)

Location: internal/adapters/driving/

External interfaces that call into the application:

ComponentPurpose
http/REST API handlers, middleware, routing
worker/Background job processing

Dependencies: Can import from Application and Domain layers.

2. Application Layer (Services)

Location: internal/core/services/

Business logic orchestration:

ServiceResponsibility
AuthServiceLogin, logout, token management
SearchServiceQuery execution, result ranking
SourceServiceData source CRUD and configuration
SyncServiceDocument synchronization
UserServiceUser management
DocumentServiceDocument CRUD
IndexServiceSearch index management
ChunkServiceDocument chunking

Dependencies: Can import from Domain layer only.

3. Domain Layer (Core)

Location: internal/core/domain/ and internal/core/ports/

Pure business entities and interface definitions:

ComponentContents
domain/User, Document, Source, Chunk, Session, etc.
ports/driving/Service interfaces
ports/driven/Infrastructure interfaces

Dependencies: No external imports (pure Go only).

4. Infrastructure Layer (Driven Adapters)

Location: internal/adapters/driven/

External system integrations:

Required:

AdapterImplements
postgres/UserStore, DocumentStore, SourceStore, SessionStore, JobQueue
vespa/SearchEngine

Optional:

AdapterImplements
redis/SessionStore, JobQueue (overrides PostgreSQL at scale)
embedding/EmbeddingService
llm/LLMService

Dependencies: Can import from Domain layer only.

Dependency Matrix

LayerCan Import From
DrivingApplication, Domain
ApplicationDomain
DomainNothing (pure Go)
InfrastructureDomain

Directory Structure

internal/
├── adapters/
│ ├── driving/
│ │ └── http/ # REST API
│ └── driven/
│ ├── postgres/ # Database adapter (required)
│ ├── vespa/ # Search adapter (required)
│ ├── redis/ # Cache/queue adapter (optional)
│ ├── embedding/ # Embedding adapter (optional)
│ └── llm/ # LLM adapter (optional)
├── core/
│ ├── domain/ # Entities and errors
│ ├── ports/
│ │ ├── driving/ # Service interfaces
│ │ └── driven/ # Infrastructure interfaces
│ └── services/ # Business logic
└── app/ # Application container

Next