Skip to content

Commit

Permalink
Merge pull request #1987 from bakaphp/integration-status-history
Browse files Browse the repository at this point in the history
[1.4] Integration status history
  • Loading branch information
arfenis committed Sep 17, 2024
2 parents 46310d8 + 4392e50 commit a3a76cc
Show file tree
Hide file tree
Showing 12 changed files with 317 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class () extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('entity_integration_history', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('apps_id')->default(0);
$table->string('entity_namespace');
$table->unsignedBigInteger('entity_id');
$table->unsignedBigInteger('integrations_company_id');
$table->unsignedBigInteger('status_id');
$table->text('response')->nullable();
$table->text('exception')->nullable();
$table->timestamps();
$table->tinyInteger('is_deleted')->default(0);

// Foreign key constraints
$table->foreign('integrations_company_id')->references('id')->on('integration_companies');
$table->foreign('status_id')->references('id')->on('status');

$table->index('entity_id', 'entity_id_index');
$table->index('status_id', 'status_id_index');
$table->index('integrations_company_id', 'integrations_company_id_index');
$table->index('apps_id', 'apps_id_index');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('entity_integration_history');
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@
use Kanvas\Inventory\Products\Models\Products;
use Kanvas\Workflow\Enums\IntegrationsEnum;
use Kanvas\Workflow\Enums\StatusEnum;
use Kanvas\Workflow\Integrations\Actions\AddEntityIntegrationHistoryAction;
use Kanvas\Workflow\Integrations\DataTransferObject\EntityIntegrationHistory;
use Kanvas\Workflow\Integrations\Models\IntegrationsCompany;
use Kanvas\Workflow\Integrations\Models\Status;
use Throwable;
use Workflow\Activity;

class ExportProductToShopifyActivity extends Activity
Expand All @@ -21,6 +24,7 @@ class ExportProductToShopifyActivity extends Activity
public function execute(Products $product, Apps $app, array $params): array
{
$response = [];
$exception = null;
$status = Status::where('slug', StatusEnum::ACTIVE->value)
->where('apps_id', 0)
->first();
Expand All @@ -43,15 +47,40 @@ public function execute(Products $product, Apps $app, array $params): array
warehouses: $warehouse
);

$response = $shopifyService->saveProduct($product, ShopifyStatusEnum::ACTIVE);
try {
$response = $shopifyService->saveProduct($product, ShopifyStatusEnum::ACTIVE);
$historyResponse = json_encode($response);
$status = Status::where('slug', StatusEnum::CONNECTED->value)
->where('apps_id', 0)
->first();
} catch (Throwable $exception) {
$status = Status::where('slug', StatusEnum::FAILED->value)
->where('apps_id', 0)
->first();
}

$dto = new EntityIntegrationHistory(
app: $app,
integrationCompany: $integrationCompany,
status: $status,
entity: $product,
response: $historyResponse ?? null,
exception: $exception
);

(new AddEntityIntegrationHistoryAction(
dto: $dto,
app: $app,
status: $status
))->execute();
}
}
}

return [
'company' => $product->company->getId(),
'product' => $product->getId(),
'shopify_response' => $response,
'shopify_response' => $response ?? [],
];
}
}
4 changes: 3 additions & 1 deletion src/Domains/Inventory/Products/Models/Products.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
use Kanvas\Inventory\Warehouses\Models\Warehouses;
use Kanvas\Social\Interactions\Traits\LikableTrait;
use Kanvas\Social\Tags\Traits\HasTagsTrait;
use Kanvas\Workflow\Contracts\EntityIntegrationInterface;
use Kanvas\Workflow\Contracts\IntegrationInterface;
use Kanvas\Workflow\Traits\CanUseWorkflow;
use Laravel\Scout\Searchable;

Expand All @@ -53,7 +55,7 @@
* @property string $published_at
* @property bool $is_deleted
*/
class Products extends BaseModel
class Products extends BaseModel implements EntityIntegrationInterface
{
use UuidTrait;
use SlugTrait;
Expand Down
3 changes: 2 additions & 1 deletion src/Domains/Inventory/Variants/Models/Variants.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
use Kanvas\Inventory\Variants\Actions\AddAttributeAction;
use Kanvas\Inventory\Warehouses\Models\Warehouses;
use Kanvas\Social\Interactions\Traits\SocialInteractionsTrait;
use Kanvas\Workflow\Contracts\EntityIntegrationInterface;
use Laravel\Scout\Searchable;

/**
Expand All @@ -49,7 +50,7 @@
* @property string barcode
* @property string serial_number
*/
class Variants extends BaseModel
class Variants extends BaseModel implements EntityIntegrationInterface
{
use SlugTrait;
use UuidTrait;
Expand Down
10 changes: 10 additions & 0 deletions src/Domains/Workflow/Contracts/EntityIntegrationInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace Kanvas\Workflow\Contracts;

interface EntityIntegrationInterface
{
public function getId(): mixed;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

declare(strict_types=1);

namespace Kanvas\Workflow\Integrations\Actions;

use Kanvas\Apps\Models\Apps;
use Kanvas\Workflow\Integrations\DataTransferObject\EntityIntegrationHistory;
use Kanvas\Workflow\Integrations\Models\EntityIntegrationHistory as ModelsEntityIntegrationHistory;
use Kanvas\Workflow\Integrations\Models\Status;

class AddEntityIntegrationHistoryAction
{
/**
* __construct.
*
* @return void
*/
public function __construct(
protected EntityIntegrationHistory $dto,
protected Apps $app,
protected Status $status
) {
}

/**
* execute.
*
* @return ModelsEntityIntegrationHistory
*/
public function execute(): ModelsEntityIntegrationHistory
{
$integrationHistory = new ModelsEntityIntegrationHistory();
$integrationHistory->entity_namespace = get_class($this->dto->entity);
$integrationHistory->entity_id = $this->dto->entity->getId();
$integrationHistory->apps_id = $this->app->getId();
$integrationHistory->integrations_company_id = $this->dto->integrationCompany->getId();
$integrationHistory->status_id = $this->dto->status->getId();
$integrationHistory->response = $this->dto->response;
$integrationHistory->exception = $this->dto->exception;

$integrationHistory->saveOrFail();
return $integrationHistory;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Kanvas\Workflow\Integrations\DataTransferObject;

use Baka\Contracts\AppInterface;
use Kanvas\Workflow\Contracts\EntityIntegrationInterface;
use Kanvas\Workflow\Integrations\Models\IntegrationsCompany;
use Kanvas\Workflow\Integrations\Models\Status;
use Spatie\LaravelData\Data;

class EntityIntegrationHistory extends Data
{
/**
* __construct.
*
* @return void
*/
public function __construct(
public AppInterface $app,
public IntegrationsCompany $integrationCompany,
public Status $status,
public EntityIntegrationInterface $entity,
public ?string $response = null,
public mixed $exception = null
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

declare(strict_types=1);

namespace Kanvas\Workflow\Integrations\Models;

use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Kanvas\Workflow\Models\BaseModel;
use Kanvas\Workflow\Models\Integrations;

class EntityIntegrationHistory extends BaseModel
{
protected $table = 'entity_integration_history';

protected $fillable = [
'entity_namespace',
'apps_id',
'entity_id',
'integrations_company_id',
'status_id',
'response',
'exception'
];

protected $casts = [
'is_deleted' => 'boolean',
];

public function integrationCompany(): BelongsTo
{
return $this->belongsTo(IntegrationsCompany::class, 'integrations_company_id');
}

public function entity(): BelongsTo
{
return $this->belongsTo($this->entity_class_name, 'entity_id');
}

public function status(): BelongsTo
{
return $this->belongsTo(Status::class, 'status_id');
}

public function setStatus(Status $status): void
{
$this->status_id = $status->getId();
$this->saveOrFail();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Baka\Casts\Json;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Kanvas\Companies\Models\Companies;
use Kanvas\Inventory\Regions\Models\Regions;
use Kanvas\Workflow\Enums\StatusEnum;
Expand Down Expand Up @@ -43,6 +44,11 @@ public function status(): BelongsTo
return $this->belongsTo(Status::class, 'status_id');
}

public function history(): HasMany
{
return $this->hasMany(EntityIntegrationHistory::class, 'integrations_company_id');
}

public function setStatus(Status $status): void
{
$this->status_id = $status->getId();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

declare(strict_types=1);

namespace Kanvas\Workflow\Integrations\Services;

use Baka\Contracts\AppInterface;
use Baka\Contracts\CompanyInterface;
use Kanvas\Inventory\Regions\Models\Regions;
use Kanvas\Workflow\Integrations\Models\IntegrationsCompany;
use Kanvas\Workflow\Models\Integrations;

class EntityIntegrationHistoryService
{
public function __construct(
protected AppInterface $app,
protected CompanyInterface $company
) {
}

/**
* Return the integrations history based on integration and/or region
*
* @param Integrations $integration
* @param Regions|null $region
* @return array
*/
public function getByIntegration(Integrations $integration, ?Regions $region = null): array
{
$integrationStatus = [];

$integrationsCompany = IntegrationsCompany::where('integrations_id', $integration->getId())
->where('companies_id', $this->company->getId())
->when($region, function ($query, $region) {
return $query->where('region_id', $region->getId());
})
->get();

foreach ($integrationsCompany as $integrationCompany) {
if ($integrationCompany->history()->where('apps_id', $this->app->getId())->exists()) {
$integrationStatus = array_merge(
$integrationStatus,
$integrationCompany->history->map(function ($history) {
return $history;
})->all()
);
};
}
return $integrationStatus;
}
}
Loading

0 comments on commit a3a76cc

Please sign in to comment.