Mencegah Data Destruction dengan Teknik Soft Delete di Next.js (Part 7)
Dalam dunia Cyber Security, ancaman siber tidak melulu berkutat pada pencurian informasi sensitif (Data Breach). Ancaman pengrusakan atau penghapusan data secara masif (Data Destruction) oleh pihak internal yang tidak puas (Insider Threat) atau akun sah yang berhasil diretas merupakan mimpi buruk bagi integritas sistem.
Bagaimana jika dalam platform Learning Management System (LMS) Anda, sebuah akun "Guru" diretas, dan sang peretas menggunakan wewenangnya untuk menekan tombol "Hapus" pada semua data kelas, memusnahkan riwayat akademik ratusan siswa secara permanen?
Untuk memitigasi risiko fatal ini, praktisi keamanan menerapkan teknik Soft Delete (Penghapusan Semu). Dengan memanfaatkan Next.js dan Prisma ORM, kita akan merekayasa arsitektur Hapus Data agar sistem tidak pernah benar-benar memusnahkan baris data dari database MySQL, melainkan hanya menyembunyikannya dari antarmuka publik. Mari kita bedah rekayasanya.
Mengapa Teknik Soft Delete Jauh Lebih Aman?
- Jejak Audit Terjaga (Audit Trail): Data yang dihapus secara fisik (Hard Delete) akan hilang tak berbekas, menyulitkan proses investigasi forensik jika terjadi anomali. Dengan Soft Delete, jejak kapan dan data apa yang "dihapus" tetap tersimpan aman di server.
- Pemulihan Instan (Disaster Recovery): Jika terjadi insiden penghapusan yang tidak disengaja (Human Error) atau sabotase, administrator dapat mengembalikan data (Restore) hanya dalam hitungan detik tanpa perlu melakukan bongkar-pasang backup database.
- Integritas Relasional Anti-Crash: Menghapus tabel "Kelas" yang sudah memiliki relasi dengan "Siswa" atau "Nilai" sering kali memicu Fatal Error pada sistem. Menyembunyikan statusnya adalah cara paling elegan untuk menjaga sistem tetap berjalan mulus.
Langkah Praktis: Membangun Mekanisme Soft Delete
1. Memodifikasi Skema Database (Prisma)
Langkah pertama adalah menambahkan semacam "Tanda Peringatan" pada tabel kita. Buka file prisma/schema.prisma, lalu tambahkan kolom deletedAt pada model grades (Tabel Kelas) Anda.
model grades {
id BigInt @id @default(autoincrement())
name String @db.VarChar(255)
sort_order Int @default(0)
// Tambahkan baris di bawah ini untuk mengaktifkan Soft Delete
deletedAt DateTime? @db.DateTime(0)
}
Tanda tanya (?) menandakan bahwa secara default kolom ini boleh kosong (null). Jalankan perintah npx prisma db push di terminal VS Code untuk menyinkronkan pembaruan ini ke MySQL Anda tanpa merusak data yang sudah ada.
2. Merekayasa API DELETE (Penghapusan Semu)
Buka file app/api/kelas/route.ts. Kita akan menambahkan fungsi DELETE. Namun alih-alih menggunakan perintah delete bawaan Prisma, kita menipunya dengan menggunakan perintah update.
import { getServerSession } from "next-auth/next";
export async function DELETE(request: Request) {
try {
// 1. Taktik RBAC (Part 6): Pastikan yang menghapus adalah Guru/Admin
const session = await getServerSession();
if (!session || (session.user as any).role === '3') {
return NextResponse.json({ status: 'error', message: '403 Forbidden' }, { status: 403 });
}
// 2. Tangkap ID yang ingin dihapus
const body = await request.json();
const { id } = body;
// 3. TAKTIK SOFT DELETE: Jangan gunakan prisma.grades.delete!
// Kita lakukan 'update' dan isi kolom deletedAt dengan waktu saat ini.
await prisma.grades.update({
where: { id: Number(id) },
data: {
deletedAt: new Date(), // Merekam waktu eksekusi penghapusan (Timestamp)
},
});
return NextResponse.json({
status: 'success',
message: 'Kelas berhasil dinonaktifkan dari sistem.',
}, { status: 200 });
} catch (error) {
return NextResponse.json(
{ status: 'error', message: 'Terjadi anomali server saat menghapus data.' },
{ status: 500 }
);
}
}
3. Memfilter Data pada API GET (Menyembunyikan Data)
Jika hanya sampai di langkah 2, data yang "dihapus" akan tetap muncul di layar. Kita harus memperbaiki fungsi GET di file yang sama agar sistem hanya merender data yang nilai deletedAt-nya masih kosong (null).
export async function GET() {
try {
const dataKelas = await prisma.grades.findMany({
where: {
deletedAt: null, // TAKTIK FILTERING: Sembunyikan data yang sudah di-Soft Delete
},
orderBy: { sort_order: 'asc' }
});
const dataAman = dataKelas.map(item => ({
...item,
id: item.id.toString()
}));
return NextResponse.json({ status: 'success', data: dataAman });
} catch (error) {
return NextResponse.json({ status: 'error', message: 'Internal Server Error' }, { status: 500 });
}
}
Kesimpulan
Keamanan arsitektur web tidak hanya diukur dari seberapa tangguh sistem menahan serangan injeksi dari luar, melainkan juga dari seberapa mahir kita merancang fail-safe mechanism (mekanisme perlindungan diri) terhadap anomali dari dalam (Insider Threat).
Dengan teknik Soft Delete, Anda secara teknis tidak pernah kehilangan data. Anda memiliki kendali absolut atas siklus hidup data (Data Lifecycle), mempertahankan jejak audit yang kokoh, dan memastikan platform edukasi Anda tahan terhadap upaya sabotase digital massal.
0 Response to "Mencegah Data Destruction dengan Teknik Soft Delete di Next.js (Part 7)"
Posting Komentar