Lewati ke konten
create-nextjs-kit

dal

Alasan ada: semua query ditulis di satu tempat dekat data, jadi cek akses nanti bisa ditaruh di sana dan tidak ada jalur baca atau tulis yang melewatinya.

Mode: fullstack. Otomatis memasang db.

Terminal window
npm create nextjs-kit@latest my-app -- --mode fullstack --modules dal
  • src/server/dal/todos.ts berisi getTodos() dan addTodo().
  • Fitur todos memakainya: queries.ts memanggil getTodos, actions.ts memanggil addTodo.
  • Penyimpanan di memori (demo-store) dihapus dari proyek hasil generate.
  • CI proyek mendapat service Postgres, langkah db:migrate, dan test:db.
src/server/dal/todos.ts
export async function getTodos(): Promise<TodoRow[]> {
return db.select().from(schema.todos).orderBy(desc(schema.todos.createdAt));
}

Fitur memanggil fungsi DAL, bukan db langsung. Salin pola ini untuk tabel baru: satu berkas DAL per agregat, dan semua query di dalamnya.

src/server/dal/todos.integration.test.ts memakai Postgres sungguhan, bukan mock:

Terminal window
npm run db:up
npm run db:migrate
npm run test:db

npm run test (unit test) mengecualikan berkas *.integration.test.ts, sehingga tidak butuh database. Test integrasi memakai data dengan judul unik dan membersihkan barisnya sendiri.

Kalau auth dipasang bersama dal, sebuah integrasi (dal-auth) otomatis aktif:

  • todos mendapat kolom user_id (migrasi 0002_todos_owner), dengan ON DELETE CASCADE.
  • getTodos() dan addTodo() memanggil requireUser() sendiri dan hanya menyentuh baris milik pengguna itu. Cek akses ada di DAL, jadi tidak ada jalur yang melewatinya, siapa pun pemanggilnya.
  • /todos ditambahkan ke protectedPrefixes, dan E2E todos masuk lebih dulu.
  • Action memakai unstable_rethrow supaya redirect() dari requireUser() tidak tertelan try/catch (pengguna yang belum masuk diarahkan ke login, bukan melihat “Terjadi kesalahan”).

user_id sengaja boleh null: kalau tabel sudah berisi baris sebelum auth dipasang, migrasi tidak gagal dan tidak menghapus data. Baris lama itu tidak terlihat oleh siapa pun sampai Anda memberinya pemilik.

Modul ini mengganti baris tertentu di queries.ts dan actions.ts milik template base. Kalau template berubah sehingga baris itu tidak ditemukan lagi, pembuatan proyek gagal dengan pesan yang jelas, bukan menghasilkan kode yang salah.