. */ 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\Ports\PluginDataInterface; use SP\Domain\Plugin\Ports\PluginOperationInterface; use SP\Infrastructure\Common\Repositories\NoSuchItemException; use SP\Infrastructure\Plugin\Repositories\PluginDataModel; /** * Class PluginOperation */ final class PluginOperation implements PluginOperationInterface { public function __construct( private readonly PluginDataInterface $pluginDataService, private readonly 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, mixed $data): int { $itemData = new PluginDataModel(['name' => $this->pluginName, 'itemId' => $itemId, 'data' => serialize($data)]); return $this->pluginDataService->create($itemData)->getLastId(); } /** * @param int $itemId * @param mixed $data * * @return int * @throws CryptoException * @throws ConstraintException * @throws NoSuchPropertyException * @throws QueryException * @throws ServiceException */ public function update(int $itemId, mixed $data): int { $itemData = new PluginDataModel(['name' => $this->pluginName, 'itemId' => $itemId, 'data' => serialize($data)]); return $this->pluginDataService->update($itemData); } /** * @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|null $class * * @return mixed|null * @throws ConstraintException * @throws CryptoException * @throws NoSuchPropertyException * @throws QueryException * @throws ServiceException */ public function get(int $itemId, ?string $class = null): mixed { try { return $this->pluginDataService ->getByItemId($this->pluginName, $itemId) ->hydrate($class); } catch (NoSuchItemException $e) { return null; } } }