mcpField
P
prisma-nestjs-patterns

prisma-nestjs-patterns

github.com/davidcastagnetoa開発1146 回インストール34 週間前に更新
リポジトリ

prisma-nestjs-patterns について

Clean Architecture に沿って Prisma と NestJS を統合する開発者向けのガイドです。セットアップ、リポジトリ、トランザクション、クエリ最適化、テストを分野別の資料で扱います。

主な機能

  1. 01NestJS での Prisma 設定
  2. 02Clean Architecture のリポジトリパターン
  3. 03アトミックトランザクションと並行処理
  4. 04クエリ最適化と N+1 防止
  5. 05単体・統合テストのガイド

活用シーン

  1. 01NestJS プロジェクトへの Prisma 導入
  2. 02スキーマ設計とマイグレーション作成
  3. 03予約などの並行書き込み処理
  4. 04クエリ最適化や Prisma コードのテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/davidcastagnetoa/skills --skill prisma-nestjs-patterns

インストール後、Claude Code で/prisma-nestjs-patternsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
query-patterns.md
repository-pattern.md
schema-and-migrations.md
setup-and-service.md
testing.md
transactions.md

詳細

Prisma ORM + NestJS — 本番環境向けパターン

Clean Architecture に沿った、Prisma と NestJS の包括的な統合ガイドです。基本設定から、重要なアトミックトランザクション、リポジトリ、クエリの最適化、テストまでを扱います。

利用可能な参考資料

特定の分野について詳しく知りたい場合は、該当するファイルを参照してください。

  • references/setup-and-service.md — インストール、PrismaService、グローバルモジュール、ヘルスチェック
  • references/schema-and-migrations.md — スキーマ設計、型、リレーション、インデックス、マイグレーション
  • references/repository-pattern.md — インフラストラクチャ層のアダプターとしてのリポジトリ(Clean Architecture)
  • references/transactions.md — アトミックトランザクション、SELECT FOR UPDATE、同時実行の処理
  • references/query-patterns.md — N+1 の防止、include/select、ページネーション、複雑なクエリ
  • references/testing.md — jest-mock-extended、prisma-mock を使ったテスト、testcontainers との統合

各参考資料を使う場面

作業参考資料
NestJS で初めて Prisma を設定するsetup-and-service.md
スキーマを設計または変更する、マイグレーションを作成するschema-and-migrations.md
ドメインモジュール用のリポジトリを作成するrepository-pattern.md
予約、ロック、同時実行操作transactions.md
遅いクエリを最適化する、N+1 を解消するquery-patterns.md
単体テスト/統合テストで Prisma をモックするtesting.md

重要なルール(常に守ること)

1. PrismaService はグローバルにし、PrismaClient を直接インスタンス化しない
// ❌ Nunca
const prisma = new PrismaClient();

// ✅ Siempre via inyección de dependencias
constructor(private readonly prisma: PrismaService) {}
2. 複合的な書き込み操作にはアトミックトランザクションを使う
// ✅ Patrón correcto para cualquier operación que modifique >1 tabla
await this.prisma.$transaction(async (tx) => {
  const gift = await tx.gift.findUnique({ where: { id: giftId } });
  if (gift.status !== 'AVAILABLE') throw new ConflictException();
  await tx.gift.update({ where: { id: giftId }, data: { status: 'RESERVED' } });
  await tx.reservation.create({ data: { giftId, reservedById: userId } });
});
3. リポジトリはインフラストラクチャ層に置き、コントローラーやドメインサービスには置かない
// La interfaz vive en el dominio
export interface ReservationRepository {
  findActiveByGiftId(giftId: string): Promise<Reservation | null>;
  create(data: CreateReservationData): Promise<Reservation>;
}

// La implementación Prisma vive en infraestructura
@Injectable()
export class PrismaReservationRepository implements ReservationRepository { ... }
4. PrismaClient をインフラストラクチャモジュールの外部に公開しない

ドメイン層とアプリケーション層は、Prisma ではなくインターフェースを介して処理します。

5. 常に明示的な select または include を使い、モデル全体を返さない
// ❌ Retorna passwordHash, campos internos
return this.prisma.user.findUnique({ where: { id } });

// ✅ Solo los campos necesarios
return this.prisma.user.findUnique({
  where: { id },
  select: { id: true, nombre: true, email: true, createdAt: true }
});

公式の情報源とドキュメント

コメント