Prisma dan PostgreSQL
PostgreSQL menyimpan data, Prisma 7 menerjemahkan antara kode TypeScript dan tabelnya, lengkap dengan migrasi dan seeder.
Membaca sekitar 1 menit
PostgreSQL menyimpan data, Prisma 7 menerjemahkan antara kode TypeScript dan tabelnya, lengkap dengan migrasi dan seeder.
Primary key UUID v7 yang berurutan menurut waktu, seeder Super Admin yang aman diulang, dan transaksi supaya membuat feature selalu ikut menyiapkan izin semua role.
Menghapus role yang masih dipakai user ditolak langsung oleh constraint Restrict di database, bukan hanya oleh kode aplikasi.
Menjaga hubungan antar tabel tetap utuh
Inti dari User Role Management adalah tabel penghubung role_permissions yang mempertemukan tabel roles dan features. Kalau ada 4 role dan 7 feature, maka harus selalu ada 28 baris izin yang sinkron. Kalau satu feature baru ditambahkan tanpa menyiapkan baris izinnya, matriks izin akan bolong.
Transaksi saat menambah atau mengubah feature
Supaya data tidak pernah setengah jadi, pembuatan feature baru selalu dibungkus di dalam prisma.$transaction. Begitu feature dibuat, sistem otomatis membuat baris izin untuk seluruh role yang ada—semua bernilai false secara bawaan, kecuali role Super Admin yang otomatis menyala penuh:
await tx.rolePermission.createMany({
data: roles.map((role) => ({
roleUuid: role.uuid,
featureUuid: feature.uuid,
...(role.name === ROLE_SUPER_ADMIN
? actionsToColumns(input.availableActions, true)
: {}),
})),
skipDuplicates: true,
});Jangan biarkan kode aplikasi menjadi satu-satunya penjaga keutuhan data; biarkan skema PostgreSQL ikut menolak operasi yang berbahaya.
Keputusan desain di skema database
- Semua tabel memakai primary key UUID v7 (@default(uuid(7))). Berbeda dari UUID v4 yang acak penuh dan memecah indeks B-Tree, UUID v7 memiliki awalan waktu sehingga penyisipan baris baru tetap berurutan dan cepat.
- Relasi User ke Role dipasang onDelete: Restrict. Artinya, meskipun ada celah di kode, PostgreSQL sendiri yang akan menolak penghapusan role selama masih ada user yang memegang role tersebut.
- Relasi RolePermission ke Role dan Feature dipasang onDelete: Cascade dengan constraint unik @@unique([roleUuid, featureUuid]) agar tidak mungkin ada duplikasi baris izin.
- Seeder dirancang idempoten (aman dijalankan berulang kali) untuk memastikan role Super Admin dan seluruh izin dasarnya selalu siap.
Ringkasnya
Prisma 7 menjaga keselarasan tipe data antara PostgreSQL dan TypeScript, sedangkan transaksi dan constraint relasional memastikan matriks izin selalu konsisten dalam kondisi apa pun.