From 88ae5711127ac1c7df20d52501b38b49dfb489f4 Mon Sep 17 00:00:00 2001
From: Ulf Tietze <u.tietze@neusta.de>
Date: Sat, 1 Jun 2019 12:06:21 +0200
Subject: [PATCH] Introduce Export Definition to Dump Entries

---
 Api/ExportInterface.php           | 16 ++++++++++++
 Api/StrategyInterface.php         | 12 +++++++++
 Api/StrategyProviderInterface.php | 17 +++++++++++++
 Model/Strategy/ExportToModule.php | 18 +++++++++++++
 Model/Strategy/ExportToVar.php    | 18 +++++++++++++
 Model/Strategy/Provider.php       | 42 +++++++++++++++++++++++++++++++
 etc/di.xml                        | 20 +++++++++++++++
 7 files changed, 143 insertions(+)
 create mode 100644 Api/ExportInterface.php
 create mode 100644 Api/StrategyInterface.php
 create mode 100644 Api/StrategyProviderInterface.php
 create mode 100644 Model/Strategy/ExportToModule.php
 create mode 100644 Model/Strategy/ExportToVar.php
 create mode 100644 Model/Strategy/Provider.php

diff --git a/Api/ExportInterface.php b/Api/ExportInterface.php
new file mode 100644
index 0000000..43e82e2
--- /dev/null
+++ b/Api/ExportInterface.php
@@ -0,0 +1,16 @@
+<?php
+declare(strict_types=1);
+
+namespace Firegento\ContentProvisioning\Api;
+
+use Firegento\ContentProvisioning\Api\Data\EntryInterface;
+
+interface ExportInterface
+{
+    /**
+     * @param StrategyInterface $strategy
+     * @param EntryInterface    $entry
+     * @return void
+     */
+    public function execute(StrategyInterface $strategy, EntryInterface $entry): void;
+}
\ No newline at end of file
diff --git a/Api/StrategyInterface.php b/Api/StrategyInterface.php
new file mode 100644
index 0000000..9fb3a23
--- /dev/null
+++ b/Api/StrategyInterface.php
@@ -0,0 +1,12 @@
+<?php
+declare(strict_types=1);
+
+namespace Firegento\ContentProvisioning\Api;
+
+interface StrategyInterface
+{
+    /**
+     * @return string
+     */
+    public function getTargetPath(): string;
+}
\ No newline at end of file
diff --git a/Api/StrategyProviderInterface.php b/Api/StrategyProviderInterface.php
new file mode 100644
index 0000000..1e1e9fd
--- /dev/null
+++ b/Api/StrategyProviderInterface.php
@@ -0,0 +1,17 @@
+<?php
+declare(strict_types=1);
+
+namespace Firegento\ContentProvisioning\Api;
+
+use Magento\Framework\Exception\NotFoundException;
+
+interface StrategyProviderInterface
+{
+    /**
+     * @param string $strategyCode
+     * @return StrategyInterface
+     *
+     * @throws NotFoundException
+     */
+    public function get(string $strategyCode): StrategyInterface;
+}
\ No newline at end of file
diff --git a/Model/Strategy/ExportToModule.php b/Model/Strategy/ExportToModule.php
new file mode 100644
index 0000000..05e6ae5
--- /dev/null
+++ b/Model/Strategy/ExportToModule.php
@@ -0,0 +1,18 @@
+<?php
+declare(strict_types=1);
+
+namespace Firegento\ContentProvisioning\Model\Strategy;
+
+use Firegento\ContentProvisioning\Api\StrategyInterface;
+
+class ExportToModule implements StrategyInterface
+{
+
+    /**
+     * @return string
+     */
+    public function getTargetPath(): string
+    {
+        // TODO: Implement getTargetPath() method.
+    }
+}
\ No newline at end of file
diff --git a/Model/Strategy/ExportToVar.php b/Model/Strategy/ExportToVar.php
new file mode 100644
index 0000000..ea91dd4
--- /dev/null
+++ b/Model/Strategy/ExportToVar.php
@@ -0,0 +1,18 @@
+<?php
+declare(strict_types=1);
+
+namespace Firegento\ContentProvisioning\Model\Strategy;
+
+use Firegento\ContentProvisioning\Api\StrategyInterface;
+
+class ExportToVar implements StrategyInterface
+{
+
+    /**
+     * @return string
+     */
+    public function getTargetPath(): string
+    {
+        // TODO: Implement getTargetPath() method.
+    }
+}
\ No newline at end of file
diff --git a/Model/Strategy/Provider.php b/Model/Strategy/Provider.php
new file mode 100644
index 0000000..d407feb
--- /dev/null
+++ b/Model/Strategy/Provider.php
@@ -0,0 +1,42 @@
+<?php
+declare(strict_types=1);
+
+namespace Firegento\ContentProvisioning\Model\Strategy;
+
+use Firegento\ContentProvisioning\Api\StrategyInterface;
+use Firegento\ContentProvisioning\Api\StrategyProviderInterface;
+use Magento\Framework\Exception\NotFoundException;
+
+class Provider implements StrategyProviderInterface
+{
+    /**
+     * @var array|StrategyInterface[]
+     */
+    private $strategies;
+
+    /**
+     * Provider constructor.
+     * @param StrategyInterface[] $strategies
+     */
+    public function __construct(array $strategies)
+    {
+        $this->strategies = $strategies;
+    }
+
+    /**
+     * @param string $strategyCode
+     * @return StrategyInterface
+     *
+     * @throws NotFoundException
+     */
+    public function get(string $strategyCode): StrategyInterface
+    {
+        $strategy = $this->strategies[$strategyCode] ?? null;
+
+        if (!$strategy) {
+            throw new NotFoundException(__('Strategy %s not found.', $strategyCode));
+        }
+
+        return $strategy;
+    }
+}
\ No newline at end of file
diff --git a/etc/di.xml b/etc/di.xml
index 18cd8df..9442de5 100644
--- a/etc/di.xml
+++ b/etc/di.xml
@@ -105,4 +105,24 @@
             </argument>
         </arguments>
     </type>
+
+    <preference
+        for="Firegento\ContentProvisioning\Api\StrategyProviderInterface"
+        type="Firegento\ContentProvisioning\Model\Strategy\Provider"
+    />
+
+    <preference
+        for="Firegento\ContentProvisioning\Api\ExportInterface"
+        type="Firegento\ContentProvisioning\Model\Command\ExportEntry"
+    />
+
+    <type name="Firegento\ContentProvisioning\Model\Strategy\Provider">
+        <arguments>
+            <argument name="strategies" xsi:type="array">
+                <item name="export_to_module" xsi:type="object">Firegento\ContentProvisioning\Model\Strategy\ExportToModule</item>
+                <item name="export_to_var" xsi:type="object">Firegento\ContentProvisioning\Model\Strategy\ExportToVar</item>
+            </argument>
+        </arguments>
+    </type>
+
 </config>
-- 
GitLab