Skip to content

Commit

Permalink
Merge pull request #10 from spira/request-entity-passed-in-get-valida…
Browse files Browse the repository at this point in the history
…tion-rules

Request Entity passed into getValidationRules
  • Loading branch information
zakhenry committed Dec 16, 2015
2 parents eba5f6e + 79ec7ae commit 0886beb
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 19 deletions.
4 changes: 2 additions & 2 deletions Controllers/AbstractRelatedEntityController.php
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ protected function postSync(BaseModel $parent, Collection $children)
* @param null $entityId
* @return array
*/
protected function getValidationRules($entityId = null)
protected function getValidationRules($entityId = null, array $requestEntity = [])
{
$childRules = $this->getChildModel()->getValidationRules($entityId);
$childRules = $this->getChildModel()->getValidationRules($entityId, $requestEntity);
$pivotRules = $this->getPivotValidationRules();

return array_merge($childRules, $pivotRules);
Expand Down
13 changes: 8 additions & 5 deletions Controllers/ChildEntityController.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ public function postOne(Request $request, $id)
$parent = $this->findParentEntity($id);
$childModel = $this->getChildModel()->newInstance();

$this->validateRequest($request->json()->all(), $this->getValidationRules($id));
$requestEntity = $request->json()->all();
$this->validateRequest($requestEntity, $this->getValidationRules($id, $requestEntity));

$childModel->fill($request->json()->all());

Expand Down Expand Up @@ -147,7 +148,8 @@ public function putOne(Request $request, $id, $childId = false)

$childModel = $this->findOrNewChildEntity($childId, $parent);

$this->validateRequest($request->json()->all(), $this->getValidationRules($childId));
$requestEntity = $request->json()->all();
$this->validateRequest($requestEntity, $this->getValidationRules($childId, $requestEntity));

$childModel->fill($request->json()->all());

Expand Down Expand Up @@ -220,7 +222,8 @@ public function patchOne(Request $request, $id, $childId = false)

$childModel = $this->findOrFailChildEntity($childId, $parent);

$this->validateRequest($request->json()->all(), $this->getValidationRules($id), $childModel);
$requestEntity = $request->json()->all();
$this->validateRequest($requestEntity, $this->getValidationRules($id, $requestEntity), $childModel);

$childModel->fill($request->json()->all());

Expand Down Expand Up @@ -310,9 +313,9 @@ public function deleteMany(Request $request, $id)
* @param null $entityId
* @return array
*/
protected function getValidationRules($entityId = null)
protected function getValidationRules($entityId = null, array $requestEntity = [])
{
$childRules = $this->getChildModel()->getValidationRules($entityId);
$childRules = $this->getChildModel()->getValidationRules($entityId, $requestEntity);
$pivotRules = $this->getPivotValidationRules();

return array_merge($childRules, $pivotRules);
Expand Down
15 changes: 10 additions & 5 deletions Controllers/EntityController.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,10 @@ public function postOne(Request $request)
{
$model = $this->getModel()->newInstance();
$requestEntity = $request->json()->all();
$this->validateRequest($requestEntity, $this->getValidationRules($this->getKeyFromRequestEntity($this->getModel(), $requestEntity)));
$this->validateRequest(
$requestEntity,
$this->getValidationRules($this->getKeyFromRequestEntity($this->getModel(), $requestEntity), $requestEntity)
);
$model->fill($requestEntity);
$this->checkPermission(static::class.'@postOne', ['model' => $model]);
$model->save();
Expand All @@ -157,7 +160,8 @@ public function putOne(Request $request, $id)
$this->checkEntityIdMatchesRoute($request, $id, $this->getModel());
$model = $this->findOrNewEntity($id);

$this->validateRequest($request->json()->all(), $this->getValidationRules($id));
$requestEntity = $request->json()->all();
$this->validateRequest($requestEntity, $this->getValidationRules($id, $requestEntity));

$model->fill($request->json()->all());
$this->checkPermission(static::class.'@putOne', ['model' => $model]);
Expand Down Expand Up @@ -210,7 +214,8 @@ public function patchOne(Request $request, $id)

$model = $this->findOrFailEntity($id);

$this->validateRequest($request->json()->all(), $this->getValidationRules($id), $model);
$requestEntity = $request->json()->all();
$this->validateRequest($requestEntity, $this->getValidationRules($id, $requestEntity), $model);

$model->fill($request->json()->all());
$this->checkPermission(static::class.'@patchOne', ['model' => $model]);
Expand Down Expand Up @@ -520,8 +525,8 @@ protected function getModel()
/**
* @return array
*/
protected function getValidationRules($entityKey = null)
protected function getValidationRules($entityKey = null, array $requestEntity = [])
{
return $this->getModel()->getValidationRules($entityKey);
return $this->getModel()->getValidationRules($entityKey, $requestEntity);
}
}
5 changes: 3 additions & 2 deletions Controllers/LinkedEntityController.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@ public function attachOne(Request $request, $id, $childId)
$parent = $this->findParentEntity($id);
$childModel = $this->findOrNewChildEntity($childId, $parent);

$this->validateRequest($request->json()->all(), $this->getValidationRules($childId), $childModel, true);
$childModel->fill($request->json()->all());
$requestEntity = $request->json()->all();
$this->validateRequest($requestEntity, $this->getValidationRules($childId, $requestEntity), $childModel, true);
$childModel->fill($requestEntity);
$this->checkPermission(static::class.'@attachOne', ['model' => $parent, 'children' => $childModel]);

$this->getRelation($parent)->attach($childModel, $this->getPivotValues($childModel));
Expand Down
4 changes: 2 additions & 2 deletions Controllers/LocalizableTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,10 @@ protected function validateAndSaveLocalizations(BaseModel $model, $localizations

// Validate the region
$regionCode = ['region_code' => $region];
parent::validateRequest($regionCode, Localization::getValidationRules(null));
parent::validateRequest($regionCode, Localization::getValidationRules(null, $regionCode));

// Localizations are partial updates so only validate the fields which were sent with the request
$this->validateRequest($localizations, $this->getValidationRules($model->getKey()), null, true);
$this->validateRequest($localizations, $this->getValidationRules($model->getKey(), $localizations), null, true);

return $model
->localizations()
Expand Down
2 changes: 1 addition & 1 deletion Controllers/RequestValidationTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ public function validateRequestCollection($requestCollection, BaseModel $model,
$errors = [];

foreach ($requestCollection as $requestEntity) {
$validationRules = $this->getValidationRules($this->getKeyFromRequestEntity($model, $requestEntity));
$validationRules = $this->getValidationRules($this->getKeyFromRequestEntity($model, $requestEntity), $requestEntity);
try {
$this->validateRequest($requestEntity, $validationRules, null, $limitToKeysPresent);
$errors[] = null;
Expand Down
2 changes: 1 addition & 1 deletion Model/Model/BaseModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ abstract class BaseModel extends Model
* @param null $entityId
* @return array
*/
public static function getValidationRules($entityId = null)
public static function getValidationRules($entityId = null, array $requestEntity = [])
{
return static::$validationRules;
}
Expand Down
5 changes: 4 additions & 1 deletion Model/Test/TestEntity.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,10 @@ class TestEntity extends IndexedModel implements LocalizableModelInterface
self::UPDATED_AT => 'datetime',
];

public static function getValidationRules($entityId = null)
public static function getValidationRules($entityId = null, array $requestEntity = [])
{
$hash = ! empty($requestEntity['hash']) ? $requestEntity['hash'] : '';

return [
'entity_id' => 'required|uuid',
'varchar' => 'required|string',
Expand All @@ -73,6 +75,7 @@ public static function getValidationRules($entityId = null)
'multi_word_column_title' => 'required|boolean',
'hidden' => 'required|boolean',
'json' => 'required|decoded_json',
'non_existant' => 'required_if:conditional,yes|in:'.$hash,
];
}

Expand Down
19 changes: 19 additions & 0 deletions tests/integration/EntityTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,25 @@ public function testPutOneNewInvalidId()
$this->assertResponseStatus(500);
}

/**
* Conditional validation expects "non_existant" field to be equal to hash value.
*/
public function testConditionalValidationUsingRequestValue()
{
$entity = $this->getFactory(TestEntity::class)
->makeVisible(['hidden'])
->customize(['conditional' => 'yes', 'non_existant' => 'bad value'])
->transformed();

$this->withAuthorization()->putJson('/test/entities/'.$entity['entityId'], $entity);
$this->assertResponseStatus(422);

$entity['nonExistant'] = $entity['hash'];

$this->withAuthorization()->putJson('/test/entities/'.$entity['entityId'], $entity);
$this->assertResponseStatus(201);
}

public function testPutManyNoIds()
{
$entities = $this->getFactory(TestEntity::class)
Expand Down

0 comments on commit 0886beb

Please sign in to comment.