%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Services/Object/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Services/Object/AbstractService.php |
<?php /** * This file is part of the Passwords App * created by Marius David Wieschollek * and licensed under the AGPL. */ namespace OCA\Passwords\Services\Object; use Exception; use OCA\Passwords\Db\AbstractMapper; use OCA\Passwords\Db\EntityInterface; use OCA\Passwords\Helper\Uuid\UuidHelper; use OCA\Passwords\Services\EnvironmentService; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\EventDispatcher\IEventDispatcher; /** * Class AbstractService * * @package OCA\Passwords\Services\Object */ abstract class AbstractService { /** * @var string|null */ protected ?string $userId; /** * @var UuidHelper */ protected UuidHelper $uuidHelper; /** * @var IEventDispatcher */ protected IEventDispatcher $eventDispatcher; /** * @var EnvironmentService */ protected EnvironmentService $environment; /** * @var string */ protected string $class; /** * @var AbstractMapper */ protected AbstractMapper $mapper; /** * AbstractService constructor. * * @param UuidHelper $uuidHelper * @param IEventDispatcher $eventDispatcher * @param EnvironmentService $environment */ public function __construct( UuidHelper $uuidHelper, IEventDispatcher $eventDispatcher, EnvironmentService $environment ) { $this->userId = $environment->getUserId(); $this->environment = $environment; $this->uuidHelper = $uuidHelper; $this->eventDispatcher = $eventDispatcher; } /** * @return EntityInterface[] */ public function findDeleted(): array { return $this->mapper->findAllDeleted(); } /** * @param string $userId * * @return EntityInterface[] * @throws Exception */ public function findByUserId(string $userId): array { return $this->mapper->findAllByUserId($userId); } /** * @param string $uuid * * @return EntityInterface * @throws DoesNotExistException * @throws MultipleObjectsReturnedException */ public function findByUuid(string $uuid) { return $this->mapper->findByUuid($uuid); } /** * @param EntityInterface $model * * @return mixed */ public function save(EntityInterface $model): EntityInterface { return $this->saveModel($model); } /** * @param EntityInterface $entity * @param array $overwrites * * @return EntityInterface * @throws Exception */ public function clone(EntityInterface $entity, array $overwrites = []): EntityInterface { if(get_class($entity) !== $this->class) throw new Exception('Invalid revision class given'); $clone = $this->cloneModel($entity, $overwrites); $this->fireEvent('cloned', $entity, $clone); $this->fireEvent('afterCloned', $entity, $clone); return $clone; } /** * @param EntityInterface $entity * * @throws Exception */ public function delete(EntityInterface $entity): void { if(get_class($entity) !== $this->class) throw new Exception('Invalid revision class given'); $this->fireEvent('beforeDeleted', $entity); $entity->setDeleted(true); $this->save($entity); $this->fireEvent('deleted', $entity); $this->fireEvent('afterDeleted', $entity); } /** * @param EntityInterface|Entity $entity * * @throws Exception */ public function destroy(EntityInterface $entity): void { if(get_class($entity) !== $this->class) throw new Exception('Invalid revision class given'); if(!$entity->isDeleted()) $this->delete($entity); $this->fireEvent('beforeDestroyed', $entity); $this->mapper->delete($entity); $this->fireEvent('destroyed', $entity); $this->fireEvent('afterDestroyed', $entity); } /** * @param EntityInterface $model * * @return EntityInterface */ protected function saveModel(EntityInterface $model): EntityInterface { if(empty($model->getId())) { $this->fireEvent('beforeCreated', $model); $saved = $this->mapper->insert($model); $this->fireEvent('created', $model); $this->fireEvent('afterCreated', $model); } else { $this->fireEvent('beforeUpdated', $model); $model->setUpdated(time()); $saved = $this->mapper->update($model); $this->fireEvent('updated', $model); $this->fireEvent('afterUpdated', $model); } return $saved; } /** * @param EntityInterface $original * @param array $overwrites * * @return EntityInterface */ protected function cloneModel(EntityInterface $original, array $overwrites = []): EntityInterface { $class = get_class($original); $clone = new $class; $this->fireEvent('beforeCloned', $original, $clone, $overwrites); $fields = array_keys($clone->getFieldTypes()); foreach($fields as $field) { if($field === 'id' || $field === 'uuid') continue; if(isset($overwrites[ $field ])) { $clone->setProperty($field, $overwrites[ $field ]); } else { $clone->setProperty($field, $original->getProperty($field)); } } $clone->setCreated(time()); $clone->setUpdated(time()); return $clone; } /** * @param string $name * @param mixed ...$arguments */ protected function fireEvent(string $name, ...$arguments) { $object = substr($this->class, strrpos($this->class, '\\')+1); $eventClassPart = ucfirst($name); $eventModifier = ''; if(substr($name, 0, 6) === 'before') { $eventModifier = 'Before'; $eventClassPart = ucfirst(substr($name, 6)); } else if(substr($name, 0, 5) === 'after') { $eventModifier = 'After'; $eventClassPart = ucfirst(substr($name, 5)); } $eventClassName = "\\OCA\\Passwords\\Events\\{$object}\\{$eventModifier}{$object}{$eventClassPart}Event"; if(class_exists($eventClassName)) { $eventClass = new $eventClassName(...$arguments); $this->eventDispatcher->dispatchTyped($eventClass); } else { \OC::$server->getLogger()->error('Missing Event: '.$eventClassName); } } }