knowledge-base
This file contains domain knowledge about the Cal.diy product and codebase. For coding…
**Impact: HIGH**
$ npx -y skills add calcom/cal.diy --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
**Impact: HIGH**
title: Use Factory Pattern to Push Conditionals to Entry Points impact: HIGH impactDescription: Keeps services focused and prevents complexity accumulation tags: patterns, factory, conditionals, single-responsibility
**Impact: HIGH**
If statements belong at the entry point, not scattered throughout your services. This is one of the most important architectural principles for maintaining clean, focused code that doesn't spiral into unmaintainable complexity.
**The problem with scattered conditionals:** A service is written for a clear, specific purpose. Then a new product requirement arrives, and someone adds an if statement. A few years later, that service is littered with conditional checks. The service becomes:
**Incorrect (conditionals scattered in service):**
class BillingService {
async processPayment(entityId: number, entityType: string) {
if (entityType === "organization") {
// Organization-specific logic
const org = await this.getOrganization(entityId);
if (org.billingPlan === "enterprise") {
// More nested conditionals...
}
} else if (entityType === "team") {
// Team-specific logic
} else if (entityType === "user") {
// User-specific logic
}
}
}**Correct (Factory pattern with specialized services):**
// Factory makes the decision at entry point
class BillingServiceFactory {
static async createService(entityId: number): Promise<BillingService> {
const entity = await determineEntityType(entityId);
switch (entity.type) {
case "organization":
return new OrganizationBillingService(entity);
case "team":
return new TeamBillingService(entity);
default:
return new UserBillingService(entity);
}
}
}
// Each service handles ONLY its specific logic - no conditionals
class OrganizationBillingService extends BillingService {
async processPayment() {
// Only organization logic here - clean and focused
}
}
class TeamBillingService extends BillingService {
async processPayment() {
// Only team logic here - clean and focused
}
}**Benefits:**
**Guidelines:**
Reference: [Cal.diy Engineering Blog](https://cal.com/blog/engineering-in-2026-and-beyond)
Repo: calcom/cal.com
This file contains domain knowledge about the Cal.diy product and codebase. For coding…
The `packages/features` package should contain only framework-agnostic code: - Repositories…