|
4 | 4 |
|
5 | 5 | namespace HiEvents\Repository\Eloquent; |
6 | 6 |
|
| 7 | +use HiEvents\DomainObjects\AccountDomainObject; |
7 | 8 | use HiEvents\DomainObjects\EventDomainObject; |
| 9 | +use HiEvents\DomainObjects\EventStatisticDomainObject; |
8 | 10 | use HiEvents\DomainObjects\Generated\EventDomainObjectAbstract; |
| 11 | +use HiEvents\DomainObjects\OrganizerDomainObject; |
9 | 12 | use HiEvents\DomainObjects\Status\EventStatus; |
10 | 13 | use HiEvents\Http\DTO\QueryParamsDTO; |
11 | 14 | use HiEvents\Models\Event; |
| 15 | +use HiEvents\Repository\Eloquent\Value\Relationship; |
12 | 16 | use HiEvents\Repository\Interfaces\EventRepositoryInterface; |
13 | 17 | use Illuminate\Database\Eloquent\Builder; |
14 | 18 | use Illuminate\Pagination\LengthAwarePaginator; |
@@ -96,9 +100,40 @@ public function getUpcomingEventsForAdmin(int $perPage): LengthAwarePaginator |
96 | 100 | ->where(EventDomainObjectAbstract::START_DATE, '<=', $next24Hours) |
97 | 101 | ->whereIn(EventDomainObjectAbstract::STATUS, [ |
98 | 102 | EventStatus::LIVE->name, |
99 | | - EventStatus::DRAFT->name, |
100 | 103 | ]) |
101 | 104 | ->orderBy(EventDomainObjectAbstract::START_DATE, 'asc') |
102 | 105 | ->paginate($perPage)); |
103 | 106 | } |
| 107 | + |
| 108 | + public function getAllEventsForAdmin( |
| 109 | + ?string $search = null, |
| 110 | + int $perPage = 20, |
| 111 | + ?string $sortBy = 'start_date', |
| 112 | + ?string $sortDirection = 'desc' |
| 113 | + ): LengthAwarePaginator { |
| 114 | + $this->model = $this->model |
| 115 | + ->select('events.*') |
| 116 | + ->withCount('attendees'); |
| 117 | + |
| 118 | + if ($search) { |
| 119 | + $this->model = $this->model->where(function ($q) use ($search) { |
| 120 | + $q->where(EventDomainObjectAbstract::TITLE, 'ilike', '%' . $search . '%') |
| 121 | + ->orWhereHas('organizer', function ($orgQuery) use ($search) { |
| 122 | + $orgQuery->where('name', 'ilike', '%' . $search . '%'); |
| 123 | + }); |
| 124 | + }); |
| 125 | + } |
| 126 | + |
| 127 | + $allowedSortColumns = ['start_date', 'end_date', 'title', 'created_at']; |
| 128 | + $sortColumn = in_array($sortBy, $allowedSortColumns, true) ? $sortBy : 'start_date'; |
| 129 | + $sortDir = in_array(strtolower($sortDirection), ['asc', 'desc']) ? $sortDirection : 'desc'; |
| 130 | + |
| 131 | + $this->model = $this->model->orderBy($sortColumn, $sortDir); |
| 132 | + |
| 133 | + $this->loadRelation(new Relationship(OrganizerDomainObject::class, name: 'organizer')); |
| 134 | + $this->loadRelation(new Relationship(AccountDomainObject::class, name: 'account')); |
| 135 | + $this->loadRelation(new Relationship(EventStatisticDomainObject::class, name: 'event_statistics')); |
| 136 | + |
| 137 | + return $this->paginate($perPage); |
| 138 | + } |
104 | 139 | } |
0 commit comments