diff --git a/README.md b/README.md index d838948..9c6a091 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/soap/laravel-workflow-storage/fix-php-code-style-issues.yml?branch=main&label=code%20style&style=flat-square)](https://github.com/soap/laravel-workflow-storage/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain) [![Total Downloads](https://img.shields.io/packagist/dt/soap/laravel-workflow-storage.svg?style=flat-square)](https://packagist.org/packages/soap/laravel-workflow-storage) -This package extends [zerodahero/laravel-workflow](https://github.com/zerodahero/laravel-workflow) by adding option to store workflow coniguration in database. Laravel workflow only support loading configuration form Laravel configuration. This package provides user to change workflow configuration without helping from developers. +This package extends [zerodahero/laravel-workflow](https://github.com/zerodahero/laravel-workflow) by adding option to store workflow configuration in database. Laravel workflow only support loading configuration form Laravel configuration. This package provides user to change workflow configuration without helping from developers. ## Support us diff --git a/database/migrations/wf4_create_workflow_state_transitions_table.php b/database/migrations/wf4_create_workflow_state_transitions_table.php index 198e8d2..c7b31d1 100644 --- a/database/migrations/wf4_create_workflow_state_transitions_table.php +++ b/database/migrations/wf4_create_workflow_state_transitions_table.php @@ -10,9 +10,9 @@ public function up() { Schema::create('workflow_state_transitions', function (Blueprint $table) { $table->id(); - $table->foreignId('transition_id')->constrained('workflow_transitions')->onDelete('cascade'); + $table->foreignId('workflow_transition_id')->constrained('workflow_transitions')->onDelete('cascade'); $table->foreignId('from_state_id')->constrained('workflow_states')->onDelete('cascade'); - $table->unique(['transition_id', 'from_state_id'], 'wf_transition_from_state_unique'); + $table->unique(['workflow_transition_id', 'from_state_id'], 'wf_transition_from_state_unique'); $table->timestamps(); }); } diff --git a/resources/views/stubs/WorkflowServiceProvider.php.stub b/resources/views/stubs/WorkflowServiceProvider.php.stub new file mode 100644 index 0000000..62a8a90 --- /dev/null +++ b/resources/views/stubs/WorkflowServiceProvider.php.stub @@ -0,0 +1,23 @@ +make('workflow'); + $workflowLoader = app()->make('workflow-storage'); + foreach ($wokflowLoader->all() as $workflow => $config) { + $registy->addFromArray($workflow, $config); + } + } +} \ No newline at end of file diff --git a/src/Facades/WorkflowStorage.php b/src/Facades/WorkflowStorage.php index 803886c..c49cc36 100644 --- a/src/Facades/WorkflowStorage.php +++ b/src/Facades/WorkflowStorage.php @@ -11,6 +11,6 @@ class WorkflowStorage extends Facade { protected static function getFacadeAccessor(): string { - return \Soap\WorkflowStorage\WorkflowStorage::class; + return 'workflow-storage'; } } diff --git a/src/Models/Workflow.php b/src/Models/Workflow.php index b3bb095..0af73f6 100644 --- a/src/Models/Workflow.php +++ b/src/Models/Workflow.php @@ -12,14 +12,7 @@ class Workflow extends Model { use HasFactory; - protected $fillable = [ - 'name', - 'marking_store_attribute', - 'type', - 'description', - 'supports', - 'metadata', - ]; + protected $guarded = ['id']; protected $casts = [ 'supports' => 'array', diff --git a/src/Models/WorkflowState.php b/src/Models/WorkflowState.php index 9311e67..3745a2f 100644 --- a/src/Models/WorkflowState.php +++ b/src/Models/WorkflowState.php @@ -11,13 +11,7 @@ class WorkflowState extends Model { use HasFactory; - protected $fillable = [ - 'workflow_id', - 'name', - 'initial_state', - 'final_state', - 'metadata', - ]; + protected $guarded = ['id']; protected $casts = [ 'metadata' => 'array', diff --git a/src/Models/WorkflowStateTransition.php b/src/Models/WorkflowStateTransition.php index e516740..5fc5a6d 100644 --- a/src/Models/WorkflowStateTransition.php +++ b/src/Models/WorkflowStateTransition.php @@ -11,11 +11,7 @@ class WorkflowStateTransition extends Model { use HasFactory; - protected $fillable = [ - 'transition_id', - 'from_state_id', - 'metadata', - ]; + protected $guarded = ['id']; protected $casts = [ 'metadata' => 'array', diff --git a/src/Models/WorkflowTransition.php b/src/Models/WorkflowTransition.php index 076c748..f0bedef 100644 --- a/src/Models/WorkflowTransition.php +++ b/src/Models/WorkflowTransition.php @@ -12,12 +12,7 @@ class WorkflowTransition extends Model { use HasFactory; - protected $fillable = [ - 'workflow_id', - 'from_state_id', - 'to_state_id', - 'metadata', - ]; + protected $guarded = ['id']; protected $casts = [ 'metadata' => 'array', diff --git a/src/Repositories/WorkflowRepository.php b/src/Repositories/WorkflowRepository.php new file mode 100644 index 0000000..9ca1bd7 --- /dev/null +++ b/src/Repositories/WorkflowRepository.php @@ -0,0 +1,18 @@ +find($id); + } +} diff --git a/src/WorkflowStorage.php b/src/WorkflowStorage.php index e91e25e..60ed17d 100644 --- a/src/WorkflowStorage.php +++ b/src/WorkflowStorage.php @@ -8,8 +8,31 @@ class WorkflowStorage { protected array $loaders = []; + public function __construct(?WorkflowLoader $loader) + { + if ($loader) { + $this->registerLoader($loader); + } + } + public function registerLoader(WorkflowLoader $loader) { $this->loaders[$loader::class] = $loader; } + + public function getLoader(string $loader): WorkflowLoader + { + return $this->loaders[$loader]; + } + + public function all(): array + { + if (count($this->loaders) === 0) { + return []; + } + + return collect($this->loaders)->mapWithKeys(function ($loader) { + return [$loader::class => $loader->all()]; + })->toArray(); + } } diff --git a/src/WorkflowStorageServiceProvider.php b/src/WorkflowStorageServiceProvider.php index 300ad11..59bf582 100644 --- a/src/WorkflowStorageServiceProvider.php +++ b/src/WorkflowStorageServiceProvider.php @@ -24,19 +24,21 @@ public function configurePackage(Package $package): void 'wf3_create_workflow_transitions_table', 'wf4_create_workflow_state_transitions_table', ]) - ->hasCommand(WorkflowStorageListCommand::class); + ->hasCommand(WorkflowStorageListCommand::class) + ->publishesServiceProvider('WorkflowServiceProvider'); } public function packageRegistered() { + $this->app->singleton('workflow-storage', function ($app) { + $workflowStorage = new WorkflowStorage($app->make(DatabaseLoader::class)); + }); + $this->app->singleton(DatabaseLoader::class, function ($app) { $config = $app->make('config')->get('workflow-storage.databaseLoader', []); return new DatabaseLoader(config: $config); }); - $this->app->singleton(WorkflowStorage::class, function ($app) { - return new WorkflowStorage; - }); } } diff --git a/tests/Feature/WorkflowStorageTest.php b/tests/Feature/WorkflowStorageTest.php new file mode 100644 index 0000000..705587d --- /dev/null +++ b/tests/Feature/WorkflowStorageTest.php @@ -0,0 +1,59 @@ + 'Test Workflow', + 'type' => 'workflow', + 'description' => 'Test Workflow Description', + 'supports' => [], + 'metadata' => [], + ]); + + $draftState = $workflow->states()->create([ + 'name' => 'draft', + 'metadata' => [], + ]); + + $onReviewState = $workflow->states()->create([ + 'name' => 'on review', + 'metadata' => [], + ]); + + $approvedState = $workflow->states()->create([ + 'name' => 'approved', + 'metadata' => [], + ]); + + $rejectedState = $workflow->states()->create([ + 'name' => 'rejected', + 'metadata' => [], + ]); + + $onReviewTransition = $workflow->transitions()->create([ + 'name' => 'submit', + 'to_state_id' => $onReviewState->id, + 'metadata' => [], + ]); + + $onReviewTransition->fromStates()->create([ + 'from_state_id' => $draftState->id, + ]); +}); + +test('data can be retrieved from the database', function () { + $workflow = Workflow::first(); + $states = $workflow->states; + $transitions = $workflow->transitions; + + expect($workflow->name)->toBe('Test Workflow'); + expect($workflow->type->value)->toBe('workflow'); + expect($workflow->description)->toBe('Test Workflow Description'); + expect($workflow->supports)->toBe([]); + expect($workflow->metadata)->toBe([]); + + expect($states->count())->toBe(4); + expect($transitions->count())->toBe(1); +});