Skip to content

Commit 3eafa1c

Browse files
authored
Merge pull request #3 from soap/develop
Update service providers and dependency injection related to package structure.
2 parents 950882e + 52aab2f commit 3eafa1c

12 files changed

+137
-34
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[![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)
77
[![Total Downloads](https://img.shields.io/packagist/dt/soap/laravel-workflow-storage.svg?style=flat-square)](https://packagist.org/packages/soap/laravel-workflow-storage)
88

9-
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.
9+
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.
1010

1111
## Support us
1212

database/migrations/wf4_create_workflow_state_transitions_table.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ public function up()
1010
{
1111
Schema::create('workflow_state_transitions', function (Blueprint $table) {
1212
$table->id();
13-
$table->foreignId('transition_id')->constrained('workflow_transitions')->onDelete('cascade');
13+
$table->foreignId('workflow_transition_id')->constrained('workflow_transitions')->onDelete('cascade');
1414
$table->foreignId('from_state_id')->constrained('workflow_states')->onDelete('cascade');
15-
$table->unique(['transition_id', 'from_state_id'], 'wf_transition_from_state_unique');
15+
$table->unique(['workflow_transition_id', 'from_state_id'], 'wf_transition_from_state_unique');
1616
$table->timestamps();
1717
});
1818
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace App\Providers;
4+
5+
use Illuminate\Support\ServiceProvider;
6+
use Soap\WorkflowStorage\DatabaseLoader;
7+
8+
class WorkflowServiceProvider extends ServiceProvider
9+
{
10+
public function register()
11+
{
12+
13+
}
14+
15+
public function boot()
16+
{
17+
$registy = app()->make('workflow');
18+
$workflowLoader = app()->make('workflow-storage');
19+
foreach ($wokflowLoader->all() as $workflow => $config) {
20+
$registy->addFromArray($workflow, $config);
21+
}
22+
}
23+
}

src/Facades/WorkflowStorage.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ class WorkflowStorage extends Facade
1111
{
1212
protected static function getFacadeAccessor(): string
1313
{
14-
return \Soap\WorkflowStorage\WorkflowStorage::class;
14+
return 'workflow-storage';
1515
}
1616
}

src/Models/Workflow.php

+1-8
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,7 @@ class Workflow extends Model
1212
{
1313
use HasFactory;
1414

15-
protected $fillable = [
16-
'name',
17-
'marking_store_attribute',
18-
'type',
19-
'description',
20-
'supports',
21-
'metadata',
22-
];
15+
protected $guarded = ['id'];
2316

2417
protected $casts = [
2518
'supports' => 'array',

src/Models/WorkflowState.php

+1-7
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,7 @@ class WorkflowState extends Model
1111
{
1212
use HasFactory;
1313

14-
protected $fillable = [
15-
'workflow_id',
16-
'name',
17-
'initial_state',
18-
'final_state',
19-
'metadata',
20-
];
14+
protected $guarded = ['id'];
2115

2216
protected $casts = [
2317
'metadata' => 'array',

src/Models/WorkflowStateTransition.php

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@ class WorkflowStateTransition extends Model
1111
{
1212
use HasFactory;
1313

14-
protected $fillable = [
15-
'transition_id',
16-
'from_state_id',
17-
'metadata',
18-
];
14+
protected $guarded = ['id'];
1915

2016
protected $casts = [
2117
'metadata' => 'array',

src/Models/WorkflowTransition.php

+1-6
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,7 @@ class WorkflowTransition extends Model
1212
{
1313
use HasFactory;
1414

15-
protected $fillable = [
16-
'workflow_id',
17-
'from_state_id',
18-
'to_state_id',
19-
'metadata',
20-
];
15+
protected $guarded = ['id'];
2116

2217
protected $casts = [
2318
'metadata' => 'array',
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Soap\WorkflowStorage\Repositories;
4+
5+
use Soap\WorkflowStorage\Models\Workflow;
6+
7+
class WorkflowRepository
8+
{
9+
public function all()
10+
{
11+
return [];
12+
}
13+
14+
public function find($id)
15+
{
16+
//$workflow = Workflow::with(['transitions.stateTransitions', 'states'])->find($id);
17+
}
18+
}

src/WorkflowStorage.php

+23
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,31 @@ class WorkflowStorage
88
{
99
protected array $loaders = [];
1010

11+
public function __construct(?WorkflowLoader $loader)
12+
{
13+
if ($loader) {
14+
$this->registerLoader($loader);
15+
}
16+
}
17+
1118
public function registerLoader(WorkflowLoader $loader)
1219
{
1320
$this->loaders[$loader::class] = $loader;
1421
}
22+
23+
public function getLoader(string $loader): WorkflowLoader
24+
{
25+
return $this->loaders[$loader];
26+
}
27+
28+
public function all(): array
29+
{
30+
if (count($this->loaders) === 0) {
31+
return [];
32+
}
33+
34+
return collect($this->loaders)->mapWithKeys(function ($loader) {
35+
return [$loader::class => $loader->all()];
36+
})->toArray();
37+
}
1538
}

src/WorkflowStorageServiceProvider.php

+6-4
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,21 @@ public function configurePackage(Package $package): void
2424
'wf3_create_workflow_transitions_table',
2525
'wf4_create_workflow_state_transitions_table',
2626
])
27-
->hasCommand(WorkflowStorageListCommand::class);
27+
->hasCommand(WorkflowStorageListCommand::class)
28+
->publishesServiceProvider('WorkflowServiceProvider');
2829
}
2930

3031
public function packageRegistered()
3132
{
33+
$this->app->singleton('workflow-storage', function ($app) {
34+
$workflowStorage = new WorkflowStorage($app->make(DatabaseLoader::class));
35+
});
36+
3237
$this->app->singleton(DatabaseLoader::class, function ($app) {
3338
$config = $app->make('config')->get('workflow-storage.databaseLoader', []);
3439

3540
return new DatabaseLoader(config: $config);
3641
});
3742

38-
$this->app->singleton(WorkflowStorage::class, function ($app) {
39-
return new WorkflowStorage;
40-
});
4143
}
4244
}

tests/Feature/WorkflowStorageTest.php

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
use Soap\WorkflowStorage\Models\Workflow;
4+
5+
beforeEach(function () {
6+
7+
$workflow = Workflow::create([
8+
'name' => 'Test Workflow',
9+
'type' => 'workflow',
10+
'description' => 'Test Workflow Description',
11+
'supports' => [],
12+
'metadata' => [],
13+
]);
14+
15+
$draftState = $workflow->states()->create([
16+
'name' => 'draft',
17+
'metadata' => [],
18+
]);
19+
20+
$onReviewState = $workflow->states()->create([
21+
'name' => 'on review',
22+
'metadata' => [],
23+
]);
24+
25+
$approvedState = $workflow->states()->create([
26+
'name' => 'approved',
27+
'metadata' => [],
28+
]);
29+
30+
$rejectedState = $workflow->states()->create([
31+
'name' => 'rejected',
32+
'metadata' => [],
33+
]);
34+
35+
$onReviewTransition = $workflow->transitions()->create([
36+
'name' => 'submit',
37+
'to_state_id' => $onReviewState->id,
38+
'metadata' => [],
39+
]);
40+
41+
$onReviewTransition->fromStates()->create([
42+
'from_state_id' => $draftState->id,
43+
]);
44+
});
45+
46+
test('data can be retrieved from the database', function () {
47+
$workflow = Workflow::first();
48+
$states = $workflow->states;
49+
$transitions = $workflow->transitions;
50+
51+
expect($workflow->name)->toBe('Test Workflow');
52+
expect($workflow->type->value)->toBe('workflow');
53+
expect($workflow->description)->toBe('Test Workflow Description');
54+
expect($workflow->supports)->toBe([]);
55+
expect($workflow->metadata)->toBe([]);
56+
57+
expect($states->count())->toBe(4);
58+
expect($transitions->count())->toBe(1);
59+
});

0 commit comments

Comments
 (0)