firebaseService = $firebaseService; } public function showLogin() { return view('auth.login'); } public function login(Request $request) { // Debug untuk melihat data yang diterima // dd($request->all()); $request->validate([ 'login' => 'required|string', 'password' => 'required' ], [ 'login.required' => 'Email atau Username harus diisi!', 'password.required' => 'Password harus diisi!' ]); $loginField = $request->input('login'); $password = $request->input('password'); // Debug credential // dd(['login_field' => $loginField, 'password' => $password]); // Cek apakah input adalah email atau username $fieldType = filter_var($loginField, FILTER_VALIDATE_EMAIL) ? 'email' : 'name'; $credentials = [ $fieldType => $loginField, 'password' => $password ]; if (Auth::attempt($credentials)) { $request->session()->regenerate(); // Set session variables seperti di native PHP untuk kompatibilitas $user = Auth::user(); $request->session()->put('username', $user->name); $request->session()->put('email', $user->email); return redirect()->route('dashboard'); } return back()->withErrors([ 'login' => 'Email/Username atau Password salah!', ])->withInput(); } public function showRegister() { return view('auth.register'); } public function register(Request $request) { $request->validate([ 'username' => 'required|string|max:255|unique:users,name', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', ], [ 'username.unique' => 'Username sudah digunakan.', 'email.unique' => 'Email sudah terdaftar.', 'password.min' => 'Password minimal 6 karakter.', 'password.confirmed' => 'Konfirmasi password tidak cocok.', ]); $user = User::create([ 'name' => $request->username, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return redirect()->route('login')->with('success', 'Akun berhasil dibuat! Silahkan login.'); } public function logout(Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect()->route('login'); } public function dashboard() { if (!Auth::check()) { return redirect()->route('login'); } // Get latest data from Firebase for dashboard charts $sensorData = $this->firebaseService->getAllSensorData(); $actuatorData = $this->firebaseService->getAllActuatorData(); // Get latest 10 records for charts $latestSensors = array_slice($sensorData, 0, 10); $latestActuators = array_slice($actuatorData, 0, 10); return view('dashboard', compact('latestSensors', 'latestActuators')); } public function sensor() { if (!Auth::check()) { return redirect()->route('login'); } // Get data from Firebase only $sensorData = $this->firebaseService->getAllSensorData(); return view('pages.sensor', compact('sensorData')); } public function actuator() { if (!Auth::check()) { return redirect()->route('login'); } // Get data from Firebase only $actuatorData = $this->firebaseService->getAllActuatorData(); return view('pages.actuator', compact('actuatorData')); } public function umur() { if (!Auth::check()) { return redirect()->route('login'); } // Get data from Firebase only $umurTanamanData = $this->firebaseService->getAllUmurTanamanData(); return view('pages.umur', compact('umurTanamanData')); } public function report(Request $request) { if (!Auth::check()) { return redirect()->route('login'); } // Get date filters from request $dateFrom = $request->get('date_from'); $dateTo = $request->get('date_to'); $exportType = $request->get('export'); // Get report data from Firebase $firebaseReportData = $this->firebaseService->getReportData($dateFrom, $dateTo); // Get local data for comparison $localSensorData = Sensor::when($dateFrom, function($query) use ($dateFrom) { return $query->whereDate('waktu', '>=', $dateFrom); })->when($dateTo, function($query) use ($dateTo) { return $query->whereDate('waktu', '<=', $dateTo); })->orderBy('waktu', 'desc')->get(); $localActuatorData = Actuator::when($dateFrom, function($query) use ($dateFrom) { return $query->whereDate('waktu_aktif', '>=', $dateFrom); })->when($dateTo, function($query) use ($dateTo) { return $query->whereDate('waktu_aktif', '<=', $dateTo); })->orderBy('waktu_aktif', 'desc')->get(); $localUmurTanamanData = UmurTanaman::when($dateFrom, function($query) use ($dateFrom) { return $query->whereDate('tanggal_tanam', '>=', $dateFrom); })->when($dateTo, function($query) use ($dateTo) { return $query->whereDate('tanggal_tanam', '<=', $dateTo); })->orderBy('tanggal_tanam', 'desc')->get(); // Export to CSV if requested if ($exportType === 'csv') { return $this->exportReportToCSV($firebaseReportData, $localSensorData, $localActuatorData, $localUmurTanamanData); } return view('pages.report', compact( 'firebaseReportData', 'localSensorData', 'localActuatorData', 'localUmurTanamanData', 'dateFrom', 'dateTo' )); } private function exportReportToCSV($firebaseData, $localSensorData, $localActuatorData, $localUmurTanamanData) { $filename = 'iot_report_' . date('Y-m-d_H-i-s') . '.csv'; $headers = [ 'Content-Type' => 'text/csv', 'Content-Disposition' => "attachment; filename=\"$filename\"", 'Pragma' => 'no-cache', 'Expires' => '0' ]; $callback = function() use ($firebaseData, $localSensorData, $localActuatorData, $localUmurTanamanData) { $output = fopen('php://output', 'w'); // Header CSV fputcsv($output, ['Source', 'Tipe', 'ID', 'Data1', 'Data2', 'Data3', 'Waktu']); // Firebase Sensor Data foreach ($firebaseData['sensor'] as $sensor) { fputcsv($output, [ 'Firebase', 'Sensor', $sensor['firebase_key'], $sensor['suhu'], $sensor['kelembaban'], '', $sensor['created_at'] ]); } // Firebase Actuator Data foreach ($firebaseData['actuator'] as $actuator) { fputcsv($output, [ 'Firebase', 'Actuator', $actuator['firebase_key'], $actuator['nama'], $actuator['status'], '', $actuator['created_at'] ]); } // Firebase Umur Tanaman Data foreach ($firebaseData['umur_tanaman'] as $tanaman) { fputcsv($output, [ 'Firebase', 'Umur Tanaman', $tanaman['firebase_key'], $tanaman['jenis_tanaman'], $tanaman['tanggal_tanam'], $tanaman['umur_hari'] . ' hari', $tanaman['created_at'] ]); } // Local Database Sensor Data foreach ($localSensorData as $sensor) { fputcsv($output, [ 'Local DB', 'Sensor', $sensor->id, $sensor->suhu, $sensor->kelembaban, '', $sensor->waktu ]); } // Local Database Actuator Data foreach ($localActuatorData as $actuator) { fputcsv($output, [ 'Local DB', 'Actuator', $actuator->id, $actuator->nama, $actuator->status, '', $actuator->waktu_aktif ]); } // Local Database Umur Tanaman Data foreach ($localUmurTanamanData as $tanaman) { $periode = $tanaman->tanggal_tanam . " s/d " . ($tanaman->tanggal_panen ?? 'sekarang'); fputcsv($output, [ 'Local DB', 'Umur Tanaman', $tanaman->id, $tanaman->nama, $periode, $tanaman->umur_hari . ' hari', $tanaman->tanggal_tanam ]); } fclose($output); }; return response()->stream($callback, 200, $headers); } public function help() { if (!Auth::check()) { return redirect()->route('login'); } return view('pages.help'); } public function sendHelp(Request $request) { $request->validate([ 'nama' => 'required|string|max:255', 'email' => 'required|email', 'pesan' => 'required|string' ]); $nama = $request->nama; $email = $request->email; $pesan = $request->pesan; // Nomor WhatsApp admin $no_wa = '088803324481'; // Format teks untuk WhatsApp $text = "Halo Admin,%0ASaya *$nama* (%20$email) ingin bertanya:%0A$pesan"; // Redirect ke WhatsApp return redirect("https://wa.me/$no_wa?text=$text"); } }