Files
calendar/agents/rules/data-repository-pattern.md
T
Keith WilliamsGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
d4ea931bf8 feat(agents): add modular engineering rules from 2026 standards (#26847)
* feat(agents): add modular engineering rules from 2026 standards

Add a rules directory with individual rule files derived from the
Cal.com Engineering in 2026 and Beyond blog post. Rules are organized
by section (architecture, quality, data, api, performance, testing,
patterns, culture) following the Vercel agent-skills structure.

Includes:
- _sections.md defining rule categories and impact levels
- _template.md for creating new rules
- 14 individual rule files covering key engineering standards
- README documenting the rules structure and usage

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* feat(agents): consolidate DI and Repository+DTO docs into rules

- Move di-pattern.md content to rules/patterns-di-pattern.md
- Extract Repository + DTO section from knowledge-base.md into:
  - rules/data-repository-methods.md (method naming conventions)
  - rules/data-dto-boundaries.md (DTO location and naming)
- Update knowledge-base.md to reference the new rule files
- Delete old di-pattern.md file

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* chore(agents): remove stub reference sections from knowledge-base.md

The rules directory is self-contained with its own README, so these
redirect sections are unnecessary clutter.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* refactor(agents): combine DI pattern rules into single file

Merged patterns-di-pattern.md into patterns-dependency-injection.md
to eliminate overlap and create one comprehensive DI guide.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-01-16 10:57:28 +01:00

2.0 KiB

title, impact, impactDescription, tags
title impact impactDescription tags
Isolate Technology Choices Behind Repositories CRITICAL Enables technology changes without codebase-wide refactors data, repository, prisma, orm, isolation

Isolate Technology Choices Behind Repositories

Impact: CRITICAL

Technology choices must not seep through the application. The Prisma problem illustrates this perfectly: we currently have references to Prisma scattered across hundreds of files. This creates massive coupling and makes technology changes prohibitively expensive.

Incorrect (Prisma leaking throughout codebase):

// In a service file
import { prisma } from "@calcom/prisma";

async function getBooking(id: number) {
  // Direct Prisma usage in service
  return prisma.booking.findFirst({
    where: { id },
    include: { user: true }
  });
}

Correct (Repository abstraction):

// In repository file
import { prisma } from "@calcom/prisma";

export class BookingRepository {
  async findById(id: number): Promise<BookingDTO | null> {
    const booking = await prisma.booking.findFirst({
      where: { id },
      select: { id: true, title: true, userId: true }
    });
    return booking ? this.toDTO(booking) : null;
  }
}

// In service file - no Prisma knowledge
import { BookingRepository } from "./repositories/BookingRepository";

async function getBooking(id: number) {
  return this.bookingRepository.findById(id);
}

The standard:

  • All database access must go through Repository classes
  • Repositories are the only code that knows about Prisma (or any other ORM)
  • No business logic should be in repositories
  • Repositories are injected via Dependency Injection containers

Benefits: If we ever switch from Prisma to Drizzle or another ORM, the only changes required are:

  • Repository implementations
  • DI container wiring for new repositories
  • Nothing else in the codebase should care or change

Reference: Cal.com Engineering Blog