86 lines
1.9 KiB
PHP
86 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Lib;
|
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Spatie\LaravelData\Data;
|
|
|
|
/**
|
|
* @template T of Model
|
|
*/
|
|
abstract class Filter extends Data
|
|
{
|
|
public string $unsetReplacer = 'yoNee3ainge4eetiier9ogaiChoe0ahcaR3Hu1uzah8xaiv7ael7yahphai7ruG9';
|
|
|
|
/**
|
|
* @return array<string, mixed>
|
|
*/
|
|
abstract protected function locks(): array;
|
|
|
|
/**
|
|
* @param array<string, mixed>|string|null $request
|
|
*/
|
|
public static function fromRequest(array|string|null $request = null): static
|
|
{
|
|
$payload = is_string($request)
|
|
? json_decode(rawurldecode(base64_decode($request)), true)
|
|
: $request;
|
|
|
|
return static::fromPost($payload);
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $post
|
|
*/
|
|
public static function fromPost(?array $post = null): static
|
|
{
|
|
return static::withoutMagicalCreationFrom($post ?: [])->parseLocks();
|
|
}
|
|
|
|
public function parseLocks(): static
|
|
{
|
|
foreach ($this->locks() as $key => $value) {
|
|
if ($value === $this->unsetReplacer) {
|
|
continue;
|
|
}
|
|
|
|
$this->{$key} = $value;
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @param mixed $value
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function when(bool $when, $value)
|
|
{
|
|
return $when ? $value : $this->unsetReplacer;
|
|
}
|
|
|
|
/**
|
|
* @param Builder<T> $query
|
|
*
|
|
* @return Builder<T>
|
|
*/
|
|
protected function applyOwnOthers(Builder $query, bool $own, bool $others): Builder
|
|
{
|
|
if ($own && !$others) {
|
|
$query->where('user_id', auth()->id());
|
|
}
|
|
|
|
if (!$own && $others) {
|
|
$query->where('user_id', '!=', auth()->id());
|
|
}
|
|
|
|
if (!$own && !$others) {
|
|
$query->where('id', -1);
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
}
|