Strapi Schema & đồng bộ type
Khi dự án dùng Strapi (CMS) kết hợp Prisma, cần đồng bộ schema và kiểu TypeScript. Convention dưới đây bổ sung cho Prisma (client, transaction, soft delete).
Schema đúng với nghiệp vụ
- Schema (Strapi content-types và/hoặc Prisma) phải khớp định nghĩa nghiệp vụ: đủ trường, đúng kiểu, quan hệ đúng hướng và cardinality.
- Trường bắt buộc trong Strapi phản ánh non-null trong Prisma; optional trong Strapi dùng
?trong Prisma.
Backup và so sánh schema.prisma
Trước và sau khi đồng bộ schema từ DB (ví dụ npx prisma db pull hoặc script sync từ Strapi):
- Backup file
schema.prismahiện tại. - Chạy lệnh pull/sync.
- So sánh schema cũ và mới để tránh mất thay đổi tùy chỉnh (map, comment, tên relation) và gây lỗi code.
Trường bắt buộc → non-null trong Prisma
Các trường bắt buộc trong Strapi phải là non-null trong Prisma (không có ?).
model Customer {
id String @id @default(cuid())
name String // bắt buộc trong Strapi
email String? // optional trong Strapi
createdAt DateTime @default(now())
}
Đặt tên Model: PascalCase và Số ít (Singular)
- Tên model phải sử dụng PascalCase (chữ cái đầu mỗi từ viết hoa), ví dụ:
Customer,OrderItem. - Dùng danh từ số ít để đặt tên model, tránh dùng số nhiều. Ví dụ đúng:
Customer; ví dụ sai:Customers.
Ví dụ:
model Customer {
id String @id @default(cuid())
name String
// ...
}
model OrderItem {
id String @id @default(cuid())
orderId String
// ...
}
Tham khảo thêm Prisma - Schema.
Cập nhật Kiểu TypeScript tại src/types/strapi.ts
Bất cứ khi nào bạn thay đổi schema (trên Strapi hoặc Prisma), hãy đảm bảo cập nhật các kiểu TypeScript tương ứng trong src/types/strapi.ts (hoặc file type liên quan). Các kiểu này cần tuân thủ chuẩn đặt tên và cấu trúc của dự án, bao gồm cả quan hệ nếu API trả về dữ liệu lồng nhau (nested).
Ví dụ:
// src/types/strapi.ts
// Định nghĩa kiểu cho entity Customer trả về từ Strapi API
export type Customer = {
id: string;
name: string;
email?: string; // optional
createdAt: string;
orders?: Order[]; // nếu API trả về nested quan hệ
}
export type Order = {
id: string;
total: number;
customerId: string;
}
- Kiểu dữ liệu TypeScript phải luôn đồng bộ với Strapi CMS và model Prisma nếu sử dụng cùng entity để đảm bảo type-safety và nhất quán trong toàn bộ dự án.