- Refactored `listLinkedOffersByIntegration` to `paginateLinkedOffersByIntegration` in `MarketplaceRepository`. - Added pagination support with `page` and `per_page` filters. - Introduced sorting options for offers. - Created `listOfferChannelsByIntegration` method to retrieve distinct sales channels. - Enhanced SQL queries to support dynamic filtering based on provided parameters. feat: Add new fields for products and SKU generation - Introduced new fields: `new_to_date`, `additional_message`, `additional_message_required`, and `additional_message_text` in the `products` table. - Added `findAllSkus` method in `ProductRepository` to retrieve all SKUs. - Created `ProductSkuGenerator` class to handle SKU generation based on a configurable format. - Implemented `nextSku` method to generate the next available SKU. feat: Enhance product settings management in the UI - Added new settings page for product SKU format in `SettingsController`. - Implemented form handling for saving SKU format settings. - Updated the view to include SKU format configuration options. feat: Implement cron job for refreshing ShopPro offer titles - Created `ShopProOfferTitlesRefreshHandler` to handle the cron job for refreshing offer titles. - Integrated with the `OfferImportService` to import offers from ShopPro. docs: Update database schema documentation - Added documentation for new fields in the `products` table and new cron job for offer title refresh. - Documented the purpose and structure of the `app_settings` table. migrations: Add necessary migrations for new features - Created migration to add `products_sku_format` setting in `app_settings`. - Added migration to introduce new fields in the `products` table. - Created migration for the new cron job schedule for refreshing ShopPro offer titles.
91 lines
2.9 KiB
PHP
91 lines
2.9 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
use App\Core\Database\ConnectionFactory;
|
|
use App\Core\Support\Env;
|
|
use App\Modules\Cron\CronJobProcessor;
|
|
use App\Modules\Cron\CronJobRepository;
|
|
use App\Modules\Cron\CronJobType;
|
|
use App\Modules\Cron\ProductLinksHealthCheckHandler;
|
|
use App\Modules\Cron\ShopProOfferTitlesRefreshHandler;
|
|
use App\Modules\ProductLinks\ChannelOffersRepository;
|
|
use App\Modules\ProductLinks\OfferImportService;
|
|
use App\Modules\ProductLinks\ProductLinksRepository;
|
|
use App\Modules\Settings\IntegrationRepository;
|
|
use App\Modules\Settings\ShopProClient;
|
|
|
|
$basePath = dirname(__DIR__);
|
|
$vendorAutoload = $basePath . '/vendor/autoload.php';
|
|
|
|
if (is_file($vendorAutoload)) {
|
|
require $vendorAutoload;
|
|
} else {
|
|
spl_autoload_register(static function (string $class) use ($basePath): void {
|
|
$prefix = 'App\\';
|
|
if (!str_starts_with($class, $prefix)) {
|
|
return;
|
|
}
|
|
|
|
$relative = substr($class, strlen($prefix));
|
|
$file = $basePath . '/src/' . str_replace('\\', '/', $relative) . '.php';
|
|
if (is_file($file)) {
|
|
require $file;
|
|
}
|
|
});
|
|
}
|
|
|
|
Env::load($basePath . '/.env');
|
|
|
|
/** @var array<string, mixed> $dbConfig */
|
|
$dbConfig = require $basePath . '/config/database.php';
|
|
/** @var array<string, mixed> $appConfig */
|
|
$appConfig = require $basePath . '/config/app.php';
|
|
|
|
$limit = 20;
|
|
foreach ($argv as $argument) {
|
|
if (!str_starts_with((string) $argument, '--limit=')) {
|
|
continue;
|
|
}
|
|
|
|
$limitValue = (int) substr((string) $argument, strlen('--limit='));
|
|
if ($limitValue > 0) {
|
|
$limit = min(200, $limitValue);
|
|
}
|
|
}
|
|
|
|
try {
|
|
$pdo = ConnectionFactory::make($dbConfig);
|
|
|
|
$cronJobs = new CronJobRepository($pdo);
|
|
$processor = new CronJobProcessor($cronJobs);
|
|
|
|
$integrationRepository = new IntegrationRepository(
|
|
$pdo,
|
|
(string) (($appConfig['integrations']['secret'] ?? '') ?: '')
|
|
);
|
|
$offersRepository = new ChannelOffersRepository($pdo);
|
|
$linksRepository = new ProductLinksRepository($pdo);
|
|
$shopProClient = new ShopProClient();
|
|
$offerImportService = new OfferImportService($shopProClient, $offersRepository, $pdo);
|
|
$linksHealthCheckHandler = new ProductLinksHealthCheckHandler(
|
|
$integrationRepository,
|
|
$offerImportService,
|
|
$linksRepository,
|
|
$offersRepository
|
|
);
|
|
$offerTitlesRefreshHandler = new ShopProOfferTitlesRefreshHandler(
|
|
$integrationRepository,
|
|
$offerImportService
|
|
);
|
|
|
|
$processor->registerHandler(CronJobType::PRODUCT_LINKS_HEALTH_CHECK, $linksHealthCheckHandler);
|
|
$processor->registerHandler(CronJobType::SHOPPRO_OFFER_TITLES_REFRESH, $offerTitlesRefreshHandler);
|
|
|
|
$result = $processor->run($limit);
|
|
|
|
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL;
|
|
} catch (\Throwable $exception) {
|
|
fwrite(STDERR, '[error] ' . $exception->getMessage() . PHP_EOL);
|
|
exit(1);
|
|
}
|