diff options
author | Bernhard Posselt <dev@bernhard-posselt.com> | 2016-07-23 21:24:54 +0200 |
---|---|---|
committer | Bernhard Posselt <dev@bernhard-posselt.com> | 2016-07-23 21:24:54 +0200 |
commit | 004fcbbcc7609ca83807f2e38967ef54f469bf72 (patch) | |
tree | 49eb99b4ea92b2045793fc567f719b31ec7f9042 /lib/Db/NewsMapper.php | |
parent | 60abc0ed4438c9b6fda245b0dc33cb483bc2aeaf (diff) |
Move to new directory structure
Diffstat (limited to 'lib/Db/NewsMapper.php')
-rw-r--r-- | lib/Db/NewsMapper.php | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/Db/NewsMapper.php b/lib/Db/NewsMapper.php new file mode 100644 index 000000000..0acc252b9 --- /dev/null +++ b/lib/Db/NewsMapper.php @@ -0,0 +1,93 @@ +<?php +/** + * ownCloud - News + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Alessandro Cosentino <cosenal@gmail.com> + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @copyright Alessandro Cosentino 2012 + * @copyright Bernhard Posselt 2012, 2014 + */ + +namespace OCA\News\Db; + +use OCA\News\Utility\Time; +use OCP\IDBConnection; +use OCP\AppFramework\Db\Mapper; +use OCP\AppFramework\Db\Entity; + +abstract class NewsMapper extends Mapper { + + /** + * @var Time + */ + private $time; + + public function __construct(IDBConnection $db, $table, $entity, + Time $time) { + parent::__construct($db, $table, $entity); + $this->time = $time; + } + + public function update(Entity $entity) { + $entity->setLastModified($this->time->getMicroTime()); + return parent::update($entity); + } + + public function insert(Entity $entity) { + $entity->setLastModified($this->time->getMicroTime()); + return parent::insert($entity); + } + + /** + * @param int $id the id of the feed + * @param string $userId the id of the user + * + * @return \OCP\AppFramework\Db\Entity + */ + abstract public function find($id, $userId); + + /** + * Performs a SELECT query with all arguments appened to the WHERE clause + * The SELECT will be performed on the current table and take the entity + * that is related for transforming the properties into column names + * + * Important: This method does not filter marked as deleted rows! + * + * @param array $search an assoc array from property to filter value + * @param int $limit + * + * @paran int $offset + * @return array + */ + public function where(array $search = [], $limit = null, $offset = null) { + $entity = new $this->entityClass; + + // turn keys into sql query filter, e.g. feedId -> feed_id = :feedId + $filter = array_map(function ($property) use ($entity) { + // check if the property actually exists on the entity to prevent + // accidental Sql injection + if (!property_exists($entity, $property)) { + $msg = 'Property ' . $property . ' does not exist on ' + . $this->entityClass; + throw new \BadFunctionCallException($msg); + } + + $column = $entity->propertyToColumn($property); + return $column . ' = :' . $property; + }, array_keys($search)); + + $andStatement = implode(' AND ', $filter); + + $sql = 'SELECT * FROM `' . $this->getTableName() . '`'; + + if (count($search) > 0) { + $sql .= 'WHERE ' . $andStatement; + } + + return $this->findEntities($sql, $search, $limit, $offset); + } + +} |