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
-