'use server' import { supabase } from '@/lib/supabase' import { redirect } from 'next/navigation' import { cookies } from 'next/headers' import { revalidatePath } from 'next/cache' export async function login(prevState: any, formData: FormData) { const username = formData.get('username') as string const password = formData.get('password') as string const kodeUnikNik = formData.get('kode_unik_nik') as string const remember = formData.get('remember') === 'on' if (!username || !password || !kodeUnikNik) { return { message: 'Username, password, dan Kode Unik / NIK wajib diisi' } } try { // 1. Check Petugas (Admin - Role 1/Admin) const { data: petugas, error: petugasError } = await supabase .from('petugas_posyandu') .select('*') .eq('username', username) .eq('password', password) // Plain text password check as requested .single() if (petugas) { if (petugas.kode_unik !== kodeUnikNik) { return { message: 'Kode Unik tidak valid' } } // Set session/cookie for Admin // In a real app, use a secure session library. For this demo, simple cookies. const cookieStore = await cookies() cookieStore.set('user_session', JSON.stringify({ id: petugas.id, role: 'admin', username: petugas.username, name: petugas.nama }), { secure: true, httpOnly: true, maxAge: remember ? 60 * 60 * 24 * 7 : 60 * 60 * 24 }) redirect('/dashboard') // Redirect to dashboard or appropriate page } // 2. Check Akun Balita (User - Role 2/User) const { data: user, error: userError } = await supabase .from('akun_balita') .select('*') .eq('username', username) .eq('password', password) // Plain text password check as requested .single() if (user) { if (user.NIK !== kodeUnikNik) { return { message: 'NIK tidak valid' } } // Set session/cookie for User const cookieStore = await cookies() cookieStore.set('user_session', JSON.stringify({ id: user.id, role: 'user', username: user.username, name: user.nama_orang_tua // Or nama_anak depending on preference }), { secure: true, httpOnly: true, maxAge: remember ? 60 * 60 * 24 * 7 : 60 * 60 * 24 }) redirect('/user-dashboard') // Redirect to user dashboard } return { message: 'Username atau password salah' } } catch (error: any) { if (error.message === 'NEXT_REDIRECT') { throw error } console.error('Login error:', error) return { message: 'An error occurred during login' } } } export async function logout() { const cookieStore = await cookies() cookieStore.delete('user_session') redirect('/') } export async function updatePetugas(prevState: any, formData: FormData) { const id = formData.get('id') as string const nama = formData.get('nama') as string const username = formData.get('username') as string const no_telp = formData.get('no_telp') as string const password = formData.get('password') as string if (!id || !nama || !username || !password) { return { success: false, message: 'Semua field wajib diisi.' } } try { const { error } = await supabase .from('petugas_posyandu') .update({ nama, username, no_telp, password }) .eq('id', id) if (error) throw error return { success: true, message: 'Profil berhasil diperbarui!' } } catch (error) { console.error('Error updating profile:', error) return { success: false, message: 'Gagal memperbarui profil. Coba lagi.' } } } export async function updateAkunBalita(prevState: any, formData: FormData) { const id = formData.get('id') as string const nama_orang_tua = formData.get('nama_orang_tua') as string const alamat = formData.get('alamat') as string const no_whatsapp = formData.get('no_whatsapp') as string const nama_anak = formData.get('nama_anak') as string const tanggal_lahir = formData.get('tanggal_lahir') as string const username = formData.get('username') as string const password = formData.get('password') as string if (!id || !nama_orang_tua || !nama_anak || !username || !password) { return { success: false, message: 'Field wajib tidak boleh kosong.' } } try { const { error } = await supabase .from('akun_balita') .update({ nama_orang_tua, alamat, no_whatsapp, nama_anak, tanggal_lahir: tanggal_lahir || null, username, password, }) .eq('id', id) if (error) throw error return { success: true, message: 'Data pengguna berhasil diperbarui!' } } catch (error) { console.error('Error updating akun balita:', error) return { success: false, message: 'Gagal memperbarui data pengguna. Coba lagi.' } } } export async function deleteAkunBalita(id: string) { if (!id) return { success: false, message: 'ID Akun wajib diisi' } try { // Hapus riwayat pengukuran stunting terkait dulu const { error: errHasil } = await supabase .from('hasil_stunting_balita') .delete() .eq('id_balita', id) if (errHasil) throw errHasil // Hapus akun balita const { error: errAkun } = await supabase .from('akun_balita') .delete() .eq('id', id) if (errAkun) throw errAkun revalidatePath('/dashboard/manajemen-akun/pengguna') revalidatePath('/dashboard/kelola-data') return { success: true, message: 'Akun berhasil dihapus!' } } catch (error: any) { console.error('Error deleting akun:', error) return { success: false, message: error.message || 'Gagal menghapus akun. Coba lagi.' } } } export async function updateHasilStunting(prevState: any, formData: FormData) { const id = formData.get('id') as string const tinggi_badan = formData.get('tinggi_badan') ? Number(formData.get('tinggi_badan')) : null const berat_badan = formData.get('berat_badan') ? Number(formData.get('berat_badan')) : null const z_score = formData.get('z_score') ? Number(formData.get('z_score')) : null const status_stunting = formData.get('status_stunting') === 'true' const pesan_ai = formData.get('pesan_ai') as string const tanggal_upload = formData.get('tanggal_upload') as string const nama_posyandu = formData.get('nama_posyandu') as string if (!id) { return { success: false, message: 'ID Pengukuran tidak valid.' } } try { const { data, error } = await supabase .from('hasil_stunting_balita') .update({ tinggi_badan, berat_badan, z_score, status_stunting, pesan_ai, tanggal_upload: tanggal_upload || null, nama_posyandu: nama_posyandu || null }) .eq('id', id) .select('id_balita') .single() if (error) throw error if (data?.id_balita) { revalidatePath(`/dashboard/kelola-data/${data.id_balita}`) } revalidatePath('/dashboard/kelola-data') return { success: true, message: 'Data pengukuran berhasil diperbarui!' } } catch (error: any) { console.error('Error updating stunting record:', error) return { success: false, message: error.message || 'Gagal memperbarui data pengukuran.' } } } export async function deleteHasilStunting(id: number) { if (!id) return { success: false, message: 'ID Pengukuran tidak valid.' } try { // Ambil id_balita untuk revalidasi path const { data: record } = await supabase .from('hasil_stunting_balita') .select('id_balita') .eq('id', id) .single() const { error } = await supabase .from('hasil_stunting_balita') .delete() .eq('id', id) if (error) throw error if (record?.id_balita) { revalidatePath(`/dashboard/kelola-data/${record.id_balita}`) } revalidatePath('/dashboard/kelola-data') return { success: true, message: 'Data pengukuran berhasil dihapus!' } } catch (error: any) { console.error('Error deleting stunting record:', error) return { success: false, message: error.message || 'Gagal menghapus data pengukuran.' } } }