TIF_NGANJUK_E41212301/app/Http/Controllers/Auth/GoogleController.php

244 lines
8.9 KiB
PHP

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use App\Models\KuesionerLearningStyle;
use App\Models\KuesionerMetakognitif;
use Illuminate\Support\Facades\Log;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Auth;
class GoogleController extends Controller
{
public function redirectToGoogle(Request $request)
{
$clientId = config('services.google.client_id');
$redirectUri = config('services.google.redirect');
$scopes = [
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
'openid',
];
$query = http_build_query([
'client_id' => $clientId,
'redirect_uri' => $redirectUri,
'response_type' => 'code',
'scope' => implode(' ', $scopes),
'access_type' => 'offline',
'prompt' => 'select_account',
]);
$authUrl = 'https://accounts.google.com/o/oauth2/v2/auth?' . $query;
Log::info('Redirecting to Google', ['url' => $authUrl]);
return redirect($authUrl);
}
public function handleGoogleCallback(Request $request)
{
try {
if (!$request->has('code')) {
throw new \Exception('Kode otorisasi tidak ditemukan');
}
$code = $request->input('code');
Log::info('Google Callback Reached', ['code' => $code]);
$client = new Client();
$response = $client->post('https://oauth2.googleapis.com/token', [
'form_params' => [
'code' => $code,
'client_id' => config('services.google.client_id'),
'client_secret' => config('services.google.client_secret'),
'redirect_uri' => config('services.google.redirect'),
'grant_type' => 'authorization_code',
],
'verify' => false, // Hanya untuk pengujian, sebaiknya dihapus di produksi
]);
$tokenData = json_decode($response->getBody()->getContents(), true);
Log::info('Google Access Token Response', ['response' => $tokenData]);
$response = $client->get('https://www.googleapis.com/oauth2/v2/userinfo', [
'headers' => [
'Authorization' => 'Bearer ' . $tokenData['access_token'],
],
'verify' => false, // Hanya untuk pengujian, sebaiknya dihapus di produksi
]);
$userData = json_decode($response->getBody()->getContents(), true);
Log::info('Google User Data', ['user_data' => $userData]);
$user = User::updateOrCreate(
['email' => $userData['email']],
[
'nama_lengkap' => $userData['name'],
'foto_profil' => $userData['picture'] ?? null
]
);
Auth::login($user, true);
Log::info('User Authenticated', [
'user_id' => $user->id_user,
'email' => $user->email,
]);
$kuesionerls = KuesionerLearningStyle::where('email', $user->email)->first();
$kuesionermeta = KuesionerMetakognitif::where('category', $user->category_meta)->first();
return view('main.page.beranda.beranda', compact('kuesionerls', 'kuesionermeta'));
} catch (\Exception $e) {
Log::error('Google Login Failed', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
'request' => $request->all(),
]);
return redirect()->route('login')->with('error', 'Login dengan Google gagal: ' . $e->getMessage());
}
}
public function loginGuest()
{
try {
$user = User::where('email', 'guest@mail.com')->first();
if (!$user) {
throw new \Exception('Pengguna guest tidak ditemukan.');
$user = User::create([
'email' => 'guest@mail.com',
'nama_lengkap' => 'Guest User',
'foto_profil' => null,
]);
}
Auth::login($user, true);
Log::info('Guest User Authenticated', [
'user_id' => $user->id_user,
'email' => $user->email,
]);
$kuesionerls = KuesionerLearningStyle::where('email', $user->email)->first();
$kuesionermeta = KuesionerMetakognitif::where('category', $user->category_meta)->first();
return view('main.page.beranda.beranda', compact('kuesionerls', 'kuesionermeta'));
} catch (\Exception $e) {
Log::error('Guest Login Failed', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
return redirect()->route('login')->with('error', 'Login sebagai guest gagal: ' . $e->getMessage());
}
}
public function loadDataKuesioner()
{
$kuesionerls = KuesionerLearningStyle::where('email', Auth::user()->email)->first();
$kuesionermeta = KuesionerMetakognitif::where('category', Auth::user()->category_meta)->first();
return view('main.page.beranda.beranda', compact('kuesionerls', 'kuesionermeta'));
}
public function loadDataKuesioner2()
{
$kuesionerls = KuesionerLearningStyle::where('email', Auth::user()->email)->first();
$kuesionermeta = KuesionerMetakognitif::where('category', Auth::user()->category_meta)->first();
return view('main.page.kuesioner.kuesioner', compact('kuesionerls', 'kuesionermeta'));
}
public function updateProfile(Request $request)
{
try {
$validated = $request->validate([
'nama_lengkap' => 'required|string|max:65',
'nim' => 'required|string|max:20',
'semester' => 'required|integer|min:1|max:14',
'angkatan' => 'required|integer|min:2000|max:'.date('Y'),
'foto_profil' => 'nullable|image|mimes:jpeg,png|max:15360',
]);
$user = Auth::user();
if (!$user) {
throw new \Exception('Pengguna tidak ditemukan atau belum login');
}
$updateData = [
'nama_lengkap' => $validated['nama_lengkap'],
'nim' => $validated['nim'],
'semester' => $validated['semester'],
'angkatan' => $validated['angkatan'],
];
if ($request->hasFile('foto_profil')) {
// Hapus foto profil lama jika ada dan bukan dari Google
if ($user->foto_profil && !str_contains($user->foto_profil, 'googleusercontent.com')) {
Storage::disk('public')->delete($user->foto_profil);
}
// Simpan foto baru
$path = $request->file('foto_profil')->store('profile_photos', 'public');
$updateData['foto_profil'] = $path;
}
// Perbarui data pengguna
$user->update($updateData);
Log::info('User Profile Updated', [
'user_id' => $user->id_user,
'email' => $user->email,
'updated_data' => $updateData,
]);
return redirect()->back()->with('success', 'Profil berhasil diperbarui');
} catch (\Exception $e) {
Log::error('Profile Update Failed', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
'request' => $request->all(),
]);
return redirect()->back()->with('error', 'Gagal memperbarui profil: ' . $e->getMessage());
}
}
public function deleteProfilePhoto(Request $request)
{
try {
$user = Auth::user();
if (!$user) {
throw new \Exception('Pengguna tidak ditemukan atau belum login');
}
// Hapus foto profil dari storage jika bukan dari Google
if ($user->foto_profil && !str_contains($user->foto_profil, 'googleusercontent.com')) {
Storage::disk('public')->delete($user->foto_profil);
}
$user->update(['foto_profil' => null]);
Log::info('User Profile Photo Deleted', [
'user_id' => $user->id_user,
'email' => $user->email,
]);
return redirect()->back()->with('success', 'Foto profil berhasil dihapus');
} catch (\Exception $e) {
Log::error('Profile Photo Deletion Failed', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
'request' => $request->all(),
]);
return redirect()->back()->with('error', 'Gagal menghapus foto profil: ' . $e->getMessage());
}
}
}