Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion app/Providers/AppServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

namespace App\Providers;

use App\Http\Requests\CustomSearchRequest;
use App\Listeners\ReportEventSubscriber;
use App\Rest\Query\CustomBuilder;
use BezhanSalleh\PanelSwitch\PanelSwitch;
use Filament\Facades\Filament;
use Filament\Navigation\UserMenuItem;
Expand All @@ -12,13 +14,21 @@
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Vite;
use Illuminate\Support\ServiceProvider;
use Lomkit\Rest\Contracts\QueryBuilder;
use Lomkit\Rest\Http\Requests\SearchRequest;

class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void {}
public function register(): void
{
$this->app->afterResolving(SearchRequest::class, function () {
$this->app->singleton(SearchRequest::class, CustomSearchRequest::class);
});
$this->app->bind(QueryBuilder::class, CustomBuilder::class);
}

/**
* Bootstrap any application services.
Expand Down
29 changes: 29 additions & 0 deletions app/Providers/LomkitCustomProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Providers;

use App\Rules\CustomSearchRules;
use Illuminate\Support\ServiceProvider;
use Lomkit\Rest\Http\Requests\SearchRequest;

class LomkitCustomProvider extends ServiceProvider
{
public function register(): void
{
$this->app->extend(SearchRequest::class, function ($searchRequest, $app) {
return new class extends SearchRequest
{
public function rules()
{
return [
'search' => new CustomSearchRules(
$this->route()->controller::newResource(),
$this,
true
),
];
}
};
});
}
}
29 changes: 29 additions & 0 deletions app/Rest/Query/CustomBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Rest\Query;

use Lomkit\Rest\Query\Builder as BaseBuilder;

class CustomBuilder extends BaseBuilder
{
public function filter($field, $operator, $value, $type = 'and', $nested = null)
{
// Handle nested filters
if ($nested !== null) {
return $this->queryBuilder->where(function ($query) use ($nested) {
$this->newQueryBuilder(['resource' => $this->resource, 'query' => $query])
->applyFilters($nested);
}, null, null, $type);
}

// Convert 'ilike' to case-insensitive 'like' for PostgreSQL
if ($operator === 'ilike') {
$field = $this->queryBuilder->getModel()->getTable().'.'.$field;

return $this->queryBuilder->whereRaw("LOWER($field) LIKE ?", [strtolower($value)], $type);
}

// Call parent implementation for other operators
return parent::filter($field, $operator, $value, $type, $nested);
}
}
58 changes: 58 additions & 0 deletions app/Rules/CustomSearchRules.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

namespace App\Rules;

use Illuminate\Validation\Rule;
use Lomkit\Rest\Rules\IsNestedField;
use Lomkit\Rest\Rules\SearchRules;

class CustomSearchRules extends SearchRules
{
public function filtersRules(\Lomkit\Rest\Http\Resource $resource, string $prefix, bool $isMaxDepth = false)
{
$isScoutMode = $this->request->isScoutMode();

$operatorRules = $isScoutMode ?
['=', 'in', 'not in'] :
['=', '!=', '>', '>=', '<', '<=', 'like', 'ilike', 'not like', 'in', 'not in'];

$fieldValidation = $isScoutMode ?
Rule::in($resource->getScoutFields($this->request)) :
new IsNestedField($resource, $this->request);

$rules = array_merge(
[
$prefix.'.*.field' => [
$fieldValidation,
"required_without:$prefix.*.nested",
'string',
],
$prefix.'.*.operator' => [
Rule::in($operatorRules),
'string',
],
$prefix.'.*.value' => [
"exclude_if:$prefix.*.value,null",
"required_without:$prefix.*.nested",
],
$prefix.'.*.type' => ! $isScoutMode ? [
'sometimes',
Rule::in('or', 'and'),
] : [
'prohibited',
],
$prefix.'.*.nested' => ! $isMaxDepth && ! $isScoutMode ? [
'sometimes',
"prohibits:$prefix.*.field,$prefix.*.operator,$prefix.*.value",
'prohibits:value',
'array',
] : [
'prohibited',
],
],
! $isMaxDepth && ! $isScoutMode ? $this->filtersRules($resource, $prefix.'.*.nested', true) : []
);

return $rules;
}
}
2 changes: 2 additions & 0 deletions config/app.php
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@
App\Providers\RestDocumentationServiceProvider::class,
App\Providers\DOIServiceProvider::class,
SocialiteProviders\Generators\GeneratorsServiceProvider::class,
Lomkit\Rest\RestServiceProvider::class,
App\Providers\LomkitCustomProvider::class,
])->toArray(),

/*
Expand Down
2,788 changes: 2,787 additions & 1 deletion public/vendor/rest/openapi.json

Large diffs are not rendered by default.