Skip to content
Merged
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
2 changes: 1 addition & 1 deletion src/Http/Response.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ protected function buildGatesForModel(Model $model, Resource $resource, array $g

public function modelToResponse(Model $model, Resource $resource, array $requestArray, Relation $relation = null)
{
$currentRequestArray = $relation === null ? $requestArray : collect($requestArray['includes'])
$currentRequestArray = $relation === null ? $requestArray : collect($requestArray['includes'] ?? [])
->first(function ($include) use ($relation) {
return preg_match('/(?:\.\b)?'.$relation->relation.'\b/', $include['relation']);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@
use Lomkit\Rest\Tests\Support\Database\Factories\HasOneOfManyRelationFactory;
use Lomkit\Rest\Tests\Support\Database\Factories\HasOneRelationFactory;
use Lomkit\Rest\Tests\Support\Database\Factories\ModelFactory;
use Lomkit\Rest\Tests\Support\Database\Factories\ModelWithFactory;
use Lomkit\Rest\Tests\Support\Models\BelongsToManyRelation;
use Lomkit\Rest\Tests\Support\Models\BelongsToRelation;
use Lomkit\Rest\Tests\Support\Models\HasManyRelation;
use Lomkit\Rest\Tests\Support\Models\HasOneOfManyRelation;
use Lomkit\Rest\Tests\Support\Models\HasOneRelation;
use Lomkit\Rest\Tests\Support\Models\Model;
use Lomkit\Rest\Tests\Support\Models\ModelWith;
use Lomkit\Rest\Tests\Support\Policies\GreenPolicy;
use Lomkit\Rest\Tests\Support\Rest\Resources\BelongsToManyResource;
use Lomkit\Rest\Tests\Support\Rest\Resources\BelongsToResource;
Expand Down Expand Up @@ -171,6 +173,41 @@ public function test_getting_a_list_of_resources_including_belongs_to_relation()
);
}

public function test_getting_a_list_of_resources_with_auto_loaded_relation(): void
{
$belongsTo = BelongsToRelationFactory::new()->create();
$matchingModel = ModelWithFactory::new()
->for($belongsTo)
->create()->fresh();

$matchingModel2 = ModelWithFactory::new()->create()->fresh();

Gate::policy(ModelWith::class, GreenPolicy::class);
Gate::policy(BelongsToRelation::class, GreenPolicy::class);

$response = $this->post(
'/api/model-withs/search',
[
'search' => [],
],
['Accept' => 'application/json']
);

$this->assertResourcePaginated(
$response,
[$matchingModel, $matchingModel2],
new ModelResource(),
[
[
'belongs_to_relation' => $matchingModel->belongsToRelation->only((new BelongsToResource())->getFields(app()->make(RestRequest::class))),
],
[
'belongs_to_relation' => null,
],
]
);
}

public function test_getting_a_list_of_resources_including_belongs_to_has_many_relation(): void
{
$belongsTo = BelongsToRelationFactory::new()->create();
Expand Down
30 changes: 30 additions & 0 deletions tests/Support/Database/Factories/ModelWithFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Lomkit\Rest\Tests\Support\Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Lomkit\Rest\Tests\Support\Models\Model;
use Lomkit\Rest\Tests\Support\Models\ModelWith;

class ModelWithFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var class-string<\Illuminate\Database\Eloquent\Model|TModel>
*/
protected $model = ModelWith::class;

/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => fake()->name(),
'number' => fake()->numberBetween(-9999999, 9999999),
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class() extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('model_withs', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->bigInteger('number');
$table->string('string')->nullable();
$table->foreignIdFor(\Lomkit\Rest\Tests\Support\Models\BelongsToRelation::class)->nullable()->constrained();
$table->timestamps();
});
}
};
11 changes: 11 additions & 0 deletions tests/Support/Http/Controllers/ModelWithController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Lomkit\Rest\Tests\Support\Http\Controllers;

use Lomkit\Rest\Http\Controllers\Controller;
use Lomkit\Rest\Tests\Support\Rest\Resources\ModelWithResource;

class ModelWithController extends Controller
{
public static $resource = ModelWithResource::class;
}
30 changes: 30 additions & 0 deletions tests/Support/Models/ModelWith.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Lomkit\Rest\Tests\Support\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model as BaseModel;
use Lomkit\Rest\Tests\Support\Database\Factories\ModelFactory;

class ModelWith extends BaseModel
{
use HasFactory;

protected static function newFactory()
{
return new ModelFactory();
}

protected $with = [
'belongsToRelation',
];

protected $fillable = [
'id',
];

public function belongsToRelation()
{
return $this->belongsTo(BelongsToRelation::class);
}
}
37 changes: 37 additions & 0 deletions tests/Support/Rest/Resources/ModelWithResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace Lomkit\Rest\Tests\Support\Rest\Resources;

use Lomkit\Rest\Http\Requests\RestRequest;
use Lomkit\Rest\Http\Resource;
use Lomkit\Rest\Relations\BelongsTo;
use Lomkit\Rest\Tests\Support\Models\ModelWith;

class ModelWithResource extends Resource
{
public static $model = ModelWith::class;

public function fields(RestRequest $request): array
{
return [
'id',
'name',
'number',
'string',
];
}

public function defaultOrderBy(RestRequest $request): array
{
return [
'id' => 'asc',
];
}

public function relations(RestRequest $request): array
{
return [
BelongsTo::make('belongsToRelation', BelongsToResource::class),
];
}
}
4 changes: 2 additions & 2 deletions tests/Support/Routes/api.php
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<?php

use Illuminate\Support\Facades\Route;
use Lomkit\Rest\Tests\Support\Http\Controllers\ModelController;

Route::group(['as' => 'api.', 'prefix' => 'api'], function () {
\Lomkit\Rest\Facades\Rest::resource('models', ModelController::class);
\Lomkit\Rest\Facades\Rest::resource('models', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelController::class);
\Lomkit\Rest\Facades\Rest::resource('model-withs', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelWithController::class);

\Lomkit\Rest\Facades\Rest::resource('no-exposed-fields', \Lomkit\Rest\Tests\Support\Http\Controllers\NoExposedFieldsController::class);
\Lomkit\Rest\Facades\Rest::resource('automatic-gating', \Lomkit\Rest\Tests\Support\Http\Controllers\AutomaticGatingController::class);
Expand Down