1
0
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:
2022-05-29 04:21:56 +07:00
parent ff7fe27698
commit fe2e5d316c
13 changed files with 272 additions and 10 deletions

View 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);
}
}

View 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;
}
}

View 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();
}
}