MIF_E31231302_WEBSITE/app/Http/Controllers/PengaturanAkunController.php

459 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Carbon\Carbon;
class PengaturanAkunController extends Controller
{
public function index()
{
// =====================================================
// CEK SESSION LOGIN
// =====================================================
if (!session()->has('petugas_id')) {
return redirect('/')
->with('error', 'Silakan login terlebih dahulu.');
}
// =====================================================
// AMBIL DATA PETUGAS
// =====================================================
$petugas = DB::table('petugas')
->where('id_petugas', session('petugas_id'))
->first();
// =====================================================
// JIKA DATA PETUGAS TIDAK DITEMUKAN
// =====================================================
if (!$petugas) {
session()->flush();
return redirect('/')
->with('error', 'Data akun tidak ditemukan.');
}
// =====================================================
// TAMPILKAN HALAMAN
// =====================================================
return view('pengaturan-akun', compact('petugas'));
}
public function updatePasswordLangsung(Request $request)
{
// 1. Cek Session
if (!session()->has('petugas_id')) {
return response()->json([
'success' => false,
'message' => 'Sesi Anda telah berakhir, silakan login kembali.'
]);
}
// 2. Ambil Data Petugas
$petugas = DB::table('petugas')
->where('id_petugas', session('petugas_id'))
->first();
// 3. Validasi Password Saat Ini
if (!Hash::check($request->current_password, $petugas->password)) {
return response()->json([
'success' => false,
'message' => 'Password saat ini yang Anda masukkan salah!'
]);
}
// 4. Validasi Password Baru (Minimal 8 Karakter)
if (strlen($request->password) < 8) {
return response()->json([
'success' => false,
'message' => 'Password baru minimal harus 8 karakter.'
]);
}
// 5. Cek jika password baru sama dengan password lama
if (Hash::check($request->password, $petugas->password)) {
return response()->json([
'success' => false,
'message' => 'Password baru tidak boleh sama dengan password lama.'
]);
}
// 6. Update ke Database
DB::table('petugas')
->where('id_petugas', $petugas->id_petugas)
->update([
'password' => Hash::make($request->password),
'updated_at' => now()
]);
DB::table('log_aktivitas')->insert([
'id_petugas' => $petugas->id_petugas,
'aktivitas' => 'Ganti Password',
'created_at' => now(),
'updated_at' => now()
]);
return response()->json([
'success' => true,
'message' => 'Password Anda telah berhasil diperbarui.'
]);
}
public function update(Request $request)
{
$petugas = DB::table('petugas')
->where('id_petugas', session('petugas_id'))
->first();
$request->validate([
'nama_petugas' => 'required',
'email' => 'required|email'
]);
$data = [
'nama_petugas' => $request->nama_petugas,
'email' => $request->email,
'updated_at' => now()
];
if (!empty($request->password)) {
if (Hash::check($request->password, $petugas->password)) {
return redirect('/pengaturan-akun')
->with('error', 'Password baru tidak boleh sama dengan password lama.');
}
$data['password'] = Hash::make($request->password);
}
DB::table('petugas')
->where('id_petugas', $petugas->id_petugas)
->update($data);
DB::table('log_aktivitas')->insert([
'id_petugas' => $petugas->id_petugas,
'aktivitas' => 'Ganti Password (via OTP)',
'created_at' => now(),
'updated_at' => now()
]);
session([
'nama_petugas' => $request->nama_petugas
]);
return redirect('/pengaturan-akun')
->with('success', 'Pengaturan akun berhasil diperbarui');
}
public function kirimOtp(Request $request)
{
// =====================================================
// CEK LOGIN
// =====================================================
if (!session()->has('petugas_id')) {
return response()->json([
'success' => false,
'message' => 'Session login tidak ditemukan.'
]);
}
// =====================================================
// VALIDASI EMAIL SAJA
// =====================================================
$request->validate([
'email' => 'required|email'
]);
// =====================================================
// AMBIL AKUN YANG SEDANG LOGIN
// =====================================================
$petugas = DB::table('petugas')
->where('id_petugas', session('petugas_id'))
->first();
if (!$petugas) {
return response()->json([
'success' => false,
'message' => 'Data akun tidak ditemukan.'
]);
}
// =====================================================
// EMAIL HARUS SESUAI DENGAN AKUN LOGIN
// =====================================================
if (
strtolower(trim($petugas->email))
!= strtolower(trim($request->email))
) {
return response()->json([
'success' => false,
'message' => 'Email tidak sesuai dengan akun login.'
]);
}
// =====================================================
// GENERATE OTP
// =====================================================
$otp = rand(100000, 999999);
DB::table('petugas')
->where('id_petugas', $petugas->id_petugas)
->update([
'otp_code' => $otp,
'otp_expired_at' => Carbon::now()->addMinutes(5)
]);
try {
$html = '
<div style="font-family:Poppins,sans-serif;padding:30px;background:#f5f5f5;">
<div style="
max-width:500px;
margin:auto;
background:white;
border-radius:20px;
padding:40px;
box-shadow:0 5px 20px rgba(0,0,0,0.08);
">
<div style="text-align:center;">
<div style="
width:75px;
height:75px;
background:#fff3f3;
border-radius:50%;
margin:auto;
line-height:75px;
font-size:35px;
">
🔐
</div>
<h2 style="
color:#b30000;
margin-top:20px;
margin-bottom:10px;
">
Reset Password
</h2>
<p style="
color:#666;
font-size:14px;
line-height:1.7;
">
Gunakan kode OTP berikut untuk reset password akun Anda.
</p>
</div>
<div style="
text-align:center;
margin:35px 0;
">
<div style="
display:inline-block;
background:#fff5f5;
color:#b30000;
padding:18px 35px;
border-radius:15px;
font-size:34px;
font-weight:bold;
letter-spacing:8px;
">
'.$otp.'
</div>
</div>
<p style="
text-align:center;
color:#666;
font-size:14px;
">
OTP berlaku selama <b>5 menit</b>.
</p>
</div>
</div>
';
Mail::html($html, function ($message) use ($petugas) {
$message->to(trim($petugas->email))
->subject('OTP Reset Password Sistem TB');
});
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Detail Error: ' . $e->getMessage()
]);
}
return response()->json([
'success' => true,
'message' => 'OTP berhasil dikirim.'
]);
}
public function verifyOtp(Request $request)
{
// =====================================================
// CEK LOGIN
// =====================================================
if (!session()->has('petugas_id')) {
return response()->json([
'success' => false,
'message' => 'Session login tidak ditemukan.'
]);
}
// =====================================================
// VALIDASI
// =====================================================
$request->validate([
'email' => 'required|email',
'otp' => 'required'
]);
// =====================================================
// AMBIL AKUN LOGIN
// =====================================================
$petugas = DB::table('petugas')
->where('id_petugas', session('petugas_id'))
->first();
if (!$petugas) {
return response()->json([
'success' => false,
'message' => 'Data akun tidak ditemukan.'
]);
}
// =====================================================
// EMAIL HARUS SESUAI
// =====================================================
if (
strtolower(trim($petugas->email))
!= strtolower(trim($request->email))
) {
return response()->json([
'success' => false,
'message' => 'Email tidak sesuai dengan akun login.'
]);
}
// =====================================================
// CEK OTP
// =====================================================
if ($petugas->otp_code != $request->otp) {
return response()->json([
'success' => false,
'message' => 'Kode OTP salah.'
]);
}
// =====================================================
// OTP KADALUARSA
// =====================================================
if (
Carbon::now()->gt(
Carbon::parse($petugas->otp_expired_at)
)
) {
return response()->json([
'success' => false,
'message' => 'Kode OTP sudah kadaluarsa.'
]);
}
// =====================================================
// JIKA HANYA CEK OTP
// =====================================================
if ($request->has('cek_otp')) {
return response()->json([
'success' => true,
'message' => 'OTP valid.'
]);
}
// =====================================================
// VALIDASI PASSWORD BARU
// =====================================================
$request->validate([
'password' => 'required|min:8'
]);
// PASSWORD TIDAK BOLEH SAMA
if (Hash::check($request->password, $petugas->password)) {
return response()->json([
'success' => false,
'message' => 'Password baru tidak boleh sama dengan password lama.'
]);
}
// =====================================================
// UPDATE PASSWORD
// =====================================================
DB::table('petugas')
->where('id_petugas', $petugas->id_petugas)
->update([
'password' => bcrypt($request->password),
'otp_code' => null,
'otp_expired_at' => null
]);
return response()->json([
'success' => true,
'message' => 'Password berhasil diperbarui.'
]);
}
}