Skip to content

Develop #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions config/workflow_loader.php
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
<?php

return [
'databaseLoader' => [
'tableNames' => [
'workflows' => 'workflows',
'workflow_states' => 'workflow_states',
'workflow_transitions' => 'workflow_transitions',
'workflow_state_transitions' => 'workflow_state_transitions',
'loaders' => [
'database' => [
'tableNames' => [
'workflows' => 'workflows',
'workflow_states' => 'workflow_states',
'workflow_transitions' => 'workflow_transitions',
'workflow_state_transitions' => 'workflow_state_transitions',
],
'class' => \Soap\WorkflowLoader\DatabaseLoader::class,
],
'loaderClass' => \Soap\WorkflowLoader\DatabaseLoader::class,
],
];
9 changes: 6 additions & 3 deletions database/migrations/wf1_create_workflows_table.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,23 @@
{
public function up()
{
Schema::create('workflows', function (Blueprint $table) {
$tableName = app(\Soap\WorkflowLoader\DatabaseLoader::class)->getWorkflowTableName();
Schema::create($tableName, function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('marking_store_attribute')->nullable()->comment('name of marking store attribute');
$table->text('marking_store')->nullable()->comment('marking store as array');
$table->string('type')->default('workflow')->comment('workflow or state_machine');
$table->text('description')->nullable();
$table->json('supports')->nullable()->comment('support models');
$table->json('metadata')->nullable()->comment('metadata');
$table->boolean('active')->default(true);
$table->timestamps();
});
}

public function down()
{
Schema::dropIfExists('workflows');
$tableName = app(\Soap\WorkflowLoader\DatabaseLoader::class)->getWorkflowTableName();
Schema::dropIfExists($tableName);
}
};
6 changes: 4 additions & 2 deletions database/migrations/wf2_create_workflow_states_table.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
{
public function up()
{
Schema::create('workflow_states', function (Blueprint $table) {
$tableName = app(\Soap\WorkflowLoader\DatabaseLoader::class)->getWorkflowStateTableName();
Schema::create($tableName, function (Blueprint $table) {
$table->id();
$table->string('name');
$table->tinyInteger('initial_state')->default(0)->comment('initial state');
Expand All @@ -21,6 +22,7 @@ public function up()

public function down()
{
Schema::dropIfExists('workflow_states');
$tableName = app(\Soap\WorkflowLoader\DatabaseLoader::class)->getWorkflowStateTableName();
Schema::dropIfExists($tableName);
}
};
6 changes: 4 additions & 2 deletions database/migrations/wf3_create_workflow_transitions_table.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
{
public function up()
{
Schema::create('workflow_transitions', function (Blueprint $table) {
$tableName = app(\Soap\WorkflowLoader\DatabaseLoader::class)->getWorkflowTransitionTableName();
Schema::create($tableName, function (Blueprint $table) {
$table->id();
$table->string('name');
$table->foreignId('to_state_id')->constrained('workflow_states')->onDelete('cascade');
Expand All @@ -20,6 +21,7 @@ public function up()

public function down()
{
Schema::dropIfExists('workflow_transitions');
$tableName = app(\Soap\WorkflowLoader\DatabaseLoader::class)->getWorkflowTransitionTableName();
Schema::dropIfExists($tableName);
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
{
public function up()
{
Schema::create('workflow_state_transitions', function (Blueprint $table) {
$tableName = app(\Soap\WorkflowLoader\DatabaseLoader::class)->getWorkflowStateTransitionTableName();
Schema::create($tableName, function (Blueprint $table) {
$table->id();
$table->foreignId('workflow_transition_id')->constrained('workflow_transitions')->onDelete('cascade');
$table->foreignId('from_state_id')->constrained('workflow_states')->onDelete('cascade');
Expand All @@ -19,6 +20,7 @@ public function up()

public function down()
{
Schema::dropIfExists('workflow_state_transitions');
$tableName = app(\Soap\WorkflowLoader\DatabaseLoader::class)->getWorkflowStateTransitionTableName();
Schema::dropIfExists($tableName);
}
};
14 changes: 5 additions & 9 deletions resources/stubs/WorkflowServiceProvider.php.stub
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,17 @@
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Soap\WorkflowLoader\DatabaseLoader;

class WorkflowServiceProvider extends ServiceProvider
{
public function register()
{

}
public function register() {}

public function boot()
{
$registy = app()->make('workflow');
$workflowLoader = app()->make('workflow-loader');
foreach ($wokflowLoader->all() as $workflow => $config) {
$registy->addFromArray($workflow, $config);
$registry = app()->make('workflow');
$workflowLoaderRegistry = app()->make('workflowLoaderRegistry');
foreach ($workflowLoaderRegistry->all() as $workflow => $config) {
$registry->addFromArray($workflow, $config);
}
}
}
13 changes: 8 additions & 5 deletions src/DatabaseLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,15 @@ class DatabaseLoader implements WorkflowDatabaseLoader
*/
protected $config;

public function __construct(?array $config)
protected $repo;

public function __construct(?array $config, WorkflowRepository $repo)
{
if (! isset($config[self::KEY_TABLE_NAMES])) {
throw new \InvalidArgumentException('Table names not found in config');
}
$this->config = $config;
$this->repo = $repo;
}

public function getTableNames(): array
Expand Down Expand Up @@ -54,15 +57,15 @@ public function getWorkflowStateTransitionTableName(): string

public function load(string $workflowName): array
{
$repo = app()->make(WorkflowRepository::class);
//$repo = app()->make(WorkflowRepository::class);

return $repo->findByName($workflowName);
return $this->repo->findByName($workflowName);
}

public function all(): array
{
$repo = app()->make(WorkflowRepository::class);
//$repo = app()->make(WorkflowRepository::class);

return $repo->all();
return $this->repo->all();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
/**
* @see \Soap\WorkflowLoader\WorkflowLoader
*/
class WorkflowLoader extends Facade
class WorkflowLoaderRegistry extends Facade
{
protected static function getFacadeAccessor(): string
{
return \Soap\WorkflowLoader\WorkflowLoader::class;
return 'workflowLoaderRegistry';
}
}
1 change: 1 addition & 0 deletions src/Models/Workflow.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class Workflow extends Model
protected $casts = [
'supports' => 'array',
'metadata' => 'array',
'marking_store' => 'array',
'type' => WorkflowTypeEnum::class,
];

Expand Down
20 changes: 11 additions & 9 deletions src/Repositories/WorkflowRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,19 +50,21 @@ protected function makeWorkflowCofig($workflow): array
return $state->name;
})->toArray();

$transitions = $workflow->transitions->map(function ($transition) {
return [
$transition->name => [
'from' => $transition->fromStates->map(function ($transitionState) {
return $transitionState->fromState->name;
})->toArray(),
'to' => $transition->toState->name,
],
$transitions = [];
foreach ($workflow->transitions as $transition) {
$transitions[$transition->name] = [
'from' => $transition->fromStates->map(function ($transitionState) {
return $transitionState->fromState->name;
})->toArray(),
'to' => $transition->toState->name,
];
})->toArray();
}

return [
$workflow->name => [
'marking_store' => $workflow->marking_store ?? [],
'type' => $workflow->type ? $workflow->type->value : 'workflow',
'metadata' => $workflow->metadata,
'supports' => $workflow->supports,
'places' => $places,
'transitions' => $transitions,
Expand Down
41 changes: 0 additions & 41 deletions src/WorkflowLoader.php

This file was deleted.

59 changes: 59 additions & 0 deletions src/WorkflowLoaderRegistry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

namespace Soap\WorkflowLoader;

use Soap\WorkflowLoader\Contracts\WorkflowLoader as WorkflowLoaderContract;

class WorkflowLoaderRegistry
{
protected array $loaders = [];

public function __construct(array $loaders)
{
foreach ($loaders as $key => $loader) {
if (! isset($loader['class'])) {
throw new \Exception("Key 'class' configuration not found in {$key} loader");
}

if (! class_exists($loader['class'])) {
throw new \Exception("Class {$loader['class']} not found");
}
$this->registerLoader($key, app()->make($loader['class']));
}
}

public function registerLoader(string $name, WorkflowLoaderContract $loader)
{
$this->loaders[$name] = $loader;
}

public function getLoaders(): array
{
return $this->loaders;
}

public function getLoader(string $name): WorkflowLoaderContract
{
if (! isset($this->loaders[$name])) {
throw new \Exception("Loader {$name} not found");
}

return $this->loaders[$name];
}

public function all(): array
{
if (count($this->loaders) === 0) {
return [];
}

$workflows = [];
foreach ($this->loaders as $name => $loader) {
foreach ($loader->all() as $workflow => $config) {
$workflows[$workflow] = $config;
}
}

return $workflows;
}
}
12 changes: 8 additions & 4 deletions src/WorkflowLoaderServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,14 @@ public function packageRegistered()
{
$this->app->when(\Soap\WorkflowLoader\DatabaseLoader::class)
->needs('$config')
->give(config('workflow_loader.databaseLoader'));
->give($this->app->make('config')->get('workflow_loader.loaders.database'));

$this->app->singleton('workflow-loader', function ($app) {
$workflowLoader = new WorkflowLoader($app->make(\Soap\WorkflowLoader\DatabaseLoader::class));
});
$this->app->when(\Soap\WorkflowLoader\WorkflowLoaderRegistry::class)
->needs('$loaders')
->give($this->app->make('config')->get('workflow_loader.loaders'));

$this->app->bind(\Soap\WorkflowLoader\Contracts\WorkflowDatabaseLoader::class, \Soap\WorkflowLoader\DatabaseLoader::class);

$this->app->singleton('workflowLoaderRegistry', \Soap\WorkflowLoader\WorkflowLoaderRegistry::class);
}
}