Mewarisi repository dasar akan menyisakan findMany tanpa scope yang tetap bisa dipanggil, dan TypeScript tidak bisa menyembunyikan method publik warisan. Menjadikan tenant id sebagai argumen pertama tiap method mengubah kebocoran data jadi compile error.
Sebelas API NestJS, dan tumpukan guard-nya tumbuh dengan pola yang sama di tiap proyek: dua guard, lalu tiga, lalu tujuh. Apa yang diajarkan urutan itu, dan satu bug fail-open yang bersembunyi di pertemuan row-level security dengan default yang permisif.
500 itu cara backend memberi tahu bahwa ia menemui sesuatu yang belum bisa ditanganinya. Yang menentukan bukan apakah error itu muncul, tapi apakah ada yang mendengarkannya.
Setiap endpoint mengembalikan amplop yang sama, baik sukses maupun gagal — bentuk response yang layak disepakati, serta global interceptor dan exception filter yang menegakkannya di NestJS.
Kenapa src/ yang datar mulai berantakan begitu proyeknya punya fitur sungguhan, dan tata letak module-driven yang menggantikannya — satu direktori per fitur, dengan common, config, dan database di sampingnya.