all(), [ 'email' => 'required|email', 'password' => 'required', ]); if ($validate->fails()) { return ApiResponse::validationError($validate->errors()); } if (!Auth::attempt($request->only('email', 'password'))) { return ApiResponse::unauthorized('Email atau Password salah'); } $user = User::where('email', $request->email) ->with(['divisi', 'jabatan', 'kantor', 'roles']) ->first(); if ($user->status_aktif != 1) { return ApiResponse::error('Akun Anda dinonaktifkan. Hubungi admin.', 403); } $token = $user->createToken('auth_token')->plainTextToken; return ApiResponse::success([ 'token' => $token, 'user' => $user ], 'Login berhasil'); } catch (\Exception $e) { \Illuminate\Support\Facades\Log::error('Login Error: ' . $e->getMessage()); return ApiResponse::error('Terjadi kesalahan server: ' . $e->getMessage(), 500); } } public function logout(Request $request) { try { /** @var \Laravel\Sanctum\PersonalAccessToken $token */ $token = $request->user()->currentAccessToken(); $token->delete(); return ApiResponse::success(null, 'Logout berhasil'); } catch (\Exception $e) { return ApiResponse::error('Gagal logout: ' . $e->getMessage(), 500); } } public function updateProfile(Request $request) { try { $user = $request->user(); $validate = Validator::make($request->all(), [ 'nama_lengkap' => 'required|string|max:255', 'no_telp' => 'nullable|string|max:15', 'password' => 'nullable|min:6', 'foto' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', ]); if ($validate->fails()) { return ApiResponse::validationError($validate->errors()); } $data = [ 'nama_lengkap' => $request->nama_lengkap, 'no_telp' => $request->no_telp, ]; if ($request->filled('password')) { $data['password'] = Hash::make($request->password); } if ($request->hasFile('foto')) { if ($user->foto) { Storage::disk('public')->delete($user->foto); } $data['foto'] = $request->file('foto')->store('foto-profil', 'public'); } $user->update($data); return ApiResponse::success($user, 'Profil berhasil diperbarui'); } catch (\Exception $e) { return ApiResponse::error('Gagal update profil: ' . $e->getMessage(), 500); } } public function user(Request $request) { $user = $request->user()->load(['roles', 'divisi', 'jabatan', 'kantor']); return ApiResponse::success($user); } }