Skip to content
Open
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
26 changes: 26 additions & 0 deletions Api/Data/PromptRuleInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Api\Data;

interface PromptRuleInterface
{
public const RULE_ID = 'rule_id';
public const NAME = 'name';
public const ATTRIBUTE_CODE = 'attribute_code';
public const STORE_IDS = 'store_ids';
public const CONDITIONS_SERIALIZED = 'conditions_serialized';
public const PROMPT = 'prompt';
public const PRIORITY = 'priority';
public const IS_ACTIVE = 'is_active';

public function getRuleId(): ?int;
public function getName(): string;
public function getAttributeCode(): string;
public function getStoreIds(): string;
public function getConditionsSerialized(): ?string;
public function getPrompt(): string;
public function getPriority(): int;
public function getIsActive(): bool;
}
37 changes: 37 additions & 0 deletions Block/Adminhtml/PromptRule/Edit/DeleteButton.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Block\Adminhtml\PromptRule\Edit;

use Magento\Framework\App\RequestInterface;
use Magento\Framework\UrlInterface;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;

class DeleteButton implements ButtonProviderInterface
{
public function __construct(
private readonly RequestInterface $request,
private readonly UrlInterface $urlBuilder
) {
}

public function getButtonData(): array
{
$ruleId = (int)$this->request->getParam('rule_id');
if (!$ruleId) {
return [];
}

return [
'label' => __('Delete Rule'),
'class' => 'delete',
'on_click' => sprintf(
"deleteConfirm('%s', '%s', {data: {}})",
__('Are you sure you want to delete this rule?'),
$this->urlBuilder->getUrl('*/*/delete', ['rule_id' => $ruleId])
),
'sort_order' => 20,
];
}
}
23 changes: 23 additions & 0 deletions Block/Adminhtml/PromptRule/Edit/SaveButton.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Block\Adminhtml\PromptRule\Edit;

use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;

class SaveButton implements ButtonProviderInterface
{
public function getButtonData(): array
{
return [
'label' => __('Save Rule'),
'class' => 'save primary',
'data_attribute' => [
'mage-init' => ['button' => ['event' => 'save']],
'form-role' => 'save',
],
'sort_order' => 90,
];
}
}
52 changes: 52 additions & 0 deletions Controller/Adminhtml/PromptRule/Delete.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Controller\Adminhtml\PromptRule;

use Magento\Backend\App\Action;
use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\Controller\Result\Redirect;
use MageOS\CatalogDataAI\Model\PromptRuleFactory;
use MageOS\CatalogDataAI\Model\ResourceModel\PromptRule as PromptRuleResource;

class Delete extends Action implements HttpGetActionInterface
{
public const ADMIN_RESOURCE = 'MageOS_CatalogDataAI::prompt_rules';

public function __construct(
Action\Context $context,
private readonly PromptRuleFactory $ruleFactory,
private readonly PromptRuleResource $ruleResource
) {
parent::__construct($context);
}

public function execute(): Redirect
{
$ruleId = (int)$this->getRequest()->getParam('rule_id');
$redirect = $this->resultRedirectFactory->create()->setPath('*/*/');

if (!$ruleId) {
$this->messageManager->addErrorMessage(__('Rule ID is required.'));
return $redirect;
}

$rule = $this->ruleFactory->create();
$this->ruleResource->load($rule, $ruleId);

if (!$rule->getRuleId()) {
$this->messageManager->addErrorMessage(__('This rule no longer exists.'));
return $redirect;
}

try {
$this->ruleResource->delete($rule);
$this->messageManager->addSuccessMessage(__('The rule has been deleted.'));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage($e->getMessage());
}

return $redirect;
}
}
48 changes: 48 additions & 0 deletions Controller/Adminhtml/PromptRule/Edit.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Controller\Adminhtml\PromptRule;

use Magento\Backend\App\Action;
use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\View\Result\Page;
use Magento\Framework\View\Result\PageFactory;
use MageOS\CatalogDataAI\Model\PromptRuleFactory;
use MageOS\CatalogDataAI\Model\ResourceModel\PromptRule as PromptRuleResource;

class Edit extends Action implements HttpGetActionInterface
{
public const ADMIN_RESOURCE = 'MageOS_CatalogDataAI::prompt_rules';

public function __construct(
Action\Context $context,
private readonly PageFactory $resultPageFactory,
private readonly PromptRuleFactory $ruleFactory,
private readonly PromptRuleResource $ruleResource
) {
parent::__construct($context);
}

public function execute(): Page
{
$ruleId = (int)$this->getRequest()->getParam('rule_id');
$rule = $this->ruleFactory->create();

if ($ruleId) {
$this->ruleResource->load($rule, $ruleId);
if (!$rule->getRuleId()) {
$this->messageManager->addErrorMessage(__('This rule no longer exists.'));
return $this->resultRedirectFactory->create()->setPath('*/*/');
}
}

$resultPage = $this->resultPageFactory->create();
$resultPage->setActiveMenu('MageOS_CatalogDataAI::prompt_rules');
$resultPage->getConfig()->getTitle()->prepend(
$ruleId ? __('Edit Rule: %1', $rule->getName()) : __('New Prompt Rule')
);

return $resultPage;
}
}
30 changes: 30 additions & 0 deletions Controller/Adminhtml/PromptRule/Index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Controller\Adminhtml\PromptRule;

use Magento\Backend\App\Action;
use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\View\Result\Page;
use Magento\Framework\View\Result\PageFactory;

class Index extends Action implements HttpGetActionInterface
{
public const ADMIN_RESOURCE = 'MageOS_CatalogDataAI::prompt_rules';

public function __construct(
Action\Context $context,
private readonly PageFactory $resultPageFactory
) {
parent::__construct($context);
}

public function execute(): Page
{
$resultPage = $this->resultPageFactory->create();
$resultPage->setActiveMenu('MageOS_CatalogDataAI::prompt_rules');
$resultPage->getConfig()->getTitle()->prepend(__('AI Prompt Rules'));
return $resultPage;
}
}
40 changes: 40 additions & 0 deletions Controller/Adminhtml/PromptRule/MassDelete.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Controller\Adminhtml\PromptRule;

use Magento\Backend\App\Action;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\Controller\Result\Redirect;
use Magento\Ui\Component\MassAction\Filter;
use MageOS\CatalogDataAI\Model\ResourceModel\PromptRule as PromptRuleResource;
use MageOS\CatalogDataAI\Model\ResourceModel\PromptRule\CollectionFactory;

class MassDelete extends Action implements HttpPostActionInterface
{
public const ADMIN_RESOURCE = 'MageOS_CatalogDataAI::prompt_rules';

public function __construct(
Action\Context $context,
private readonly Filter $filter,
private readonly CollectionFactory $collectionFactory,
private readonly PromptRuleResource $ruleResource
) {
parent::__construct($context);
}

public function execute(): Redirect
{
$collection = $this->filter->getCollection($this->collectionFactory->create());
$deleted = 0;

foreach ($collection as $rule) {
$this->ruleResource->delete($rule);
$deleted++;
}

$this->messageManager->addSuccessMessage(__('A total of %1 rule(s) have been deleted.', $deleted));
return $this->resultRedirectFactory->create()->setPath('*/*/');
}
}
19 changes: 19 additions & 0 deletions Controller/Adminhtml/PromptRule/NewAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Controller\Adminhtml\PromptRule;

use Magento\Backend\App\Action;
use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\Controller\ResultFactory;

class NewAction extends Action implements HttpGetActionInterface
{
public const ADMIN_RESOURCE = 'MageOS_CatalogDataAI::prompt_rules';

public function execute()
{
return $this->resultFactory->create(ResultFactory::TYPE_FORWARD)->forward('edit');
}
}
60 changes: 60 additions & 0 deletions Controller/Adminhtml/PromptRule/Preview.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

declare(strict_types=1);

namespace MageOS\CatalogDataAI\Controller\Adminhtml\PromptRule;

use Magento\Backend\App\Action;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\Controller\Result\JsonFactory;
use MageOS\CatalogDataAI\Model\Product\Enricher;

class Preview extends Action implements HttpPostActionInterface
{
public const ADMIN_RESOURCE = 'MageOS_CatalogDataAI::prompt_rules';

public function __construct(
Action\Context $context,
private readonly JsonFactory $jsonFactory,
private readonly ProductRepositoryInterface $productRepository,
private readonly Enricher $enricher
) {
parent::__construct($context);
}

public function execute()
{
$result = $this->jsonFactory->create();
$sku = $this->getRequest()->getParam('sku');
$prompt = $this->getRequest()->getParam('prompt');

if (!$sku || !$prompt) {
return $result->setData([
'success' => false,
'message' => 'SKU and prompt are required.',
]);
}

try {
$product = $this->productRepository->get($sku);
$resolvedPrompt = $this->enricher->parsePrompt($prompt, $product);

return $result->setData([
'success' => true,
'resolved_prompt' => $resolvedPrompt,
'product_name' => $product->getName(),
]);
} catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
return $result->setData([
'success' => false,
'message' => sprintf('Product with SKU "%s" not found.', $sku),
]);
} catch (\Exception $e) {
return $result->setData([
'success' => false,
'message' => $e->getMessage(),
]);
}
}
}
Loading
Loading