diff --git a/config/services.yaml b/config/services.yaml index 9d4d959..0b54e56 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -10,3 +10,18 @@ services: exclude: - '../src/Domain/' - '../src/Kernel.php' + + 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 diff --git a/src/Infrastructure/Persistence/Repository/DoctrineArticleRepository.php b/src/Infrastructure/Persistence/Repository/DoctrineArticleRepository.php new file mode 100644 index 0000000..13fe758 --- /dev/null +++ b/src/Infrastructure/Persistence/Repository/DoctrineArticleRepository.php @@ -0,0 +1,67 @@ +em->find(Article::class, $id); + } + + public function findBySku(string $sku): ?Article + { + return $this->em->getRepository(Article::class)->findOneBy(['sku' => $sku]); + } + + public function findByInventoryNumber(string $inventoryNumber): ?Article + { + return $this->em->getRepository(Article::class)->findOneBy(['inventoryNumber' => $inventoryNumber]); + } + + /** @return list
*/ + public function findByStatus(ArticleStatus $status): array + { + /** @var list
*/ + return $this->em->getRepository(Article::class)->findBy(['status' => $status]); + } + + public function decrementStockAtomic(Uuid $articleId): bool + { + $affected = $this->em->getConnection()->executeStatement( + 'UPDATE app.articles SET stock = stock - 1 WHERE id = :id AND stock > 0', + ['id' => $articleId->toRfc4122()], + ); + + if ($affected > 0) { + $article = $this->em->find(Article::class, $articleId); + if (null !== $article) { + $this->em->refresh($article); + } + } + + return $affected > 0; + } + + public function save(Article $article): void + { + $this->em->persist($article); + $this->em->flush(); + } + + public function remove(Article $article): void + { + $this->em->remove($article); + $this->em->flush(); + } +} diff --git a/src/Infrastructure/Persistence/Repository/DoctrineArticleTypeRepository.php b/src/Infrastructure/Persistence/Repository/DoctrineArticleTypeRepository.php new file mode 100644 index 0000000..ebe67d2 --- /dev/null +++ b/src/Infrastructure/Persistence/Repository/DoctrineArticleTypeRepository.php @@ -0,0 +1,38 @@ +em->find(ArticleType::class, $id); + } + + public function findByName(string $name): ?ArticleType + { + return $this->em->getRepository(ArticleType::class)->findOneBy(['name' => $name]); + } + + /** @return list */ + public function findAll(): array + { + /** @var list */ + return $this->em->getRepository(ArticleType::class)->findAll(); + } + + public function save(ArticleType $articleType): void + { + $this->em->persist($articleType); + $this->em->flush(); + } +} diff --git a/src/Infrastructure/Persistence/Repository/DoctrineCustomerRepository.php b/src/Infrastructure/Persistence/Repository/DoctrineCustomerRepository.php new file mode 100644 index 0000000..da26ccc --- /dev/null +++ b/src/Infrastructure/Persistence/Repository/DoctrineCustomerRepository.php @@ -0,0 +1,50 @@ +em->find(Customer::class, $id); + } + + public function findByPlatformId(string $platform, string $platformUserId): ?Customer + { + return $this->em->getRepository(Customer::class) + ->createQueryBuilder('c') + ->where("JSON_UNQUOTE(JSON_EXTRACT(c.platformIds, :path)) = :id") + ->setParameter('path', '$."'.$platform.'"') + ->setParameter('id', $platformUserId) + ->setMaxResults(1) + ->getQuery() + ->getOneOrNullResult(); + } + + public function findByMatchingKey(string $matchingKey): ?Customer + { + $customers = $this->em->getRepository(Customer::class)->findAll(); + foreach ($customers as $customer) { + if ($customer->getMatchingKey() === $matchingKey) { + return $customer; + } + } + + return null; + } + + public function save(Customer $customer): void + { + $this->em->persist($customer); + $this->em->flush(); + } +} diff --git a/src/Infrastructure/Persistence/Repository/DoctrineOrderRepository.php b/src/Infrastructure/Persistence/Repository/DoctrineOrderRepository.php new file mode 100644 index 0000000..9340e0e --- /dev/null +++ b/src/Infrastructure/Persistence/Repository/DoctrineOrderRepository.php @@ -0,0 +1,31 @@ +em->find(Order::class, $id); + } + + public function findByPlatformOrderId(string $platformOrderId): ?Order + { + return $this->em->getRepository(Order::class)->findOneBy(['platformOrderId' => $platformOrderId]); + } + + public function save(Order $order): void + { + $this->em->persist($order); + $this->em->flush(); + } +} diff --git a/src/Infrastructure/Persistence/Repository/DoctrinePlatformRepository.php b/src/Infrastructure/Persistence/Repository/DoctrinePlatformRepository.php new file mode 100644 index 0000000..30ab749 --- /dev/null +++ b/src/Infrastructure/Persistence/Repository/DoctrinePlatformRepository.php @@ -0,0 +1,38 @@ +em->find(Platform::class, $id); + } + + public function findByType(string $type): ?Platform + { + return $this->em->getRepository(Platform::class)->findOneBy(['type' => $type]); + } + + /** @return list */ + public function findAll(): array + { + /** @var list */ + return $this->em->getRepository(Platform::class)->findAll(); + } + + public function save(Platform $platform): void + { + $this->em->persist($platform); + $this->em->flush(); + } +}