diff --git a/app/Http/Controllers/Admin/ReportController.php b/app/Http/Controllers/Admin/ReportController.php new file mode 100644 index 0000000..0a70696 --- /dev/null +++ b/app/Http/Controllers/Admin/ReportController.php @@ -0,0 +1,74 @@ +with(['user:id,name', 'deals:id,title']) + ->tap(fn ($q) => (new Report)->orderByStatus($q, + [ReportStatus::Pending, ReportStatus::Rejected, ReportStatus::Resolved])) + ->get(); + + return view('dashboards.admin.reports.index') + ->with('reports', $reports); + } + + public function resolve(Report $report) + { + try { + $report->status = ReportStatus::Resolved; + $report->save(); + + return back()->with('success', 'Report resolved successfully.'); + } catch (\Throwable $e) { + \Log::error('Error resolving report', [$report->id, $e->getMessage(), $e->getTraceAsString()]); + + return back()->with('error', 'Something went wrong.'); + } + } + + public function reject(Report $report) + { + try { + $report->status = ReportStatus::Rejected; + $report->save(); + + return back()->with('success', 'Report Rejected successfully.'); + } catch (\Throwable $e) { + \Log::error('Error rejecting report', [$report->id, $e->getMessage(), $e->getTraceAsString()]); + + return back()->with('error', 'Something went wrong.'); + } + } + + /** + * Make the attached deal inactive and mark the report resolved. + */ + public function removeContent(Report $report) + { + try { + DB::transaction(function () use ($report) { + $deal = $report->deals()->first(); + $deal->active = false; + $report->status = ReportStatus::Resolved; + + $deal->save(); + $report->save(); + }); + + return back()->with('error', 'Deal has been deactivated.'); + } catch (\Throwable $e) { + \Log::error('Error removing content of report', [$report->id, $e->getMessage(), $e->getTraceAsString()]); + + return back()->with('error', 'Something went wrong.'); + } + } +} diff --git a/app/Models/Report.php b/app/Models/Report.php index 0ec71b5..3ce5d4a 100644 --- a/app/Models/Report.php +++ b/app/Models/Report.php @@ -4,6 +4,8 @@ use App\Enums\ReportStatus; use App\Enums\ReportType; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; @@ -27,4 +29,15 @@ protected function casts(): array 'status' => ReportStatus::class, ]; } + + #[Scope] + public function orderByStatus(Builder $query, array $statusOrder): Builder + { + $values = array_map(fn ($enum) => $enum->value, $statusOrder); + + // Create placeholders for each value: FIELD(status, ?, ?, ?) + $placeholders = implode(',', array_fill(0, count($values), '?')); + + return $query->orderByRaw("FIELD(status, $placeholders)", $values); + } } diff --git a/resources/views/components/dashboard/admin/sidebar.blade.php b/resources/views/components/dashboard/admin/sidebar.blade.php index 9165b2c..0e60a0d 100644 --- a/resources/views/components/dashboard/admin/sidebar.blade.php +++ b/resources/views/components/dashboard/admin/sidebar.blade.php @@ -33,8 +33,8 @@ class="flex flex-col p-4 pt-6 justify-between font-medium h-full w-full overflow - - + + diff --git a/resources/views/components/dashboard/user/action-toolbar/index.blade.php b/resources/views/components/dashboard/user/action-toolbar/index.blade.php index ab1c75d..53127be 100644 --- a/resources/views/components/dashboard/user/action-toolbar/index.blade.php +++ b/resources/views/components/dashboard/user/action-toolbar/index.blade.php @@ -1,5 +1,5 @@ @props(['deal_id' => '', 'deal_title' => '', 'isLiked' => false, 'isFavourite' => false, 'isInteractive' => true]) -
+
diff --git a/resources/views/components/dashboard/user/deal-modal.blade.php b/resources/views/components/dashboard/user/deal-modal.blade.php index 4bb9279..4a6afe7 100644 --- a/resources/views/components/dashboard/user/deal-modal.blade.php +++ b/resources/views/components/dashboard/user/deal-modal.blade.php @@ -16,8 +16,8 @@ class="deal-image h-full w-full object-cover rounded-lg border-none">

-
-
+
+
diff --git a/resources/views/components/ui/badge.blade.php b/resources/views/components/ui/badge.blade.php index 4b3d561..b256b18 100644 --- a/resources/views/components/ui/badge.blade.php +++ b/resources/views/components/ui/badge.blade.php @@ -2,9 +2,12 @@ @php $variants = [ 'neutral' => 'bg-black text-white', - 'ghost' => 'bg-gray-200 text-gray-800' + 'ghost' => 'bg-gray-200 text-gray-800', + 'red' => 'bg-red-100 text-red-700', + 'green' => 'bg-green-100 text-green-700', + 'yellow' => 'bg-yellow-100 text-yellow-700', ]; @endphp -

{{$title}}

+ {{$title}}
diff --git a/resources/views/dashboards/admin/reports/index.blade.php b/resources/views/dashboards/admin/reports/index.blade.php new file mode 100644 index 0000000..db441ad --- /dev/null +++ b/resources/views/dashboards/admin/reports/index.blade.php @@ -0,0 +1,87 @@ +@php use App\Enums\ReportStatus; @endphp + + + + +
+ +

Reported deals

+

Total Reports: {{$reports->count()}}

+ + + Type + Description + Customer + Status + + Deal + + + + + @forelse($reports as $report) + + {{ucfirst($report->type->value)}} + {{$report->description}} + {{$report->user->name}} + + + + + + {{$report->deals()->first()->title}} + + + +
+ @if($report->status !== ReportStatus::Resolved) +
+ @csrf + + + +
+ @endif + @if($report->status !== ReportStatus::Rejected) +
+ @csrf + + + +
+ @endif +
+ @csrf + + + +
+
+
+
+ @empty + + No Customer found + + @endforelse +
+
+
+
diff --git a/routes/web/admin.php b/routes/web/admin.php index 7086948..4c2c238 100644 --- a/routes/web/admin.php +++ b/routes/web/admin.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Admin\AdminDashboardController; use App\Http\Controllers\Admin\BrokerController; use App\Http\Controllers\Admin\CustomerController; +use App\Http\Controllers\Admin\ReportController; use App\Http\Middleware\HasRole; Route::prefix('/admin') @@ -15,4 +16,10 @@ Route::resource('brokers', BrokerController::class)->except('show', 'create', 'store'); Route::post('/brokers/approve/{broker}', [BrokerController::class, 'approve'])->name('brokers.approve'); + + Route::get('/reports', [ReportController::class, 'index'])->name('reports.index'); + Route::post('/reports/resolve/{report}', [ReportController::class, 'resolve'])->name('reports.resolve'); + Route::post('/reports/reject/{report}', [ReportController::class, 'reject'])->name('reports.reject'); + Route::post('/reports/remove/{report}', + [ReportController::class, 'removeContent'])->name('reports.remove-content'); });