リポジトリパターンの適用
app/_repositories
ディレクトリを作成し、データベースにアクセスするような機能は全てその中に実装することとします。
これは「リポジトリパターン」と呼ばれる設計パターンで、データベースに関する処理を「永続化レイヤー」にまとめておくことで、 例えば「データベースを PostgreSQL から Oracle に変更したい」だとか「サーバロジックとAPI両方からデータベースにアクセスしたい」といった場合に、 データベースアクセスの処理が一元化されているため保守しやすくなります。
ここでは User テーブルに対する リポジトリパターンの実装を行います。
User リポジトリの作成
User テーブルに対する処理を app/_repositories/User.ts
に集約します。
今後、User テーブルに対するデータアクセスの処理が追加になった場合 User.ts
に処理(関数)を追加してください。
app/_repositories/User.ts
import { prisma } from '@/app/_utils/prismaSingleton';
import { User } from '@prisma/client';
export namespace UserRepository {
export async function findMany() {
return await prisma.user.findMany({
include: {
role: true,
department: true,
},
});
}
export async function findUnique(id: string) {
return await prisma.user.findUnique({
where: {
id: id,
},
});
}
export async function create(user: User) {
return await prisma.user.create({
data: user,
});
}
export async function update(id: string, user: User) {
return await prisma.user.update({
where: {
id: id,
},
data: {
...user,
},
});
}
export async function remove(id: string) {
return await prisma.user.delete({
where: {
id: id,
},
});
}
}
Role リポジトリの作成
Role テーブルに対する処理を app/_repositories/Role.ts
に集約します。
app/_repositories/Role.ts
import { prisma } from '@/app/_utils/prismaSingleton';
import { Role } from '@prisma/client';
export namespace RoleRepository {
export async function findMany() {
const users = await prisma.role.findMany();
return users;
}
export async function create(role: Role) {
const createdRole = await prisma.role.create({
data: role,
});
return createdRole;
}
}
Department リポジトリの作成
Department テーブルに対する処理を app/_repositories/Department.ts
に集約します。
app/_repositories/Department.ts
import { prisma } from '@/app/_utils/prismaSingleton';
import { Department } from '@prisma/client';
export namespace DepartmentRepository {
export async function findMany() {
const users = await prisma.department.findMany();
return users;
}
export async function create(department: Department) {
const createdDepartment = await prisma.department.create({
data: department,
});
return createdDepartment;
}
}
ThanksCard リポジトリの作成
ThanksCard テーブルに対する処理を app/_repositories/ThanksCard.ts
に集約します。
app/_repositories/ThanksCard.ts
import { prisma } from '@/app/_utils/prismaSingleton';
import { Prisma } from '@prisma/client';
// ThanksCardRepository.findMany(ThanksCardとUser(from, to)をjoinした結果) が返すリストの型から
// Promise を取り省いた型を export する
export type ThanksCardWithFromToList = Prisma.PromiseReturnType<
typeof ThanksCardRepository.findMany
>;
export namespace ThanksCardRepository {
export async function findMany() {
return await prisma.thanksCard.findMany({
include: {
from: true,
to: true,
},
});
}
export async function findUnique(id: string) {
return await prisma.thanksCard.findUnique({
include: {
from: true,
to: true,
},
where: {
id: id,
},
});
}
}