<?php
/**
* Carcutter Data Platform
* Configuration Manager
*/
namespace App\CarCutter;
use League\Flysystem\FilesystemAdapter;
use League\Flysystem\Filesystem;
use League\Flysystem\Ftp\FtpAdapter;
use Pimcore\Model\DataObject\CustomerConfig;
use League\Flysystem\PhpseclibV3\SftpAdapter;
use League\Flysystem\PhpseclibV3\SftpConnectionProvider;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnAutoGestion;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnBee2Link;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnFTPSettings;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnKeplerVO;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnPlanetVO;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnHomeNet;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnMaxDigital;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnDAT;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnProMax;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnDealerSearch;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnDealersync;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnCarbase;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnWayke;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnFastback;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnAutoTelex;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnOpenFlex;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnWebhook;
use Pimcore\Model\DataObject\Fieldcollection\Data\ConnDealerCenter;
use Throwable;
class ConfigManager
{
public static function loadConfigByName(string $name) : ?CustomerConfig
{
$list = new CustomerConfig\Listing();
$list->setCondition('name = :name and enabled = 1', [
'name' => $name
]);
if($results = $list->load()) {
return $results[0];
}
return null;
}
public static function loadConfigByToken(string $token) : ?CustomerConfig
{
$list = new CustomerConfig\Listing();
$list->setCondition('token = :token and enabled = 1', [
'token' => $token
]);
if($results = $list->load()) {
return $results[0];
}
return null;
}
public static function loadAllConfigsByToken(string $token): array
{
$list = new CustomerConfig\Listing();
$list->setCondition('token = :token AND enabled = 1', [
'token' => $token
]);
return $list->load();
}
public static function loadValidConfigs() : array
{
$list = new CustomerConfig\Listing();
$list->setCondition('enabled = 1');
return $list->load();
}
public static function getUploadAdapter(CustomerConfig $config, string $type = '', bool $raw = false) : mixed
{
return self::getAdapter($config, ['out', 'bi'], $type, $raw);
}
public static function getProMaxAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnProMax::class, []);
if(count($availableConnections) > 0) {
return $availableConnections;
}
return null;
}
public static function getDealerCarSearchAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnDealerSearch::class, []);
echo count($availableConnections)." DealerCarSearch Files found\n";
if(count($availableConnections) > 0) {
return $availableConnections;
}
return null;
}
public static function getDealerSyncAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnDealersync::class, []);
// echo count($availableConnections)." DealerCarSearch Files found\n";
if(count($availableConnections) > 0) {
return $availableConnections;
}
return null;
}
public static function getDownloadAdapter(CustomerConfig $config, string $type = '', bool $raw = false) : ?FilesystemAdapter
{
return self::getAdapter($config, ['in', 'bi'], $type, $raw);
}
public static function getBeelinkAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnBee2Link::class, []);
if(count($availableConnections) > 0) {
return $availableConnections;
}
return null;
}
public static function getOpenFlexAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnOpenFlex::class, []);
if(count($availableConnections) > 0) {
return $availableConnections;
}
return null;
}
public static function getCarBaseAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnCarbase::class, []);
if(count($availableConnections) > 0) {
return $availableConnections;
}
return null;
}
public static function getWebhookAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnWebhook::class, []);
if(count($availableConnections) > 0) {
return $availableConnections;
}
return null;
}
public static function getFastbackAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnFastback::class, []);
if(count($availableConnections) > 0) {
echo count($availableConnections)." Fastback connections found\n";
return $availableConnections;
}
return null;
}
public static function getWaykeAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnWayke::class, []);
if(count($availableConnections) > 0) {
return $availableConnections;
}
return null;
}
public static function getDATAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnDAT::class, []);
if(count($availableConnections) > 0) {
echo count($availableConnections)." DAT connections found\n";
return $availableConnections;
}
return null;
}
public static function getPlanetVoAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnPlanetVO::class, []);
if(count($availableConnections) > 0)
{
echo count($availableConnections)." PVO connections found\n";
return $availableConnections;
}
return null;
}
public static function getAutoTelexAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnAutoTelex::class, []);
if(count($availableConnections) > 0)
{
echo count($availableConnections)." AutoTelex connections found\n";
return $availableConnections;
}
return null;
}
public static function getKeplerVOAdapter(CustomerConfig $config) : ?ConnKeplerVO
{
$availableConnections = self::getConnections($config, ConnKeplerVO::class, []);
if(count($availableConnections) > 0)
{
return array_pop($availableConnections);
}
return null;
}
public static function getHomeNetAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnHomeNet::class, []);
if(count($availableConnections) > 0)
{
return $availableConnections;
}
//echo "no HomeNet connections found\n";
return null;
}
public static function getMaxDigitalAdapter(CustomerConfig $config) : mixed
{
$availableConnections = self::getConnections($config, ConnMaxDigital::class, []);
if(count($availableConnections) > 0)
{
return $availableConnections;
}
//echo "no HomeNet connections found\n";
return null;
}
private static function getAdapter(CustomerConfig $config, array $directions, string $type = '', bool $raw = false) : mixed
{
$availableConnections = self::getConnections($config, $type, $directions);
if(count($availableConnections) > 0) {
$probe = array_pop($availableConnections);
if(!$raw && $probe::class === ConnFTPSettings::class)
{
return self::getFtpAdapter($probe);
}
elseif ($raw && $probe::class === ConnFTPSettings::class)
{
return $probe;
}
}
return null;
}
public static function getFtpAdapter(ConnFTPSettings $config) : ?FtpAdapter
{
return new FtpAdapter(
// Connection options
\League\Flysystem\Ftp\FtpConnectionOptions::fromArray([
'host' => $config->getHostName(), // required
'root' => $config->getBaseFolder(), // required
'username' => $config->getUser(), // required
'password' => $config->getPassword(), // required
'port' => intval($config->getPort()),
'ssl' => $config->getSsl(),
'timeout' => 90,
'utf8' => $config->getUseUtf(),
'passive' => true,
'transferMode' => FTP_BINARY,
'systemType' => null, // 'windows' or 'unix'
'ignorePassiveAddress' => $config->getIgnorePassiveAddress(), // true or false
'timestampsOnUnixListingsEnabled' => false, // true or false
'recurseManually' => true // true
])
);
}
public static function getOpenSshKeyContent(): string
{
// Your Ed25519 key in OpenSSH format
return '
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBsrD0ryU8Z6Kpxqp+oqq1l8IazPkIgBSu4dAPmDUjWywAAAJAsMenSLDHp
0gAAAAtzc2gtZWQyNTUxOQAAACBsrD0ryU8Z6Kpxqp+oqq1l8IazPkIgBSu4dAPmDUjWyw
AAAEAOggxruNr75XIGp8lF0g7SMUt/WnIs8/foHcpD4aX47WysPSvJTxnoqnGqn6iqrWXw
hrM+QiAFK7h0A+YNSNbLAAAACmNhcmNlbnRyYWwBAgM=
-----END OPENSSH PRIVATE KEY-----
';
}
public static function findLatestDealerCenterFile(Filesystem $filesystem, string $dealerId): ?string
{
try {
$files = $filesystem->listContents('/', false);
$dealerCenterFiles = [];
foreach ($files as $file) {
$fileName = basename($file->path());
if ($file->isFile() && preg_match("/^DealerCenter_(\d{8})_{$dealerId}\.csv$/", $fileName, $matches)) {
$dealerCenterFiles[$matches[1]] = $file->path();
}
}
if (empty($dealerCenterFiles)) {
echo "No DealerCenter files found for dealer ID: $dealerId\n";
return null;
}
// Get the latest file by date
ksort($dealerCenterFiles);
$latestDate = array_key_last($dealerCenterFiles);
$latestFile = $dealerCenterFiles[$latestDate];
echo "Found latest DealerCenter file: $latestFile (date: $latestDate)\n";
return $latestFile;
} catch (Exception $e) {
echo "Error finding DealerCenter files: " . $e->getMessage() . "\n";
return null;
}
}
public static function getSftpAdapter(array $config): ?SftpAdapter
{
try {
// to be handled such that it takes token / client type and rerturn respective key
// $inst = new self();
// $privateKey = self::getOpenSshKeyContent();
print_r($config['user']);
$connectionProvider = new SftpConnectionProvider(
$config['host'],
$config['user'],
$config['password'] ?: null,
$config['openssh_key'] ?: null,
null ,
intval($config['port'] ?: 22),
false, // use agent
30, // timeout
10, // max tries
null, // host fingerprint
null // connectivity checker
);
$adapter = new SftpAdapter(
$connectionProvider,
'/'
);
// ✅ Verify connectivity by trying a simple operation
$filesystem = new Filesystem($adapter);
$filesystem->listContents('.', false);
// echo" File system -> "+$filesystem;
return $adapter;
} catch (Throwable $e) {
// ❌ Handle connection/adapter errors gracefully
error_log("SFTP connection failed: " . $e->getMessage());
echo "❌ Error: " . $e->getMessage() . PHP_EOL;
print_r($e->getTrace());
return null; // or throw new \RuntimeException("SFTP Error: " . $e->getMessage());
}
}
public static function getConnections(CustomerConfig $config, string $type = '', array $directions) : mixed
{
$connections = $config->getConnections();
if($connections->getCount() === 0) {
return [];
}
$connItems = $connections->getItems();
$availableConnections = array_filter($connItems, function($c) use ($type, $directions) {
if($type === '' || $c::class === $type) {
if(method_exists($c, 'getDirection')) {
if(in_array($c->getDirection(), $directions)) {
return true;
}
} else {
return true;
}
}
return false;
});
return $availableConnections;
}
public static function getDealerCenterAdapter($config): array
{
$connections = $config->getConnections();
$dealerCenterConnections = [];
if ($connections) {
foreach ($connections->getItems() as $item) {
if ($item instanceof ConnDealerCenter) {
$dealerCenterConnections[] = $item;
}
}
}
return $dealerCenterConnections;
}
}