+++ /dev/null
-<?php
-/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-namespace Friendica;
-
-use Friendica\Database\Database;
-use Friendica\Database\DBA;
-use Friendica\Network\HTTPException;
-use Psr\Log\LoggerInterface;
-
-/**
- * Repositories are Factories linked to one or more database tables.
- *
- * @see BaseModel
- * @see BaseCollection
- */
-abstract class BaseRepository extends BaseFactory
-{
- const LIMIT = 30;
-
- /** @var Database */
- protected $dba;
-
- /** @var string */
- protected static $table_name;
-
- /** @var BaseModel */
- protected static $model_class;
-
- /** @var BaseCollection */
- protected static $collection_class;
-
- public function __construct(Database $dba, LoggerInterface $logger)
- {
- parent::__construct($logger);
-
- $this->dba = $dba;
- $this->logger = $logger;
- }
-
- /**
- * Fetches a single model record. The condition array is expected to contain a unique index (primary or otherwise).
- *
- * Chainable.
- *
- * @param array $condition
- * @return BaseModel
- * @throws HTTPException\NotFoundException
- */
- public function selectFirst(array $condition)
- {
- $data = $this->dba->selectFirst(static::$table_name, [], $condition);
-
- if (!$data) {
- throw new HTTPException\NotFoundException(static::class . ' record not found.');
- }
-
- return $this->create($data);
- }
-
- /**
- * Populates a Collection according to the condition.
- *
- * Chainable.
- *
- * @param array $condition
- * @param array $params
- * @return BaseCollection
- * @throws \Exception
- */
- public function select(array $condition = [], array $params = [])
- {
- $models = $this->selectModels($condition, $params);
-
- return new static::$collection_class($models);
- }
-
- /**
- * Populates the collection according to the condition. Retrieves a limited subset of models depending on the boundaries
- * and the limit. The total count of rows matching the condition is stored in the collection.
- *
- * max_id and min_id are susceptible to the query order:
- * - min_id alone only reliably works with ASC order
- * - max_id alone only reliably works with DESC order
- * If the wrong order is detected in either case, we inverse the query order and we reverse the model array after the query
- *
- * Chainable.
- *
- * @param array $condition
- * @param array $params
- * @param int? $min_id Retrieve models with an id no fewer than this, as close to it as possible
- * @param int? $max_id Retrieve models with an id no greater than this, as close to it as possible
- * @param int $limit
- * @return BaseCollection
- * @throws \Exception
- */
- public function selectByBoundaries(array $condition = [], array $params = [], int $min_id = null, int $max_id = null, int $limit = self::LIMIT)
- {
- $totalCount = DBA::count(static::$table_name, $condition);
-
- $boundCondition = $condition;
-
- $reverseModels = false;
-
- if (isset($min_id)) {
- $boundCondition = DBA::mergeConditions($boundCondition, ['`id` > ?', $min_id]);
- if (!isset($max_id) && isset($params['order']['id']) && ($params['order']['id'] === true || $params['order']['id'] === 'DESC')) {
- $reverseModels = true;
- $params['order']['id'] = 'ASC';
- }
- }
-
- if (isset($max_id)) {
- $boundCondition = DBA::mergeConditions($boundCondition, ['`id` < ?', $max_id]);
- if (!isset($min_id) && (!isset($params['order']['id']) || $params['order']['id'] === false || $params['order']['id'] === 'ASC')) {
- $reverseModels = true;
- $params['order']['id'] = 'DESC';
- }
- }
-
- $params['limit'] = $limit;
-
- $models = $this->selectModels($boundCondition, $params);
-
- if ($reverseModels) {
- $models = array_reverse($models);
- }
-
- return new static::$collection_class($models, $totalCount);
- }
-
- /**
- * This method updates the database row from the model.
- *
- * @param BaseModel $model
- * @return bool
- * @throws \Exception
- */
- public function update(BaseModel $model)
- {
- if ($this->dba->update(static::$table_name, $model->toArray(), ['id' => $model->id], $model->getOriginalData())) {
- $model->resetOriginalData();
- return true;
- }
-
- return false;
- }
-
- /**
- * This method creates a new database row and returns a model if it was successful.
- *
- * @param array $fields
- * @return BaseModel|bool
- * @throws \Exception
- */
- public function insert(array $fields)
- {
- $return = $this->dba->insert(static::$table_name, $fields);
-
- if (!$return) {
- throw new HTTPException\InternalServerErrorException('Unable to insert new row in table "' . static::$table_name . '"');
- }
-
- $fields['id'] = $this->dba->lastInsertId();
- $return = $this->create($fields);
-
- return $return;
- }
-
- /**
- * Deletes the model record from the database.
- *
- * @param BaseModel $model
- * @return bool
- * @throws \Exception
- */
- public function delete(BaseModel &$model)
- {
- if ($success = $this->dba->delete(static::$table_name, ['id' => $model->id])) {
- $model = null;
- }
-
- return $success;
- }
-
- /**
- * Base instantiation method, can be overriden to add specific dependencies
- *
- * @param array $data
- * @return BaseModel
- */
- protected function create(array $data)
- {
- return new static::$model_class($this->dba, $this->logger, $data);
- }
-
- /**
- * @param array $condition Query condition
- * @param array $params Additional query parameters
- * @return BaseModel[]
- * @throws \Exception
- */
- protected function selectModels(array $condition, array $params = [])
- {
- $result = $this->dba->select(static::$table_name, [], $condition, $params);
-
- /** @var BaseModel $prototype */
- $prototype = null;
-
- $models = [];
-
- while ($record = $this->dba->fetch($result)) {
- if ($prototype === null) {
- $prototype = $this->create($record);
- $models[] = $prototype;
- } else {
- $models[] = static::$model_class::createFromPrototype($prototype, $record);
- }
- }
-
- $this->dba->close($result);
-
- return $models;
- }
-
- /**
- * @param BaseCollection $collection
- */
- public function saveCollection(BaseCollection $collection)
- {
- $collection->map([$this, 'update']);
- }
-}
+++ /dev/null
-<?php
-/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-namespace Friendica\Collection;
-
-use Friendica\BaseCollection;
-
-class FSuggests extends BaseCollection
-{
-
-}
+++ /dev/null
-<?php
-/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-namespace Friendica\Collection;
-
-use Friendica\BaseCollection;
-use Friendica\Model;
-
-class Notifications extends BaseCollection
-{
- /**
- * @return Model\Notification
- */
- public function current()
- {
- return parent::current();
- }
-}
--- /dev/null
+<?php
+
+namespace Friendica\Contact\FriendSuggest\Depository;
+
+use Friendica\BaseDepository;
+use Friendica\Contact\FriendSuggest\Exception\FriendSuggestPersistenceException;
+use Friendica\Contact\FriendSuggest\Factory;
+use Friendica\Contact\FriendSuggest\Entity;
+use Friendica\Database\Database;
+use Friendica\Network\HTTPException\NotFoundException;
+use Psr\Log\LoggerInterface;
+
+class FriendSuggest extends BaseDepository
+{
+ /** @var Factory\FriendSuggest */
+ protected $factory;
+
+ protected static $table_name = 'fsuggest';
+
+ public function __construct(Database $database, LoggerInterface $logger, Factory\FriendSuggest $factory)
+ {
+ parent::__construct($database, $logger, $factory);
+ }
+
+ private function convertToTableRow(Entity\FriendSuggest $fsuggest): array
+ {
+ return [
+ 'uid' => $fsuggest->uid,
+ 'cid' => $fsuggest->cid,
+ 'name' => $fsuggest->name,
+ 'url' => $fsuggest->url,
+ 'request' => $fsuggest->request,
+ 'photo' => $fsuggest->photo,
+ 'note' => $fsuggest->note,
+ ];
+ }
+
+ /**
+ * @param array $condition
+ * @param array $params
+ *
+ * @return Entity\FriendSuggest
+ *
+ * @throws NotFoundException The underlying exception if there's no FriendSuggest with the given conditions
+ */
+ private function selectOne(array $condition, array $params = []): Entity\FriendSuggest
+ {
+ return parent::_selectOne($condition, $params);
+ }
+
+ public function selectOneById(int $id): Entity\FriendSuggest
+ {
+ return $this->selectOne(['id' => $id]);
+ }
+
+ public function save(Entity\FriendSuggest $fsuggest): Entity\FriendSuggest
+ {
+ try {
+ $fields = $this->convertToTableRow($fsuggest);
+
+ if ($fsuggest->id) {
+ $this->db->update(self::$table_name, $fields, ['id' => $fsuggest->id]);
+ return $this->factory->createFromTableRow($fields);
+ } else {
+ $this->db->insert(self::$table_name, $fields);
+ return $this->selectOneById($this->db->lastInsertId());
+ }
+ } catch (\Exception $exception) {
+ throw new FriendSuggestPersistenceException(sprintf('Cannot insert/update the FriendSuggestion %d for user %d', $fsuggest->id, $fsuggest->uid), $exception);
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * @copyright Copyright (C) 2010-2021, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Contact\FriendSuggest\Entity;
+
+use Friendica\BaseEntity;
+
+/**
+ * Model for interacting with a friend suggestion
+ *
+ * @property-read int $uid
+ * @property-read int $cid
+ * @property-read string $name
+ * @property-read string $url
+ * @property-read string $request
+ * @property-read string $photo
+ * @property-read string $note
+ * @property-read \DateTime created
+ * @property-read int|null $id
+ */
+class FriendSuggest extends BaseEntity
+{
+ /** @var int */
+ protected $uid;
+ /** @var int */
+ protected $cid;
+ /** @var string */
+ protected $name;
+ /** @var string */
+ protected $url;
+ /** @var string */
+ protected $request;
+ /** @var string */
+ protected $photo;
+ /** @var string */
+ protected $note;
+ /** @var \DateTime */
+ protected $created;
+ /** @var int|null */
+ protected $id;
+
+ /**
+ * @param int $uid
+ * @param int $cid
+ * @param string $name
+ * @param string $url
+ * @param string $request
+ * @param string $photo
+ * @param string $note
+ * @param \DateTime $created
+ * @param int|null $id
+ */
+ public function __construct(int $uid, int $cid, string $name, string $url, string $request, string $photo, string $note, \DateTime $created, ?int $id = null)
+ {
+ $this->uid = $uid;
+ $this->cid = $cid;
+ $this->name = $name;
+ $this->url = $url;
+ $this->request = $request;
+ $this->photo = $photo;
+ $this->note = $note;
+ $this->created = $created;
+ $this->id = $id;
+ }
+}
--- /dev/null
+<?php
+
+namespace Friendica\Contact\FriendSuggest\Exception;
+
+class FriendSuggestPersistenceException extends \RuntimeException
+{
+ public function __construct($message = "", \Throwable $previous = null)
+ {
+ parent::__construct($message, 500, $previous);
+ }
+}
--- /dev/null
+<?php
+
+namespace Friendica\Contact\FriendSuggest\Factory;
+
+use Friendica\BaseFactory;
+use Friendica\Capabilities\ICanCreateFromTableRow;
+use Friendica\Contact\FriendSuggest\Entity;
+
+class FriendSuggest extends BaseFactory implements ICanCreateFromTableRow
+{
+ /**
+ * @inheritDoc
+ */
+ public function createFromTableRow(array $row): Entity\FriendSuggest
+ {
+ return new Entity\FriendSuggest(
+ $row['uid'] ?? 0,
+ $row['cid'] ?? 0,
+ $row['name'] ?? '',
+ $row['url'] ?? '',
+ $row['request'] ?? '',
+ $row['photo'] ?? '',
+ $row['note'] ?? '',
+ new \DateTime($row['created'] ?? 'now', new \DateTimeZone('UTC')),
+ $row['id'] ?? null
+ );
+ }
+
+ public function createNew(
+ int $uid,
+ int $cid,
+ string $name = '',
+ string $url = '',
+ string $request = '',
+ string $photo = '',
+ string $note = ''
+ ): Entity\FriendSuggest
+ {
+ return $this->createFromTableRow([
+ 'uid' => $uid,
+ 'cid' => $cid,
+ 'name' => $name,
+ 'url' => $url,
+ 'request' => $request,
+ 'photo' => $photo,
+ 'note' => $note,
+ ]);
+ }
+}
//
/**
- * @return Repository\FSuggest;
+ * @return Contact\FriendSuggest\Depository\FriendSuggest;
*/
public static function fsuggest()
{
- return self::$dice->create(Repository\FSuggest::class);
+ return self::$dice->create(Contact\FriendSuggest\Depository\FriendSuggest::class);
+ }
+
+ /**
+ * @return Contact\FriendSuggest\Factory\FriendSuggest;
+ */
+ public static function fsuggestFactory()
+ {
+ return self::$dice->create(Contact\FriendSuggest\Factory\FriendSuggest::class);
}
/**
+++ /dev/null
-<?php
-/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-namespace Friendica\Model;
-
-use Friendica\BaseModel;
-
-/**
- * Model for interacting with a friend suggestion
- *
- * @property int uid
- * @property int cid
- * @property string name
- * @property string url
- * @property string request
- * @property string photo
- * @property string note
- * @property string created
- */
-class FSuggest extends BaseModel
-{
-
-}
$note = Strings::escapeHtml(trim($_POST['note'] ?? ''));
- $suggest = DI::fsuggest()->insert([
- 'uid' => local_user(),
- 'cid' => $cid,
- 'name' => $contact['name'],
- 'url' => $contact['url'],
- 'request' => $contact['request'],
- 'photo' => $contact['avatar'],
- 'note' => $note,
- 'created' => DateTimeFormat::utcNow()
- ]);
+ $suggest = DI::fsuggest()->save(DI::fsuggestFactory()->createNew(
+ local_user(),
+ $cid,
+ $contact['name'],
+ $contact['url'],
+ $contact['request'],
+ $contact['avatar'],
+ $note
+ ));
Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::SUGGESTION, $suggest->id);
{
$owner = User::getOwnerDataById($uid);
- $suggestion = DI::fsuggest()->getById($suggestion_id);
+ $suggestion = DI::fsuggest()->selectOneById($suggestion_id);
$data = ['@context' => ActivityPub::CONTEXT,
'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
+++ /dev/null
-<?php
-/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-namespace Friendica\Repository;
-
-use Friendica\BaseRepository;
-use Friendica\Collection;
-use Friendica\Model;
-
-class FSuggest extends BaseRepository
-{
- protected static $table_name = 'fsuggest';
-
- protected static $model_class = Model\FSuggest::class;
-
- protected static $collection_class = Collection\FSuggests::class;
-
- /**
- * @param array $data
- * @return Model\FSuggest
- */
- protected function create(array $data)
- {
- return new Model\FSuggest($this->dba, $this->logger, $data);
- }
-
- /**
- * Returns the Friend Suggest based on it's ID
- *
- * @param int $id The id of the fsuggest
- *
- * @return Model\FSuggest
- *
- * @throws \Friendica\Network\HTTPException\NotFoundException
- */
- public function getById(int $id)
- {
- return $this->selectFirst(['id' => $id]);
- }
-
- /**
- * @param array $condition
- * @return Model\FSuggest
- * @throws \Friendica\Network\HTTPException\NotFoundException
- */
- public function selectFirst(array $condition)
- {
- return parent::selectFirst($condition);
- }
-
- /**
- * @param array $condition
- * @param array $params
- * @return Collection\FSuggests
- * @throws \Exception
- */
- public function select(array $condition = [], array $params = [])
- {
- return parent::select($condition, $params);
- }
-
- /**
- * @param array $condition
- * @param array $params
- * @param int|null $min_id
- * @param int|null $max_id
- * @param int $limit
- * @return Collection\FSuggests
- * @throws \Exception
- */
- public function selectByBoundaries(array $condition = [], array $params = [], int $min_id = null, int $max_id = null, int $limit = self::LIMIT)
- {
- return parent::selectByBoundaries($condition, $params, $min_id, $max_id, $limit);
- }
-}
'APDelivery', $cmd, $target_id, $inbox, $uid, $receivers, $post_uriid);
}
} elseif ($cmd == Delivery::SUGGESTION) {
- $suggest = DI::fsuggest()->getById($target_id);
+ $suggest = DI::fsuggest()->selectOneById($target_id);
$uid = $suggest->uid;
$recipients[] = $suggest->cid;
} elseif ($cmd == Delivery::REMOVAL) {