| No | +Akun | +Role/Hak Akses | +Waktu Login | +
|---|
diff --git a/app/Http/Controllers/Dashboard/DatatableController.php b/app/Http/Controllers/Dashboard/DatatableController.php index 0ed67d5..cdaaa1a 100644 --- a/app/Http/Controllers/Dashboard/DatatableController.php +++ b/app/Http/Controllers/Dashboard/DatatableController.php @@ -14,6 +14,7 @@ use App\Models\IssueManagement; use App\Models\Journalist; use App\Models\Location; +use App\Models\LoginHistory; use App\Models\Media; use App\Models\MediaMonitoring; use App\Models\MediaOrder; @@ -1968,4 +1969,69 @@ public function role(Request $request){ return response()->json(['error' => 'Unauthorized'], 401); } + + public function loginHistory(Request $request){ + if ($request->ajax()) { + + $year = $request->input('year', null); + $month = $request->input('month', null); + $date = $request->input('date', null); + $role = $request->input('role', null); + + $query = LoginHistory::with(['user']); + + if ($year) { + $query->whereYear('logged_in_at', $year); + } + + if ($month) { + $monthYear = Carbon::parse($month); + $query->whereYear('logged_in_at', $monthYear->year) + ->whereMonth('logged_in_at', $monthYear->month); + } + + if ($date) { + $query->whereDate('logged_in_at', $date); + } + + if($role !== 'all'){ + if($role === 'admin'){ + $query->whereHas('user', function ($q) use ($role) { + $q->where('role_id', 1); + }); + }else if($role === 'company'){ + $query->whereHas('user', function ($q) use ($role) { + $q->where('role_id', 3); + }); + }else if($role === 'monitoring_admin'){ + $query->whereHas('user', function ($q) use ($role) { + $q->where('role_id', 2); + }); + }else if($role === 'content_admin'){ + $query->whereHas('user', function ($q) use ($role) { + $q->where('role_id', 4); + }); + } + } + + $data = $query->get(); + + return DataTables::of($data) + ->addIndexColumn() + ->addColumn('name', function ($data) { + return $data->user->name; + }) + ->addColumn('role', function ($data) { + return $data->user->role->name; + }) + ->addColumn('logged_in_at', function ($data) { + return ''.idn_date($data->logged_in_at, 'H:i').''. ' - '.idn_date($data->logged_in_at, 'd F Y').''; + }) + ->rawColumns(['logged_in_at']) + ->make(true); + } + + return response()->json(['error' => 'Unauthorized'], 401); + + } } diff --git a/app/Http/Controllers/Dashboard/LoginHistoryController.php b/app/Http/Controllers/Dashboard/LoginHistoryController.php new file mode 100644 index 0000000..c2f4242 --- /dev/null +++ b/app/Http/Controllers/Dashboard/LoginHistoryController.php @@ -0,0 +1,30 @@ + 'Aktivitas Login', + 'year' => $request->input('year', null), + 'month' => $request->input('month', null), + 'date' => $request->input('date', null), + 'role' => $request->input('role', null), + ]); + } + + public function filter(Request $request){ + + $filteredRequest = $request->except('_token'); + + $filterField = array_filter($filteredRequest, function ($value) { + return filled($value); + }); + + return redirect()->route('dashboard.login.history.index', $filterField); + } +} diff --git a/app/Listeners/LogUserLogin.php b/app/Listeners/LogUserLogin.php new file mode 100644 index 0000000..968a1e7 --- /dev/null +++ b/app/Listeners/LogUserLogin.php @@ -0,0 +1,32 @@ + $event->user->id, + 'ip_address' => request()->ip(), + 'user_agent' => request()->userAgent(), + 'logged_in_at' => now(), + ]); + } +} diff --git a/app/Models/LoginHistory.php b/app/Models/LoginHistory.php new file mode 100644 index 0000000..2ec353c --- /dev/null +++ b/app/Models/LoginHistory.php @@ -0,0 +1,21 @@ +belongsTo(User::class, 'user_id', 'id'); + } +} diff --git a/database/migrations/2025_04_01_140958_create_login_histories_table.php b/database/migrations/2025_04_01_140958_create_login_histories_table.php new file mode 100644 index 0000000..2105817 --- /dev/null +++ b/database/migrations/2025_04_01_140958_create_login_histories_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('ip_address'); + $table->text('user_agent'); + $table->timestamp('logged_in_at'); + $table->unsignedBigInteger('user_id'); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('login_histories'); + } +}; diff --git a/resources/views/dashboard/login-history/index.blade.php b/resources/views/dashboard/login-history/index.blade.php new file mode 100644 index 0000000..9904811 --- /dev/null +++ b/resources/views/dashboard/login-history/index.blade.php @@ -0,0 +1,105 @@ +@include('partials.dashboard.head') +@include('partials.dashboard.sidebar', ['page' => 'login_histories']) +@include('partials.dashboard.header') + +