257 lines
8.8 KiB
TypeScript
257 lines
8.8 KiB
TypeScript
'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.' }
|
|
}
|
|
}
|
|
|