2026-05-14 04:21:34 +00:00
|
|
|
parameters:
|
|
|
|
|
|
|
|
|
|
services:
|
|
|
|
|
_defaults:
|
|
|
|
|
autowire: true
|
|
|
|
|
autoconfigure: true
|
|
|
|
|
|
|
|
|
|
App\:
|
|
|
|
|
resource: '../src/'
|
|
|
|
|
exclude:
|
|
|
|
|
- '../src/Domain/'
|
|
|
|
|
- '../src/Kernel.php'
|
2026-05-14 04:31:33 +00:00
|
|
|
|
|
|
|
|
App\Domain\Article\Repository\ArticleRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineArticleRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Article\Repository\ArticleTypeRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineArticleTypeRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Channel\Repository\PlatformRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrinePlatformRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Order\Repository\CustomerRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineCustomerRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Order\Repository\OrderRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineOrderRepository
|
feat: implement Plan 2 — Article Management API
- 6 new domain repository interfaces (StoragePath, ArticlePhoto, AttributeValue, ChannelField, ArticleTypePlatformConfig, AttributeMapping)
- 6 Doctrine repository implementations
- StorageManager with multi-path quota-aware file storage (LocalStorageManager)
- Application services: ArticleTypeService, ArticleService, ArticleValidator, PhotoService, PlatformService, MappingService
- REST controllers: ArticleType, Article, Photo, Platform, Mapping (all under /api prefix)
- inventory_number sequence migration
- 22 unit tests passing, PHPStan level 9 clean, CS Fixer clean
- Fixed phpdoc_to_comment CS Fixer rule (disabled) to preserve @var type annotations
- Fixed PHPStan: User::getUserIdentifier non-empty-string, AIPipelineJob nullable missingFields
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 05:19:20 +00:00
|
|
|
|
|
|
|
|
App\Domain\Storage\Repository\StoragePathRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineStoragePathRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Article\Repository\ArticlePhotoRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineArticlePhotoRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Article\Repository\AttributeValueRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineAttributeValueRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Channel\Repository\ChannelFieldRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineChannelFieldRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Channel\Repository\ArticleTypePlatformConfigRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineArticleTypePlatformConfigRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Channel\Repository\AttributeMappingRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineAttributeMappingRepository
|
|
|
|
|
|
|
|
|
|
App\Application\Storage\StorageManagerInterface:
|
|
|
|
|
alias: App\Infrastructure\Storage\LocalStorageManager
|
2026-05-17 16:03:16 +00:00
|
|
|
|
|
|
|
|
App\Domain\Auth\Repository\UserRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineUserRepository
|
|
|
|
|
|
|
|
|
|
App\Domain\Auth\Repository\ApiKeyRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineApiKeyRepository
|
|
|
|
|
|
|
|
|
|
# Switch between Ollama and Mistral by changing the alias target below
|
|
|
|
|
App\Infrastructure\AI\OllamaClientInterface:
|
2026-05-18 07:19:02 +00:00
|
|
|
alias: App\Infrastructure\AI\MistralClient
|
2026-05-17 16:03:16 +00:00
|
|
|
|
|
|
|
|
App\Infrastructure\AI\OllamaClient:
|
|
|
|
|
arguments:
|
|
|
|
|
$ollamaBaseUrl: '%env(OLLAMA_BASE_URL)%'
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\AI\MistralClient:
|
|
|
|
|
arguments:
|
|
|
|
|
$mistralApiKey: '%env(MISTRAL_API_KEY)%'
|
|
|
|
|
$mistralBaseUrl: '%env(MISTRAL_BASE_URL)%'
|
|
|
|
|
|
2026-05-18 07:19:02 +00:00
|
|
|
App\Infrastructure\AI\AiConfigService:
|
2026-05-17 16:03:16 +00:00
|
|
|
arguments:
|
2026-05-18 07:19:02 +00:00
|
|
|
$visionModel: '%env(AI_VISION_MODEL)%'
|
|
|
|
|
$textModel: '%env(AI_TEXT_MODEL)%'
|
|
|
|
|
$ollamaBaseUrl: '%env(OLLAMA_BASE_URL)%'
|
|
|
|
|
$mistralBaseUrl: '%env(MISTRAL_BASE_URL)%'
|
|
|
|
|
$mistralApiKey: '%env(MISTRAL_API_KEY)%'
|
2026-05-17 16:03:16 +00:00
|
|
|
|
|
|
|
|
App\Infrastructure\AI\Agent\OllamaVisionAgent:
|
|
|
|
|
arguments:
|
|
|
|
|
$model: '%env(AI_VISION_MODEL)%'
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\AI\Agent\SpecsResearchAgent:
|
|
|
|
|
arguments:
|
|
|
|
|
$model: '%env(AI_TEXT_MODEL)%'
|
|
|
|
|
|
2026-05-18 08:35:52 +00:00
|
|
|
App\Infrastructure\Search\WebSearchInterface:
|
|
|
|
|
alias: App\Infrastructure\Search\TavilyWebSearch
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Search\TavilyWebSearch:
|
|
|
|
|
arguments:
|
|
|
|
|
$apiKey: '%env(TAVILY_API_KEY)%'
|
|
|
|
|
|
2026-05-17 16:03:16 +00:00
|
|
|
App\Infrastructure\AI\Agent\JsonCodingAgent:
|
|
|
|
|
arguments:
|
|
|
|
|
$model: '%env(AI_TEXT_MODEL)%'
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\AI\Agent\EbayTextAgent:
|
|
|
|
|
arguments:
|
|
|
|
|
$model: '%env(AI_TEXT_MODEL)%'
|
|
|
|
|
|
|
|
|
|
App\Domain\Pipeline\Repository\AIPipelineJobRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineAIPipelineJobRepository
|
|
|
|
|
|
2026-05-18 07:19:02 +00:00
|
|
|
App\Domain\AI\Repository\PromptTemplateRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrinePromptTemplateRepository
|
|
|
|
|
|
2026-05-18 07:53:52 +00:00
|
|
|
App\Domain\I18n\Repository\TranslationRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineTranslationRepository
|
|
|
|
|
|
2026-05-17 16:03:16 +00:00
|
|
|
App\Infrastructure\Console\BackupCommand:
|
|
|
|
|
arguments:
|
|
|
|
|
$backupDir: '%kernel.project_dir%/var/backups'
|
|
|
|
|
$databaseUrl: '%env(DATABASE_URL)%'
|
|
|
|
|
|
|
|
|
|
App\Application\Channel\ChannelAdapterRegistry:
|
|
|
|
|
arguments:
|
|
|
|
|
$adapters: !tagged_iterator app.channel_adapter
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Channel\Ebay\EbayAdapter:
|
|
|
|
|
tags: ['app.channel_adapter']
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Channel\Ebay\EbayOAuthClient:
|
|
|
|
|
arguments:
|
|
|
|
|
$clientId: '%env(EBAY_CLIENT_ID)%'
|
|
|
|
|
$clientSecret: '%env(EBAY_CLIENT_SECRET)%'
|
|
|
|
|
$oauthBaseUrl: '%env(EBAY_OAUTH_BASE_URL)%'
|
|
|
|
|
$cache: '@cache.app'
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Channel\Ebay\EbayInventoryApiClient:
|
|
|
|
|
arguments:
|
|
|
|
|
$apiBaseUrl: '%env(EBAY_API_BASE_URL)%'
|
|
|
|
|
$marketplaceId: '%env(EBAY_MARKETPLACE_ID)%'
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Channel\Ebay\EbayTaxonomyService:
|
|
|
|
|
arguments:
|
|
|
|
|
$apiBaseUrl: '%env(EBAY_API_BASE_URL)%'
|
|
|
|
|
$marketplaceId: '%env(EBAY_MARKETPLACE_ID)%'
|
|
|
|
|
$cache: '@cache.app'
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Channel\Ebay\EbayWebhookVerifier:
|
|
|
|
|
arguments:
|
|
|
|
|
$verificationToken: '%env(EBAY_VERIFICATION_TOKEN)%'
|
|
|
|
|
$endpointUrl: '%env(EBAY_ENDPOINT_URL)%'
|
|
|
|
|
|
|
|
|
|
App\Domain\Order\Repository\InvoiceRepositoryInterface:
|
|
|
|
|
alias: App\Infrastructure\Persistence\Repository\DoctrineInvoiceRepository
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Channel\Frappe\FrappeHttpClient:
|
|
|
|
|
arguments:
|
|
|
|
|
$baseUrl: '%env(FRAPPE_ERP_BASE_URL)%'
|
|
|
|
|
$apiKey: '%env(FRAPPE_ERP_API_KEY)%'
|
|
|
|
|
$apiSecret: '%env(FRAPPE_ERP_API_SECRET)%'
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Channel\Frappe\FrappeErpAdapter:
|
|
|
|
|
arguments:
|
|
|
|
|
$genericItemCode: '%env(FRAPPE_GENERIC_ITEM_CODE)%'
|
|
|
|
|
|
|
|
|
|
App\Application\Order\ErpAdapterInterface:
|
|
|
|
|
alias: App\Infrastructure\Channel\Frappe\FrappeErpAdapter
|
|
|
|
|
|
|
|
|
|
App\Application\Order\CustomerResolverInterface:
|
|
|
|
|
alias: App\Infrastructure\Order\CustomerResolver
|
|
|
|
|
|
|
|
|
|
App\Application\Order\InvoiceMailerInterface:
|
|
|
|
|
alias: App\Infrastructure\Mail\SymfonyInvoiceMailer
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Mail\SymfonyInvoiceMailer:
|
|
|
|
|
arguments:
|
|
|
|
|
$supplierEmail: '%env(SUPPLIER_EMAIL)%'
|
|
|
|
|
$senderEmail: '%env(SENDER_EMAIL)%'
|
|
|
|
|
|
|
|
|
|
App\Infrastructure\Channel\Ebay\EbayFulfillmentApiClient:
|
|
|
|
|
arguments:
|
|
|
|
|
$apiBaseUrl: '%env(EBAY_API_BASE_URL)%'
|