Skip to content

Commit 565a2e0

Browse files
committed
Update README
1 parent b274d29 commit 565a2e0

File tree

2 files changed

+79
-15
lines changed

2 files changed

+79
-15
lines changed

.phpunit.cache/test-results

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"version":"pest_2.34.4","defects":{"P\\Tests\\ResourceActionTest::__pest_evaluable_it_fails_to_apply_transformation_if_field_is_missing":8},"times":{"P\\Tests\\LaravelActionTest::__pest_evaluable_it_can_make_a_menu_action":0.001,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_can_make_an_API_action":0.046,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_can_make_an_action_without_model_option":0.001,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_has_make_action_command":0.004,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_can_make_an_action_with_model_option":0.001,"P\\Tests\\AbstractActionTest::__pest_evaluable_it_creates_a_user_with_valid_data":0.136,"P\\Tests\\AbstractActionTest::__pest_evaluable_it_applies_hashing_to_password_field":0.141,"P\\Tests\\AbstractActionTest::__pest_evaluable_it_uses_transactions_during_execution":0.099,"P\\Tests\\AbstractActionTest::__pest_evaluable_it_removes_confirmation_fields_from_inputs":0.003,"P\\Tests\\AbstractActionTest::__pest_evaluable_it_validates_required_fields":0.001,"P\\Tests\\AbstractActionTest::__pest_evaluable_it_throws_exception_if_model_is_not_set":0.066,"P\\Tests\\AbstractActionTest::__pest_evaluable_it_applies_encryption_to_specified_fields":0.069,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_creates_a_user_with_valid_data":0.121,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_applies_encryption_to_specified_fields":0.063,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_uses_transactions_during_execution":0.069,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_validates_required_fields":0.002,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_throws_exception_if_model_is_not_set":0.062,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_applies_hashing_to_password_field":0.123,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_removes_confirmation_fields_from_inputs":0.001,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_applies_both_hashing_and_encryption_to_specified_fields":0.145,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_handles_multiple_fields_for_hashing_and_encryption":0.241,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_fails_to_apply_transformation_if_field_is_missing":0.001,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_applies_constraints_for_update_or_create":0.182,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_does_not_apply_transformation_if_optional_field_is_missing":0.001}}
1+
{"version":"pest_2.36.0","defects":[],"times":{"P\\Tests\\ResourceActionTest::__pest_evaluable_it_applies_constraints_for_update_or_create":0.228,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_handles_multiple_fields_for_hashing_and_encryption":0.267,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_applies_hashing_to_password_field":0.138,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_applies_both_hashing_and_encryption_to_specified_fields":0.135,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_does_not_apply_transformation_if_optional_field_is_missing":0.003,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_removes_confirmation_fields_from_inputs":0,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_validates_required_fields":0.001,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_throws_exception_if_model_is_not_set":0.067,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_uses_transactions_during_execution":0.077,"P\\Tests\\ResourceActionTest::__pest_evaluable_it_creates_a_user_with_valid_data":0.133,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_has_make_action_command":0.006,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_can_make_an_API_action":0.002,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_can_make_an_action_with_model_option":0.001,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_can_make_an_action_without_model_option":0.002,"P\\Tests\\LaravelActionTest::__pest_evaluable_it_can_make_a_menu_action":0.001}}

README.md

Lines changed: 78 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
# Simple Actionable for Laravel
22

3-
[![Latest Version on Packagist](https://img.shields.io/packagist/v/cleaniquecoders/laravel-action.svg?style=flat-square)](https://packagist.org/packages/cleaniquecoders/laravel-action)
4-
[![GitHub Tests Action Status](https://img.shields.io/github/workflow/status/cleaniquecoders/laravel-action/run-tests?label=tests)](https://github.com/cleaniquecoders/laravel-action/actions?query=workflow%3Arun-tests+branch%3Amain)
5-
[![GitHub Code Style Action Status](https://img.shields.io/github/workflow/status/cleaniquecoders/laravel-action/Fix%20PHP%20code%20style%20issues?label=code%20style)](https://github.com/cleaniquecoders/laravel-action/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain)
6-
[![Total Downloads](https://img.shields.io/packagist/dt/cleaniquecoders/laravel-action.svg?style=flat-square)](https://packagist.org/packages/cleaniquecoders/laravel-action)
3+
[![Latest Version on Packagist](https://img.shields.io/packagist/v/cleaniquecoders/laravel-action.svg?style=flat-square)](https://packagist.org/packages/cleaniquecoders/laravel-action) [![GitHub Tests Action Status](https://img.shields.io/github/workflow/status/cleaniquecoders/laravel-action/run-tests?label=tests)](https://github.com/cleaniquecoders/laravel-action/actions?query=workflow%3Arun-tests+branch%3Amain) [![GitHub Code Style Action Status](https://img.shields.io/github/workflow/status/cleaniquecoders/laravel-action/Fix%20PHP%20code%20style%20issues?label=code%20style)](https://github.com/cleaniquecoders/laravel-action/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain) [![Total Downloads](https://img.shields.io/packagist/dt/cleaniquecoders/laravel-action.svg?style=flat-square)](https://packagist.org/packages/cleaniquecoders/laravel-action)
74

85
Simple Actionable for Laravel.
96

@@ -21,10 +18,16 @@ You can publish the config file with:
2118
php artisan vendor:publish --tag="laravel-action-config"
2219
```
2320

24-
Optionally, you can publish the views using
21+
Optionally, you can publish the views using:
22+
23+
```bash
24+
php artisan vendor:publish --tag="laravel-action-views"
25+
```
2526

2627
## Usage
2728

29+
You can create an action using the Artisan command:
30+
2831
```bash
2932
php artisan make:action User\\CreateOrUpdateUser --model=User
3033
```
@@ -37,39 +40,100 @@ This will create an action in `app\Actions\User`:
3740
namespace App\Actions\User;
3841

3942
use App\Models\User;
40-
use CleaniqueCoders\LaravelAction\AbstractAction as Action;
43+
use CleaniqueCoders\LaravelAction\ResourceAction;
4144

42-
class CreateOrUpdateUser extends Action
45+
class CreateOrUpdateUser extends ResourceAction
4346
{
4447
public $model = User::class;
4548

4649
public function rules(): array
4750
{
48-
return [];
51+
return [
52+
'name' => 'required|string|max:255',
53+
'email' => 'required|string|email|unique:users,email',
54+
'password' => 'required|string|min:8',
55+
];
4956
}
5057
}
5158
```
5259

53-
Then you can use it like:
60+
### New Features and Example Usage
61+
62+
#### 1. Flexible Property Setter
63+
64+
You can now set various properties, like `hashFields`, `encryptFields`, and `constrainedBy`, dynamically using the `setProperty` method:
65+
66+
```php
67+
$action = new CreateOrUpdateUser(['name' => 'John Doe', 'email' => 'johndoe@example.com', 'password' => 'secretpassword']);
68+
$action->setProperty('hashFields', ['password']); // Hash the password
69+
$action->setProperty('encryptFields', ['ssn']); // Encrypt SSN
70+
$action->setProperty('constrainedBy', ['email' => 'johndoe@example.com']); // Use email as a unique constraint
71+
```
72+
73+
This flexible property setting reduces boilerplate and simplifies configuration of actions.
74+
75+
#### 2. Field Transformation with Hashing and Encryption
76+
77+
The `ResourceAction` class supports field-level transformations. For example, you can hash a `password` field and encrypt an `ssn` field:
5478

5579
```php
56-
use App\Actions\User\CreateOrUpdateUser;
80+
$inputs = [
81+
'name' => 'Jane Doe',
82+
'email' => 'janedoe@example.com',
83+
'password' => 'securepassword',
84+
'ssn' => '123-45-6789',
85+
];
86+
87+
$action = new CreateOrUpdateUser($inputs);
88+
$action->setProperty('hashFields', ['password']);
89+
$action->setProperty('encryptFields', ['ssn']);
90+
$record = $action->execute();
91+
```
92+
93+
After execution:
94+
- The `password` field will be hashed for security.
95+
- The `ssn` field will be encrypted, ensuring secure storage.
5796

58-
$user = (new CreateOrUpdateUser(['name' => 'Nasrul Hazim', 'email' => 'nasrul@work.com']));
97+
#### 3. Constraint-Based `updateOrCreate`
5998

60-
// do more with \App\Models\User object
61-
// $user->assignRole(...)
99+
You can specify constraints to perform `updateOrCreate` actions based on unique fields or identifiers. Here’s an example of updating an existing user by `id`:
100+
101+
```php
102+
// Assume there's an existing user with this email
103+
$existingUser = User::create([
104+
'name' => 'Old Name',
105+
'email' => 'uniqueemail@example.com',
106+
'password' => Hash::make('oldpassword'),
107+
]);
108+
109+
// Define the inputs to update the existing user
110+
$inputs = [
111+
'name' => 'John Doe Updated',
112+
'email' => 'uniqueemail@example.com', // Same email
113+
'password' => 'newpassword',
114+
];
115+
116+
$action = new CreateOrUpdateUser($inputs);
117+
$action->setProperty('constrainedBy', ['id' => $existingUser->id]); // Update by user ID
118+
119+
$record = $action->execute();
120+
121+
// The existing user record with the specified ID will be updated.
62122
```
63123

124+
This allows precise control over `updateOrCreate` behavior based on custom constraints.
125+
64126
## Testing
65127

128+
Run the tests with:
129+
66130
```bash
67131
composer test
68132
```
69133

70134
## Changelog
71135

72-
Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.
136+
Please see [CHANGELOG](CHANGELOG.md) for more information on recent changes.
73137

74138
## Contributing
75139

0 commit comments

Comments
 (0)