TKK_E32222628/hydrop_web/app/Http/Controllers/AuthController.php

339 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use App\Models\Sensor;
use App\Models\Actuator;
use App\Models\UmurTanaman;
use App\Services\FirebaseService;
use Illuminate\Support\Facades\Session;
class AuthController extends Controller
{
protected $firebaseService;
public function __construct(FirebaseService $firebaseService)
{
$this->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");
}
}