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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 2 additions & 2 deletions
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
}
Lines changed: 23 additions & 0 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 8 deletions
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

Lines changed: 1 addition & 7 deletions
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

Lines changed: 1 addition & 5 deletions
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

Lines changed: 1 addition & 6 deletions
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',
Lines changed: 18 additions & 0 deletions
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

Lines changed: 23 additions & 0 deletions
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

Lines changed: 6 additions & 4 deletions
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

Lines changed: 59 additions & 0 deletions
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)