diff --git a/app/Http/Controllers/OfficeController.php b/app/Http/Controllers/OfficeController.php index 483a2b9..e98ef7c 100644 --- a/app/Http/Controllers/OfficeController.php +++ b/app/Http/Controllers/OfficeController.php @@ -2,50 +2,50 @@ namespace App\Http\Controllers; -use App\Http\Resources\OfficeResource; +use App\Models\User; use App\Models\Office; use App\Models\Reservation; -use App\Models\User; -use App\Models\Validators\OfficeValidator; -use App\Notifications\OfficePendingApproval; -use Illuminate\Http\Resources\Json\JsonResource; -use Illuminate\Http\Response; use Illuminate\Support\Arr; +use Illuminate\Http\Response; +use Illuminate\Validation\Rule; +use Illuminate\Pipeline\Pipeline; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Notification; +use App\Http\Resources\OfficeResource; use Illuminate\Support\Facades\Storage; -use Illuminate\Validation\Rule; +use App\Models\Validators\OfficeValidator; +use App\Notifications\OfficePendingApproval; +use Illuminate\Support\Facades\Notification; +use App\Http\Pipelines\Orders\OrderByDistance; use Illuminate\Validation\ValidationException; +use App\Http\Pipelines\Filtration\FilterByTags; +use Illuminate\Http\Resources\Json\JsonResource; +use App\Http\Pipelines\Filtration\FilterByUserId; +use App\Http\Pipelines\Filtration\OfficeAvailable; +use App\Http\Pipelines\Filtration\FilterByVisitorId; +use App\Http\Pipelines\Relationships\ReturnWithTags; +use App\Http\Pipelines\Relationships\ReturnWithUser; +use App\Http\Pipelines\Relationships\ReturnWithImages; +use App\Http\Pipelines\Relationships\ReturnWithReservationsCount; class OfficeController extends Controller { public function index(): JsonResource { - $offices = Office::query() - ->when(request('user_id') && auth()->user() && request('user_id') == auth()->id(), - fn($builder) => $builder, - fn($builder) => $builder->where('approval_status', Office::APPROVAL_APPROVED)->where('hidden', false) - ) - ->when(request('user_id'), fn($builder) => $builder->whereUserId(request('user_id'))) - ->when(request('visitor_id'), - fn($builder) => $builder->whereRelation('reservations', 'user_id', '=', request('visitor_id')) - ) - ->when( - request('lat') && request('lng'), - fn($builder) => $builder->nearestTo(request('lat'), request('lng')), - fn($builder) => $builder->orderBy('id', 'ASC') - ) - ->when(request('tags'), - fn($builder) => $builder->whereHas( - 'tags', - fn ($builder) => $builder->whereIn('id', request('tags')), - '=', - count(request('tags')) - ) - ) - ->with(['images', 'tags', 'user']) - ->withCount(['reservations' => fn($builder) => $builder->whereStatus(Reservation::STATUS_ACTIVE)]) - ->paginate(20); + $offices = app(Pipeline::class) + ->send(Office::query()) + ->through([ + OfficeAvailable::class, + FilterByUserId::class, + FilterByVisitorId::class, + OrderByDistance::class, + FilterByTags::class, + ReturnWithImages::class, + ReturnWithTags::class, + ReturnWithUser::class, + ReturnWithReservationsCount::class, + ]) + ->thenReturn() + ->paginate(request('per_page', 20)); return OfficeResource::collection( $offices diff --git a/app/Http/Pipelines/Filtration/FilterByHostId.php b/app/Http/Pipelines/Filtration/FilterByHostId.php new file mode 100644 index 0000000..acdcd42 --- /dev/null +++ b/app/Http/Pipelines/Filtration/FilterByHostId.php @@ -0,0 +1,20 @@ +when(request('host_id'), + fn(Builder $query) => + $query->whereUserId(request('host_id')) + ); + } +} diff --git a/app/Http/Pipelines/Filtration/FilterByTags.php b/app/Http/Pipelines/Filtration/FilterByTags.php new file mode 100644 index 0000000..049d3d1 --- /dev/null +++ b/app/Http/Pipelines/Filtration/FilterByTags.php @@ -0,0 +1,24 @@ +when(request('tags'), + fn($builder) => $builder->whereHas( + 'tags', + fn ($builder) => $builder->whereIn('id', request('tags')), + '=', + count(request('tags')) + ) + ); + } +} diff --git a/app/Http/Pipelines/Filtration/FilterByUserId.php b/app/Http/Pipelines/Filtration/FilterByUserId.php new file mode 100644 index 0000000..46ee04e --- /dev/null +++ b/app/Http/Pipelines/Filtration/FilterByUserId.php @@ -0,0 +1,17 @@ +when(request('user_id'), fn($builder) => $builder->whereUserId(request('user_id'))); + } +} diff --git a/app/Http/Pipelines/Filtration/FilterByVisitorId.php b/app/Http/Pipelines/Filtration/FilterByVisitorId.php new file mode 100644 index 0000000..768f570 --- /dev/null +++ b/app/Http/Pipelines/Filtration/FilterByVisitorId.php @@ -0,0 +1,20 @@ +when(request('visitor_id'), + fn (Builder $query) => + $query->whereRelation('reservations', 'user_id', request('visitor_id')) + ); + } +} diff --git a/app/Http/Pipelines/Filtration/IsApproved.php b/app/Http/Pipelines/Filtration/IsApproved.php new file mode 100644 index 0000000..86aeb3c --- /dev/null +++ b/app/Http/Pipelines/Filtration/IsApproved.php @@ -0,0 +1,18 @@ +where('approval_status', Office::APPROVAL_APPROVED); + } +} diff --git a/app/Http/Pipelines/Filtration/IsNotHidden.php b/app/Http/Pipelines/Filtration/IsNotHidden.php new file mode 100644 index 0000000..922680b --- /dev/null +++ b/app/Http/Pipelines/Filtration/IsNotHidden.php @@ -0,0 +1,16 @@ +where('hidden', false); + } +} diff --git a/app/Http/Pipelines/Filtration/OfficeAvailable.php b/app/Http/Pipelines/Filtration/OfficeAvailable.php new file mode 100644 index 0000000..0a83360 --- /dev/null +++ b/app/Http/Pipelines/Filtration/OfficeAvailable.php @@ -0,0 +1,22 @@ +when( + request('user_id') && auth()->user() && request('user_id') == auth()->id(), + fn ($builder) => $builder, + fn ($builder) => $builder->where('approval_status', Office::APPROVAL_APPROVED)->where('hidden', false) + ); + } +} diff --git a/app/Http/Pipelines/Orders/OrderByDistance.php b/app/Http/Pipelines/Orders/OrderByDistance.php new file mode 100644 index 0000000..93a6110 --- /dev/null +++ b/app/Http/Pipelines/Orders/OrderByDistance.php @@ -0,0 +1,21 @@ +when( + request('lat') && request('lng'), + fn (Builder $builder) => $builder->nearestTo(request('lat'), request('lng')), + fn (Builder $builder) => $builder->orderBy('id', 'ASC') + ); + } +} diff --git a/app/Http/Pipelines/Pipe.php b/app/Http/Pipelines/Pipe.php new file mode 100644 index 0000000..1d9a085 --- /dev/null +++ b/app/Http/Pipelines/Pipe.php @@ -0,0 +1,11 @@ +with('images'); + } +} diff --git a/app/Http/Pipelines/Relationships/ReturnWithReservationsCount.php b/app/Http/Pipelines/Relationships/ReturnWithReservationsCount.php new file mode 100644 index 0000000..5e32236 --- /dev/null +++ b/app/Http/Pipelines/Relationships/ReturnWithReservationsCount.php @@ -0,0 +1,21 @@ +withCount([ + 'reservations' => + fn(Builder $query) => + $query->whereStatus(Reservation::STATUS_ACTIVE) + ]); + } +} diff --git a/app/Http/Pipelines/Relationships/ReturnWithTags.php b/app/Http/Pipelines/Relationships/ReturnWithTags.php new file mode 100644 index 0000000..178f1e9 --- /dev/null +++ b/app/Http/Pipelines/Relationships/ReturnWithTags.php @@ -0,0 +1,15 @@ +with('tags'); + } +} diff --git a/app/Http/Pipelines/Relationships/ReturnWithUser.php b/app/Http/Pipelines/Relationships/ReturnWithUser.php new file mode 100644 index 0000000..0aef313 --- /dev/null +++ b/app/Http/Pipelines/Relationships/ReturnWithUser.php @@ -0,0 +1,15 @@ +with('user'); + } +}