. */ namespace SP\Domain\Plugin\Services; use Defuse\Crypto\Exception\CryptoException; use SP\Domain\Common\Services\ServiceException; use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\NoSuchPropertyException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Plugin\Models\PluginData as PluginDataModel; use SP\Domain\Plugin\Ports\PluginDataService; use SP\Domain\Plugin\Ports\PluginOperationInterface; use SP\Infrastructure\Common\Repositories\NoSuchItemException; /** * Class PluginOperation */ final readonly class PluginOperation implements PluginOperationInterface { public function __construct( private PluginDataService $pluginDataService, private string $pluginName ) { } /** * @param int $itemId * @param mixed $data * * @return int * @throws CryptoException * @throws ConstraintException * @throws NoSuchPropertyException * @throws QueryException * @throws ServiceException */ public function create(int $itemId, object $data): int { $itemData = new PluginDataModel(['name' => $this->pluginName, 'itemId' => $itemId]); return $this->pluginDataService->create($itemData->dehydrate($data))->getLastId(); } /** * @param int $itemId * @param mixed $data * * @return int * @throws CryptoException * @throws ConstraintException * @throws NoSuchPropertyException * @throws QueryException * @throws ServiceException */ public function update(int $itemId, object $data): int { $itemData = new PluginDataModel(['name' => $this->pluginName, 'itemId' => $itemId]); return $this->pluginDataService->update($itemData->dehydrate($data)); } /** * @throws ConstraintException * @throws QueryException * @throws NoSuchItemException */ public function delete(int $itemId): void { $this->pluginDataService->deleteByItemId($this->pluginName, $itemId); } /** * @template T * * @param int $itemId * @param class-string $class * * @return T|null * @throws ConstraintException * @throws CryptoException * @throws NoSuchPropertyException * @throws QueryException * @throws ServiceException */ public function get(int $itemId, string $class): ?object { try { return $this->pluginDataService ->getByItemId($this->pluginName, $itemId) ->hydrate($class); } catch (NoSuchItemException) { return null; } } }