mirror of
https://github.com/robonen/metr.git
synced 2026-03-20 02:44:42 +00:00
Offer filters and user feedback
This commit is contained in:
18
backend/app/Filters/Filterable.php
Normal file
18
backend/app/Filters/Filterable.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
trait Filterable
|
||||
{
|
||||
/**
|
||||
* @param \Illuminate\Database\Eloquent\Builder $builder
|
||||
* @param \App\Filters\QueryFilter $filters
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function scopeFilter(Builder $builder, QueryFilter $filters): Builder
|
||||
{
|
||||
return $filters->apply($builder);
|
||||
}
|
||||
}
|
||||
57
backend/app/Filters/OfferFilter.php
Normal file
57
backend/app/Filters/OfferFilter.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filters;
|
||||
|
||||
use App\Enums\OrderTypesEnum;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class OfferFilter extends QueryFilter
|
||||
{
|
||||
/**
|
||||
* @param string $type
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
protected function type(string $type): Builder
|
||||
{
|
||||
if (OrderTypesEnum::tryFrom($type) !== null)
|
||||
return $this->builder->where('type', $type);
|
||||
|
||||
return $this->builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $rooms
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
protected function rooms(int $rooms): Builder
|
||||
{
|
||||
if ($rooms >= 1)
|
||||
return $this->builder->where('rooms', '>=', $rooms);
|
||||
|
||||
return $this->builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $price
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
protected function startPrice(int $price): Builder
|
||||
{
|
||||
if ($price >= 0)
|
||||
return $this->builder->where('price', '>=', $price);
|
||||
|
||||
return $this->builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $price
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
protected function endPrice(int $price): Builder
|
||||
{
|
||||
if ($price >= 0)
|
||||
return $this->builder->where('price', '<=', $price);
|
||||
|
||||
return $this->builder;
|
||||
}
|
||||
}
|
||||
46
backend/app/Filters/QueryFilter.php
Normal file
46
backend/app/Filters/QueryFilter.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
abstract class QueryFilter
|
||||
{
|
||||
protected Request $request;
|
||||
|
||||
protected Builder $builder;
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Http\Request $request
|
||||
*/
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Database\Eloquent\Builder $builder
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function apply(Builder $builder): Builder
|
||||
{
|
||||
$this->builder = $builder;
|
||||
|
||||
foreach ($this->filters() as $name => $value) {
|
||||
if (method_exists($this, $name)) {
|
||||
call_user_func_array([$this, $name], array_filter([$value]));
|
||||
}
|
||||
}
|
||||
|
||||
return $this->builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array|string|null
|
||||
*/
|
||||
private function filters(): array|string|null
|
||||
{
|
||||
return $this->request->query();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user