339 lines
11 KiB
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");
|
|
}
|
|
}
|