Merge pull request #10911 from nupplaphil/feat/depository_fsuggest

Move FSuggest to new paradigm
This commit is contained in:
Hypolite Petovan 2021-10-23 22:04:08 -04:00 committed by GitHub
commit 53402738b5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
40 changed files with 1114 additions and 820 deletions

View file

@ -1,163 +0,0 @@
<?php
namespace Friendica;
use Exception;
use Friendica\Capabilities\ICanCreateFromTableRow;
use Friendica\Database\Database;
use Friendica\Database\DBA;
use Friendica\Network\HTTPException\NotFoundException;
use Psr\Log\LoggerInterface;
/**
* Depositories are meant to store and retrieve Entities from the database.
*
* The reason why there are methods prefixed with an underscore is because PHP doesn't support generic polymorphism
* which means we can't directly overload base methods and make parameters more strict (from a parent class to a child
* class for example)
*
* Similarly, we can't make an overloaded method return type more strict until we only support PHP version 7.4 but this
* is less pressing.
*/
abstract class BaseDepository
{
const LIMIT = 30;
/**
* @var string This should be set to the main database table name the depository is using
*/
protected static $table_name;
/** @var Database */
protected $db;
/** @var LoggerInterface */
protected $logger;
/** @var ICanCreateFromTableRow */
protected $factory;
public function __construct(Database $database, LoggerInterface $logger, ICanCreateFromTableRow $factory)
{
$this->db = $database;
$this->logger = $logger;
$this->factory = $factory;
}
/**
* Populates the collection according to the condition. Retrieves a limited subset of entities depending on the
* boundaries and the limit. The total count of rows matching the condition is stored in the collection.
*
* Depends on the corresponding table featuring a numerical auto incremented column called `id`.
*
* 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 reverse the query order and the entity list order after the query
*
* Chainable.
*
* @param array $condition
* @param array $params
* @param int|null $min_id Retrieve models with an id no fewer than this, as close to it as possible
* @param int|null $max_id Retrieve models with an id no greater than this, as close to it as possible
* @param int $limit
* @return BaseCollection
* @throws \Exception
*/
protected function _selectByBoundaries(
array $condition = [],
array $params = [],
int $min_id = null,
int $max_id = null,
int $limit = self::LIMIT
): BaseCollection {
$totalCount = $this->count($condition);
$boundCondition = $condition;
$reverseOrder = 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')) {
$reverseOrder = true;
$params['order']['id'] = 'ASC';
}
}
if (isset($max_id) && $max_id > 0) {
$boundCondition = DBA::mergeConditions($boundCondition, ['`id` < ?', $max_id]);
if (!isset($min_id) && (!isset($params['order']['id']) || $params['order']['id'] === false || $params['order']['id'] === 'ASC')) {
$reverseOrder = true;
$params['order']['id'] = 'DESC';
}
}
$params['limit'] = $limit;
$Entities = $this->_select($boundCondition, $params);
if ($reverseOrder) {
$Entities->reverse();
}
return new BaseCollection($Entities->getArrayCopy(), $totalCount);
}
/**
* @param array $condition
* @param array $params
* @return BaseCollection
* @throws Exception
*/
protected function _select(array $condition, array $params = []): BaseCollection
{
$rows = $this->db->selectToArray(static::$table_name, [], $condition, $params);
$Entities = new BaseCollection();
foreach ($rows as $fields) {
$Entities[] = $this->factory->createFromTableRow($fields);
}
return $Entities;
}
/**
* @param array $condition
* @param array $params
* @return BaseEntity
* @throws NotFoundException
*/
protected function _selectOne(array $condition, array $params = []): BaseEntity
{
$fields = $this->db->selectFirst(static::$table_name, [], $condition, $params);
if (!$this->db->isResult($fields)) {
throw new NotFoundException();
}
return $this->factory->createFromTableRow($fields);
}
/**
* @param array $condition
* @param array $params
* @return int
* @throws Exception
*/
public function count(array $condition, array $params = []): int
{
return $this->db->count(static::$table_name, $condition, $params);
}
/**
* @param array $condition
* @return bool
* @throws Exception
*/
public function exists(array $condition): bool
{
return $this->db->exists(static::$table_name, $condition);
}
}

View file

@ -21,231 +21,162 @@
namespace Friendica; namespace Friendica;
use Exception;
use Friendica\Capabilities\ICanCreateFromTableRow;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException\NotFoundException;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
/** /**
* Repositories are Factories linked to one or more database tables. * Repositories are meant to store and retrieve Entities from the database.
* *
* @see BaseModel * The reason why there are methods prefixed with an underscore is because PHP doesn't support generic polymorphism
* @see BaseCollection * which means we can't directly overload base methods and make parameters more strict (from a parent class to a child
* class for example)
*
* Similarly, we can't make an overloaded method return type more strict until we only support PHP version 7.4 but this
* is less pressing.
*/ */
abstract class BaseRepository extends BaseFactory abstract class BaseRepository
{ {
const LIMIT = 30; const LIMIT = 30;
/** @var Database */ /**
protected $dba; * @var string This should be set to the main database table name the depository is using
*/
/** @var string */
protected static $table_name; protected static $table_name;
/** @var BaseModel */ /** @var Database */
protected static $model_class; protected $db;
/** @var BaseCollection */ /** @var LoggerInterface */
protected static $collection_class; protected $logger;
public function __construct(Database $dba, LoggerInterface $logger) /** @var ICanCreateFromTableRow */
protected $factory;
public function __construct(Database $database, LoggerInterface $logger, ICanCreateFromTableRow $factory)
{ {
parent::__construct($logger); $this->db = $database;
$this->logger = $logger;
$this->dba = $dba; $this->factory = $factory;
$this->logger = $logger;
} }
/** /**
* Fetches a single model record. The condition array is expected to contain a unique index (primary or otherwise). * Populates the collection according to the condition. Retrieves a limited subset of entities depending on the
* boundaries and the limit. The total count of rows matching the condition is stored in the collection.
* *
* Chainable. * Depends on the corresponding table featuring a numerical auto incremented column called `id`.
*
* @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: * max_id and min_id are susceptible to the query order:
* - min_id alone only reliably works with ASC order * - min_id alone only reliably works with ASC order
* - max_id alone only reliably works with DESC 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 * If the wrong order is detected in either case, we reverse the query order and the entity list order after the query
* *
* Chainable. * Chainable.
* *
* @param array $condition * @param array $condition
* @param array $params * @param array $params
* @param int? $min_id Retrieve models with an id no fewer than this, as close to it as possible * @param int|null $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|null $max_id Retrieve models with an id no greater than this, as close to it as possible
* @param int $limit * @param int $limit
* @return BaseCollection * @return BaseCollection
* @throws \Exception * @throws \Exception
*/ */
public function selectByBoundaries(array $condition = [], array $params = [], int $min_id = null, int $max_id = null, int $limit = self::LIMIT) protected function _selectByBoundaries(
{ array $condition = [],
$totalCount = DBA::count(static::$table_name, $condition); array $params = [],
int $min_id = null,
int $max_id = null,
int $limit = self::LIMIT
): BaseCollection {
$totalCount = $this->count($condition);
$boundCondition = $condition; $boundCondition = $condition;
$reverseModels = false; $reverseOrder = false;
if (isset($min_id)) { if (isset($min_id)) {
$boundCondition = DBA::mergeConditions($boundCondition, ['`id` > ?', $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')) { if (!isset($max_id) && isset($params['order']['id']) && ($params['order']['id'] === true || $params['order']['id'] === 'DESC')) {
$reverseModels = true; $reverseOrder = true;
$params['order']['id'] = 'ASC'; $params['order']['id'] = 'ASC';
} }
} }
if (isset($max_id)) { if (isset($max_id) && $max_id > 0) {
$boundCondition = DBA::mergeConditions($boundCondition, ['`id` < ?', $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')) { if (!isset($min_id) && (!isset($params['order']['id']) || $params['order']['id'] === false || $params['order']['id'] === 'ASC')) {
$reverseModels = true; $reverseOrder = true;
$params['order']['id'] = 'DESC'; $params['order']['id'] = 'DESC';
} }
} }
$params['limit'] = $limit; $params['limit'] = $limit;
$models = $this->selectModels($boundCondition, $params); $Entities = $this->_select($boundCondition, $params);
if ($reverseOrder) {
if ($reverseModels) { $Entities->reverse();
$models = array_reverse($models);
} }
return new static::$collection_class($models, $totalCount); return new BaseCollection($Entities->getArrayCopy(), $totalCount);
} }
/** /**
* This method updates the database row from the model. * @param array $condition
* * @param array $params
* @param BaseModel $model * @return BaseCollection
* @throws Exception
*/
protected function _select(array $condition, array $params = []): BaseCollection
{
$rows = $this->db->selectToArray(static::$table_name, [], $condition, $params);
$Entities = new BaseCollection();
foreach ($rows as $fields) {
$Entities[] = $this->factory->createFromTableRow($fields);
}
return $Entities;
}
/**
* @param array $condition
* @param array $params
* @return BaseEntity
* @throws NotFoundException
*/
protected function _selectOne(array $condition, array $params = []): BaseEntity
{
$fields = $this->db->selectFirst(static::$table_name, [], $condition, $params);
if (!$this->db->isResult($fields)) {
throw new NotFoundException();
}
return $this->factory->createFromTableRow($fields);
}
/**
* @param array $condition
* @param array $params
* @return int
* @throws Exception
*/
public function count(array $condition, array $params = []): int
{
return $this->db->count(static::$table_name, $condition, $params);
}
/**
* @param array $condition
* @return bool * @return bool
* @throws \Exception * @throws Exception
*/ */
public function update(BaseModel $model) public function exists(array $condition): bool
{ {
if ($this->dba->update(static::$table_name, $model->toArray(), ['id' => $model->id], $model->getOriginalData())) { return $this->db->exists(static::$table_name, $condition);
$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']);
} }
} }

View file

@ -19,11 +19,10 @@
* *
*/ */
namespace Friendica\Collection; namespace Friendica\Contact\FriendSuggest\Collection;
use Friendica\BaseCollection; use Friendica\BaseCollection;
class FSuggests extends BaseCollection class FriendSuggests extends BaseCollection
{ {
} }

View file

@ -0,0 +1,83 @@
<?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;
}
}

View file

@ -19,23 +19,12 @@
* *
*/ */
namespace Friendica\Model; namespace Friendica\Contact\FriendSuggest\Exception;
use Friendica\BaseModel; class FriendSuggestNotFoundException extends \OutOfBoundsException
/**
* 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
{ {
public function __construct($message = '', \Throwable $previous = null)
{
parent::__construct($message, 404, $previous);
}
} }

View file

@ -19,18 +19,12 @@
* *
*/ */
namespace Friendica\Collection; namespace Friendica\Contact\FriendSuggest\Exception;
use Friendica\BaseCollection; class FriendSuggestPersistenceException extends \RuntimeException
use Friendica\Model;
class Notifications extends BaseCollection
{ {
/** public function __construct($message = '', \Throwable $previous = null)
* @return Model\Notification
*/
public function current()
{ {
return parent::current(); parent::__construct($message, 500, $previous);
} }
} }

View file

@ -0,0 +1,72 @@
<?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\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,
]);
}
public function createEmpty(int $id): Entity\FriendSuggest
{
return $this->createFromTableRow(['id' => $id]);
}
}

View file

@ -0,0 +1,159 @@
<?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\Repository;
use Friendica\BaseRepository;
use Friendica\Contact\FriendSuggest\Collection;
use Friendica\Contact\FriendSuggest\Entity;
use Friendica\Contact\FriendSuggest\Exception\FriendSuggestNotFoundException;
use Friendica\Contact\FriendSuggest\Exception\FriendSuggestPersistenceException;
use Friendica\Contact\FriendSuggest\Factory;
use Friendica\Database\Database;
use Friendica\Network\HTTPException\NotFoundException;
use Friendica\Util\DateTimeFormat;
use Psr\Log\LoggerInterface;
class FriendSuggest extends BaseRepository
{
/** @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,
'created' => $fsuggest->created->format(DateTimeFormat::MYSQL),
];
}
/**
* @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);
}
/**
* @param array $condition
* @param array $params
*
* @return Collection\FriendSuggests
*
* @throws \Exception
*/
private function select(array $condition, array $params = []): Collection\FriendSuggests
{
return new Collection\FriendSuggests(parent::_select($condition, $params)->getArrayCopy());
}
/**
* @param int $id
*
* @return Entity\FriendSuggest
*
* @throws FriendSuggestNotFoundException in case there's no suggestion for this id
*/
public function selectOneById(int $id): Entity\FriendSuggest
{
try {
return $this->selectOne(['id' => $id]);
} catch (NotFoundException $e) {
throw new FriendSuggestNotFoundException(sprintf('No FriendSuggest found for id %d', $id));
}
}
/**
* @param int $cid
*
* @return Collection\FriendSuggests
*
* @throws FriendSuggestPersistenceException In case the underlying storage cannot select the suggestion
*/
public function selectForContact(int $cid): Collection\FriendSuggests
{
try {
return $this->select(['cid' => $cid]);
} catch (\Exception $e) {
throw new FriendSuggestPersistenceException(sprintf('Cannot select FriendSuggestion for contact %d', $cid));
}
}
/**
* @param Entity\FriendSuggest $fsuggest
*
* @return Entity\FriendSuggest
*
* @throws FriendSuggestNotFoundException in case the underlying storage cannot save the suggestion
*/
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->selectOneById($fsuggest->id);
} else {
$this->db->insert(self::$table_name, $fields);
return $this->selectOneById($this->db->lastInsertId());
}
} catch (\Exception $exception) {
throw new FriendSuggestNotFoundException(sprintf('Cannot insert/update the FriendSuggestion %d for user %d', $fsuggest->id, $fsuggest->uid), $exception);
}
}
/**
* @param Collection\FriendSuggests $fsuggests
*
* @return bool
*
* @throws FriendSuggestNotFoundException in case the underlying storage cannot delete the suggestion
*/
public function delete(Collection\FriendSuggests $fsuggests): bool
{
try {
$ids = $fsuggests->column('id');
return $this->db->delete(self::$table_name, ['id' => $ids]);
} catch (\Exception $exception) {
throw new FriendSuggestNotFoundException('Cannot delete the FriendSuggestions', $exception);
}
}
}

View file

@ -1,4 +1,23 @@
<?php <?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\Introduction\Collection; namespace Friendica\Contact\Introduction\Collection;

View file

@ -1,4 +1,23 @@
<?php <?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\Introduction\Exception; namespace Friendica\Contact\Introduction\Exception;

View file

@ -1,4 +1,23 @@
<?php <?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\Introduction\Exception; namespace Friendica\Contact\Introduction\Exception;

View file

@ -19,9 +19,9 @@
* *
*/ */
namespace Friendica\Contact\Introduction\Depository; namespace Friendica\Contact\Introduction\Repository;
use Friendica\BaseDepository; use Friendica\BaseRepository;
use Friendica\Contact\Introduction\Exception\IntroductionNotFoundException; use Friendica\Contact\Introduction\Exception\IntroductionNotFoundException;
use Friendica\Contact\Introduction\Exception\IntroductionPersistenceException; use Friendica\Contact\Introduction\Exception\IntroductionPersistenceException;
use Friendica\Contact\Introduction\Collection; use Friendica\Contact\Introduction\Collection;
@ -32,7 +32,7 @@ use Friendica\Network\HTTPException\NotFoundException;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class Introduction extends BaseDepository class Introduction extends BaseRepository
{ {
/** @var Factory\Introduction */ /** @var Factory\Introduction */
protected $factory; protected $factory;

View file

@ -27,7 +27,7 @@ use Friendica\DI;
use Friendica\Model\Photo; use Friendica\Model\Photo;
use Friendica\Model\Profile; use Friendica\Model\Profile;
use Friendica\Object\Image; use Friendica\Object\Image;
use Friendica\Security\PermissionSet\Depository\PermissionSet; use Friendica\Security\PermissionSet\Repository\PermissionSet;
use Friendica\Util\Strings; use Friendica\Util\Strings;
use Friendica\Worker\Delivery; use Friendica\Worker\Delivery;

View file

@ -427,19 +427,27 @@ abstract class DI
// //
/** /**
* @return Repository\FSuggest; * @return Contact\FriendSuggest\Repository\FriendSuggest;
*/ */
public static function fsuggest() public static function fsuggest()
{ {
return self::$dice->create(Repository\FSuggest::class); return self::$dice->create(Contact\FriendSuggest\Repository\FriendSuggest::class);
} }
/** /**
* @return Contact\Introduction\Depository\Introduction * @return Contact\FriendSuggest\Factory\FriendSuggest;
*/
public static function fsuggestFactory()
{
return self::$dice->create(Contact\FriendSuggest\Factory\FriendSuggest::class);
}
/**
* @return Contact\Introduction\Repository\Introduction
*/ */
public static function intro() public static function intro()
{ {
return self::$dice->create(Contact\Introduction\Depository\Introduction::class); return self::$dice->create(Contact\Introduction\Repository\Introduction::class);
} }
/** /**
@ -450,9 +458,9 @@ abstract class DI
return self::$dice->create(Contact\Introduction\Factory\Introduction::class); return self::$dice->create(Contact\Introduction\Factory\Introduction::class);
} }
public static function permissionSet(): Security\PermissionSet\Depository\PermissionSet public static function permissionSet(): Security\PermissionSet\Repository\PermissionSet
{ {
return self::$dice->create(Security\PermissionSet\Depository\PermissionSet::class); return self::$dice->create(Security\PermissionSet\Repository\PermissionSet::class);
} }
public static function permissionSetFactory(): Security\PermissionSet\Factory\PermissionSet public static function permissionSetFactory(): Security\PermissionSet\Factory\PermissionSet
@ -460,9 +468,9 @@ abstract class DI
return self::$dice->create(Security\PermissionSet\Factory\PermissionSet::class); return self::$dice->create(Security\PermissionSet\Factory\PermissionSet::class);
} }
public static function profileField(): Profile\ProfileField\Depository\ProfileField public static function profileField(): Profile\ProfileField\Repository\ProfileField
{ {
return self::$dice->create(Profile\ProfileField\Depository\ProfileField::class); return self::$dice->create(Profile\ProfileField\Repository\ProfileField::class);
} }
public static function profileFieldFactory(): Profile\ProfileField\Factory\ProfileField public static function profileFieldFactory(): Profile\ProfileField\Factory\ProfileField
@ -470,9 +478,9 @@ abstract class DI
return self::$dice->create(Profile\ProfileField\Factory\ProfileField::class); return self::$dice->create(Profile\ProfileField\Factory\ProfileField::class);
} }
public static function notification(): Navigation\Notifications\Depository\Notification public static function notification(): Navigation\Notifications\Repository\Notification
{ {
return self::$dice->create(Navigation\Notifications\Depository\Notification::class); return self::$dice->create(Navigation\Notifications\Repository\Notification::class);
} }
public static function notificationFactory(): Navigation\Notifications\Factory\Notification public static function notificationFactory(): Navigation\Notifications\Factory\Notification
@ -480,9 +488,9 @@ abstract class DI
return self::$dice->create(Navigation\Notifications\Factory\Notification::class); return self::$dice->create(Navigation\Notifications\Factory\Notification::class);
} }
public static function notify(): Navigation\Notifications\Depository\Notify public static function notify(): Navigation\Notifications\Repository\Notify
{ {
return self::$dice->create(Navigation\Notifications\Depository\Notify::class); return self::$dice->create(Navigation\Notifications\Repository\Notify::class);
} }
public static function notifyFactory(): Navigation\Notifications\Factory\Notify public static function notifyFactory(): Navigation\Notifications\Factory\Notify

View file

@ -27,7 +27,7 @@ use Friendica\Collection\Api\Mastodon\Fields;
use Friendica\Model\APContact; use Friendica\Model\APContact;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
use Friendica\Profile\ProfileField\Depository\ProfileField as ProfileFieldDepository; use Friendica\Profile\ProfileField\Repository\ProfileField as ProfileFieldRepository;
use ImagickException; use ImagickException;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
@ -35,17 +35,17 @@ class Account extends BaseFactory
{ {
/** @var BaseURL */ /** @var BaseURL */
private $baseUrl; private $baseUrl;
/** @var ProfileFieldDepository */ /** @var ProfileFieldRepository */
private $profileFieldDepo; private $profileFieldRepo;
/** @var Field */ /** @var Field */
private $mstdnFieldFactory; private $mstdnFieldFactory;
public function __construct(LoggerInterface $logger, BaseURL $baseURL, ProfileFieldDepository $profileFieldDepo, Field $mstdnFieldFactory) public function __construct(LoggerInterface $logger, BaseURL $baseURL, ProfileFieldRepository $profileFieldRepo, Field $mstdnFieldFactory)
{ {
parent::__construct($logger); parent::__construct($logger);
$this->baseUrl = $baseURL; $this->baseUrl = $baseURL;
$this->profileFieldDepo = $profileFieldDepo; $this->profileFieldRepo = $profileFieldRepo;
$this->mstdnFieldFactory = $mstdnFieldFactory; $this->mstdnFieldFactory = $mstdnFieldFactory;
} }
@ -76,7 +76,7 @@ class Account extends BaseFactory
$self_contact = Contact::selectFirst(['uid'], ['nurl' => $publicContact['nurl'], 'self' => true]); $self_contact = Contact::selectFirst(['uid'], ['nurl' => $publicContact['nurl'], 'self' => true]);
if (!empty($self_contact['uid'])) { if (!empty($self_contact['uid'])) {
$profileFields = $this->profileFieldDepo->selectPublicFieldsByUserId($self_contact['uid']); $profileFields = $this->profileFieldRepo->selectPublicFieldsByUserId($self_contact['uid']);
$fields = $this->mstdnFieldFactory->createFromProfileFields($profileFields); $fields = $this->mstdnFieldFactory->createFromProfileFields($profileFields);
} else { } else {
$fields = new Fields(); $fields = new Fields();
@ -94,7 +94,7 @@ class Account extends BaseFactory
{ {
$publicContact = Contact::selectFirst([], ['uid' => $userId, 'self' => true]); $publicContact = Contact::selectFirst([], ['uid' => $userId, 'self' => true]);
$profileFields = $this->profileFieldDepo->selectPublicFieldsByUserId($userId); $profileFields = $this->profileFieldRepo->selectPublicFieldsByUserId($userId);
$fields = $this->mstdnFieldFactory->createFromProfileFields($profileFields); $fields = $this->mstdnFieldFactory->createFromProfileFields($profileFields);
$apContact = APContact::getByURL($publicContact['url'], false); $apContact = APContact::getByURL($publicContact['url'], false);

View file

@ -28,7 +28,7 @@ use Friendica\Model\Contact;
use Friendica\Model\Profile; use Friendica\Model\Profile;
use Friendica\Module\BaseApi; use Friendica\Module\BaseApi;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
use Friendica\Security\PermissionSet\Depository\PermissionSet; use Friendica\Security\PermissionSet\Repository\PermissionSet;
/** /**
* API endpoint: /api/friendica/profile/show * API endpoint: /api/friendica/profile/show

View file

@ -68,16 +68,15 @@ class FriendSuggest extends BaseModule
$note = Strings::escapeHtml(trim($_POST['note'] ?? '')); $note = Strings::escapeHtml(trim($_POST['note'] ?? ''));
$suggest = DI::fsuggest()->insert([ $suggest = DI::fsuggest()->save(DI::fsuggestFactory()->createNew(
'uid' => local_user(), local_user(),
'cid' => $cid, $cid,
'name' => $contact['name'], $contact['name'],
'url' => $contact['url'], $contact['url'],
'request' => $contact['request'], $contact['request'],
'photo' => $contact['avatar'], $contact['avatar'],
'note' => $note, $note
'created' => DateTimeFormat::utcNow() ));
]);
Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::SUGGESTION, $suggest->id); Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::SUGGESTION, $suggest->id);
@ -94,7 +93,7 @@ class FriendSuggest extends BaseModule
DI::baseUrl()->redirect(); DI::baseUrl()->redirect();
} }
$contacts = ContactModel::selectToArray(['id', 'name'], [ $suggestableContacts = ContactModel::selectToArray(['id', 'name'], [
'`uid` = ? '`uid` = ?
AND `id` != ? AND `id` != ?
AND `network` = ? AND `network` = ?
@ -111,8 +110,8 @@ class FriendSuggest extends BaseModule
$formattedContacts = []; $formattedContacts = [];
foreach ($contacts as $contact) { foreach ($suggestableContacts as $suggestableContact) {
$formattedContacts[$contact['id']] = $contact['name']; $formattedContacts[$suggestableContact['id']] = $suggestableContact['name'];
} }
$tpl = Renderer::getMarkupTemplate('fsuggest.tpl'); $tpl = Renderer::getMarkupTemplate('fsuggest.tpl');

View file

@ -32,7 +32,7 @@ use Friendica\Model\Contact;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Module\BaseNotifications; use Friendica\Module\BaseNotifications;
use Friendica\Navigation\Notifications\Collection\FormattedNotifications; use Friendica\Navigation\Notifications\Collection\FormattedNotifications;
use Friendica\Navigation\Notifications\Depository; use Friendica\Navigation\Notifications\Repository;
use Friendica\Navigation\Notifications\ValueObject; use Friendica\Navigation\Notifications\ValueObject;
use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Protocol\Activity; use Friendica\Protocol\Activity;
@ -54,14 +54,14 @@ class FormattedNotification extends BaseFactory
{ {
/** @var Database */ /** @var Database */
private $dba; private $dba;
/** @var Depository\Notify */ /** @var Repository\Notify */
private $notify; private $notify;
/** @var BaseURL */ /** @var BaseURL */
private $baseUrl; private $baseUrl;
/** @var L10n */ /** @var L10n */
private $l10n; private $l10n;
public function __construct(LoggerInterface $logger, Database $dba, Depository\Notify $notify, BaseURL $baseUrl, L10n $l10n) public function __construct(LoggerInterface $logger, Database $dba, Repository\Notify $notify, BaseURL $baseUrl, L10n $l10n)
{ {
parent::__construct($logger); parent::__construct($logger);

View file

@ -1,10 +1,10 @@
<?php <?php
namespace Friendica\Navigation\Notifications\Depository; namespace Friendica\Navigation\Notifications\Repository;
use Exception; use Exception;
use Friendica\BaseCollection; use Friendica\BaseCollection;
use Friendica\BaseDepository; use Friendica\BaseRepository;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Model\Verb; use Friendica\Model\Verb;
@ -15,7 +15,7 @@ use Friendica\Network\HTTPException\NotFoundException;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class Notification extends BaseDepository class Notification extends BaseRepository
{ {
/** @var Factory\Notification */ /** @var Factory\Notification */
protected $factory; protected $factory;

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Friendica\Navigation\Notifications\Depository; namespace Friendica\Navigation\Notifications\Repository;
use Friendica\App\BaseURL; use Friendica\App\BaseURL;
use Friendica\BaseDepository; use Friendica\BaseRepository;
use Friendica\Content\Text\Plaintext; use Friendica\Content\Text\Plaintext;
use Friendica\Core\Config\IConfig; use Friendica\Core\Config\IConfig;
use Friendica\Core\Hook; use Friendica\Core\Hook;
@ -22,7 +22,7 @@ use Friendica\Util\DateTimeFormat;
use Friendica\Util\Emailer; use Friendica\Util\Emailer;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class Notify extends BaseDepository class Notify extends BaseRepository
{ {
/** @var Factory\Notify */ /** @var Factory\Notify */
protected $factory; protected $factory;

View file

@ -19,9 +19,9 @@
* *
*/ */
namespace Friendica\Profile\ProfileField\Depository; namespace Friendica\Profile\ProfileField\Repository;
use Friendica\BaseDepository; use Friendica\BaseRepository;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Profile\ProfileField\Exception\ProfileFieldNotFoundException; use Friendica\Profile\ProfileField\Exception\ProfileFieldNotFoundException;
use Friendica\Profile\ProfileField\Exception\ProfileFieldPersistenceException; use Friendica\Profile\ProfileField\Exception\ProfileFieldPersistenceException;
@ -29,11 +29,11 @@ use Friendica\Profile\ProfileField\Exception\UnexpectedPermissionSetException;
use Friendica\Profile\ProfileField\Factory; use Friendica\Profile\ProfileField\Factory;
use Friendica\Profile\ProfileField\Entity; use Friendica\Profile\ProfileField\Entity;
use Friendica\Profile\ProfileField\Collection; use Friendica\Profile\ProfileField\Collection;
use Friendica\Security\PermissionSet\Depository\PermissionSet as PermissionSetDepository; use Friendica\Security\PermissionSet\Repository\PermissionSet as PermissionSetRepository;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class ProfileField extends BaseDepository class ProfileField extends BaseRepository
{ {
/** @var Factory\ProfileField */ /** @var Factory\ProfileField */
protected $factory; protected $factory;
@ -42,14 +42,14 @@ class ProfileField extends BaseDepository
protected static $view_name = 'profile_field-view'; protected static $view_name = 'profile_field-view';
/** @var PermissionSetDepository */ /** @var PermissionSetRepository */
protected $permissionSetDepository; protected $permissionSetRepository;
public function __construct(Database $database, LoggerInterface $logger, Factory\ProfileField $factory, PermissionSetDepository $permissionSetDepository) public function __construct(Database $database, LoggerInterface $logger, Factory\ProfileField $factory, PermissionSetRepository $permissionSetRepository)
{ {
parent::__construct($database, $logger, $factory); parent::__construct($database, $logger, $factory);
$this->permissionSetDepository = $permissionSetDepository; $this->permissionSetRepository = $permissionSetRepository;
} }
/** /**
@ -124,7 +124,7 @@ class ProfileField extends BaseDepository
public function selectPublicFieldsByUserId(int $uid): Collection\ProfileFields public function selectPublicFieldsByUserId(int $uid): Collection\ProfileFields
{ {
try { try {
$publicPermissionSet = $this->permissionSetDepository->selectPublicForUser($uid); $publicPermissionSet = $this->permissionSetRepository->selectPublicForUser($uid);
return $this->select([ return $this->select([
'uid' => $uid, 'uid' => $uid,
@ -162,12 +162,12 @@ class ProfileField extends BaseDepository
*/ */
public function selectByContactId(int $cid, int $uid): Collection\ProfileFields public function selectByContactId(int $cid, int $uid): Collection\ProfileFields
{ {
$permissionSets = $this->permissionSetDepository->selectByContactId($cid, $uid); $permissionSets = $this->permissionSetRepository->selectByContactId($cid, $uid);
$permissionSetIds = $permissionSets->column('id'); $permissionSetIds = $permissionSets->column('id');
// Includes public custom fields // Includes public custom fields
$permissionSetIds[] = $this->permissionSetDepository->selectPublicForUser($uid)->id; $permissionSetIds[] = $this->permissionSetRepository->selectPublicForUser($uid)->id;
return $this->select( return $this->select(
['uid' => $uid, 'psid' => $permissionSetIds], ['uid' => $uid, 'psid' => $permissionSetIds],

View file

@ -1782,7 +1782,7 @@ class Transmitter
{ {
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
$suggestion = DI::fsuggest()->getById($suggestion_id); $suggestion = DI::fsuggest()->selectOneById($suggestion_id);
$data = ['@context' => ActivityPub::CONTEXT, $data = ['@context' => ActivityPub::CONTEXT,
'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'id' => DI::baseUrl() . '/activity/' . System::createGUID(),

View file

@ -1,93 +0,0 @@
<?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);
}
}

View file

@ -1,4 +1,23 @@
<?php <?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\Security\PermissionSet\Collection; namespace Friendica\Security\PermissionSet\Collection;

View file

@ -1,9 +1,28 @@
<?php <?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\Security\PermissionSet\Entity; namespace Friendica\Security\PermissionSet\Entity;
use Friendica\BaseEntity; use Friendica\BaseEntity;
use Friendica\Security\PermissionSet\Depository\PermissionSet as PermissionSetDepository; use Friendica\Security\PermissionSet\Repository\PermissionSet as PermissionSetRepository;
/** /**
* @property-read int|null $id * @property-read int|null $id
@ -55,7 +74,7 @@ class PermissionSet extends BaseEntity
*/ */
public function isPublic(): bool public function isPublic(): bool
{ {
return (($this->id === PermissionSetDepository::PUBLIC) || return (($this->id === PermissionSetRepository::PUBLIC) ||
(is_null($this->id) && (is_null($this->id) &&
empty($this->allow_cid) && empty($this->allow_cid) &&
empty($this->allow_gid) && empty($this->allow_gid) &&

View file

@ -1,4 +1,23 @@
<?php <?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\Security\PermissionSet\Factory; namespace Friendica\Security\PermissionSet\Factory;

View file

@ -19,10 +19,10 @@
* *
*/ */
namespace Friendica\Security\PermissionSet\Depository; namespace Friendica\Security\PermissionSet\Repository;
use Exception; use Exception;
use Friendica\BaseDepository; use Friendica\BaseRepository;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Model\Group; use Friendica\Model\Group;
@ -33,7 +33,7 @@ use Friendica\Security\PermissionSet\Entity;
use Friendica\Util\ACLFormatter; use Friendica\Util\ACLFormatter;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class PermissionSet extends BaseDepository class PermissionSet extends BaseRepository
{ {
/** @var int Virtual permission set id for public permission */ /** @var int Virtual permission set id for public permission */
const PUBLIC = 0; const PUBLIC = 0;

View file

@ -1,4 +1,23 @@
<?php <?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\Security\TwoFactor\Collection; namespace Friendica\Security\TwoFactor\Collection;

View file

@ -1,4 +1,23 @@
<?php <?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\Security\TwoFactor\Factory; namespace Friendica\Security\TwoFactor\Factory;

View file

@ -1,4 +1,23 @@
<?php <?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\Security\TwoFactor\Model; namespace Friendica\Security\TwoFactor\Model;

View file

@ -1,4 +1,23 @@
<?php <?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\Security\TwoFactor\Repository; namespace Friendica\Security\TwoFactor\Repository;

View file

@ -80,7 +80,7 @@ class RemoveContent
DBA::delete('contact-relation', ['relation-cid' => $id]); DBA::delete('contact-relation', ['relation-cid' => $id]);
DBA::delete('contact-relation', ['cid' => $id]); DBA::delete('contact-relation', ['cid' => $id]);
DBA::delete('event', ['cid' => $id]); DBA::delete('event', ['cid' => $id]);
DBA::delete('fsuggest', ['cid' => $id]); DI::fsuggest()->delete(DI::fsuggest()->selectForContact($id));
DBA::delete('post-tag', ['cid' => $id]); DBA::delete('post-tag', ['cid' => $id]);
DBA::delete('user-contact', ['cid' => $id]); DBA::delete('user-contact', ['cid' => $id]);

View file

@ -21,6 +21,8 @@
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Contact\FriendSuggest\Collection\FriendSuggests;
use Friendica\Contact\FriendSuggest\Exception\FriendSuggestNotFoundException;
use Friendica\Core\Logger; use Friendica\Core\Logger;
use Friendica\Core\Protocol; use Friendica\Core\Protocol;
use Friendica\Database\DBA; use Friendica\Database\DBA;
@ -64,8 +66,10 @@ class Delivery
} }
$uid = $target_item['uid']; $uid = $target_item['uid'];
} elseif ($cmd == self::SUGGESTION) { } elseif ($cmd == self::SUGGESTION) {
$target_item = DBA::selectFirst('fsuggest', [], ['id' => $post_uriid]); try {
if (!DBA::isResult($target_item)) { $target_item = DI::fsuggest()->selectOneById($post_uriid)->toArray();
} catch (FriendSuggestNotFoundException $e) {
DI::logger()->info('Cannot find FriendSuggestion', ['id' => $post_uriid]);
return; return;
} }
$uid = $target_item['uid']; $uid = $target_item['uid'];
@ -209,7 +213,7 @@ class Delivery
// Also transmit via Diaspora if this is a direct answer to a Diaspora comment. // Also transmit via Diaspora if this is a direct answer to a Diaspora comment.
// This is done since the uri wouldn't match (Diaspora doesn't transmit it) // This is done since the uri wouldn't match (Diaspora doesn't transmit it)
// Also transmit relayed posts from Diaspora contacts via Diaspora. // Also transmit relayed posts from Diaspora contacts via Diaspora.
if (($contact['network'] != Protocol::DIASPORA) && in_array(Protocol::DIASPORA, [$parent['network'] ?? '', $thr_parent['network'] ?? '', $target_item['network']])) { if (($contact['network'] != Protocol::DIASPORA) && in_array(Protocol::DIASPORA, [$parent['network'] ?? '', $thr_parent['network'] ?? '', $target_item['network']] ?? '')) {
Logger::info('Enforcing the Diaspora protocol', ['id' => $contact['id'], 'network' => $contact['network'], 'parent' => $parent['network'], 'thread-parent' => $thr_parent['network'], 'post' => $target_item['network']]); Logger::info('Enforcing the Diaspora protocol', ['id' => $contact['id'], 'network' => $contact['network'], 'parent' => $parent['network'], 'thread-parent' => $thr_parent['network'], 'post' => $target_item['network']]);
$contact['network'] = Protocol::DIASPORA; $contact['network'] = Protocol::DIASPORA;
} }
@ -269,7 +273,7 @@ class Delivery
private static function deliverDFRN($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup, $server_protocol) private static function deliverDFRN($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup, $server_protocol)
{ {
// Transmit Diaspora reshares via Diaspora if the Friendica contact support Diaspora // Transmit Diaspora reshares via Diaspora if the Friendica contact support Diaspora
if (Diaspora::isReshare($target_item['body']) && !empty(FContact::getByURL($contact['addr'], false))) { if (Diaspora::isReshare($target_item['body'] ?? '') && !empty(FContact::getByURL($contact['addr'], false))) {
Logger::info('Reshare will be transmitted via Diaspora', ['url' => $contact['url'], 'guid' => ($target_item['guid'] ?? '') ?: $target_item['id']]); Logger::info('Reshare will be transmitted via Diaspora', ['url' => $contact['url'], 'guid' => ($target_item['guid'] ?? '') ?: $target_item['id']]);
self::deliverDiaspora($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup); self::deliverDiaspora($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup);
return; return;
@ -284,7 +288,7 @@ class Delivery
} elseif ($cmd == self::SUGGESTION) { } elseif ($cmd == self::SUGGESTION) {
$item = $target_item; $item = $target_item;
$atom = DFRN::fsuggest($item, $owner); $atom = DFRN::fsuggest($item, $owner);
DBA::delete('fsuggest', ['id' => $item['id']]); DI::fsuggest()->delete(new FriendSuggests([DI::fsuggest()->selectOneById($item['id'])]));
} elseif ($cmd == self::RELOCATION) { } elseif ($cmd == self::RELOCATION) {
$atom = DFRN::relocate($owner, $owner['uid']); $atom = DFRN::relocate($owner, $owner['uid']);
} elseif ($followup) { } elseif ($followup) {

View file

@ -90,7 +90,7 @@ class Notifier
'APDelivery', $cmd, $target_id, $inbox, $uid, $receivers, $post_uriid); 'APDelivery', $cmd, $target_id, $inbox, $uid, $receivers, $post_uriid);
} }
} elseif ($cmd == Delivery::SUGGESTION) { } elseif ($cmd == Delivery::SUGGESTION) {
$suggest = DI::fsuggest()->getById($target_id); $suggest = DI::fsuggest()->selectOneById($target_id);
$uid = $suggest->uid; $uid = $suggest->uid;
$recipients[] = $suggest->cid; $recipients[] = $suggest->cid;
} elseif ($cmd == Delivery::REMOVAL) { } elseif ($cmd == Delivery::REMOVAL) {

View file

@ -0,0 +1,122 @@
<?php
namespace Friendica\Test\src\Contact\FriendSuggest\Factory;
use Friendica\Contact\FriendSuggest\Factory\FriendSuggest;
use Friendica\Contact\FriendSuggest\Entity;
use Friendica\Test\MockedTest;
use Friendica\Util\Logger\VoidLogger;
class FriendSuggestTest extends MockedTest
{
public function dataCreate()
{
return [
'default' => [
'input' => [
'uid' => 12,
'cid' => 13,
'name' => 'test',
'url' => 'https://friendica.local/profile/test',
'request' => 'https://friendica.local/dfrn_request/test',
'photo' => 'https://friendica.local/photo/profile/test',
'note' => 'a common note',
'created' => '2021-10-12 12:23:00'
],
'assertion' => new Entity\FriendSuggest(
12,
13,
'test',
'https://friendica.local/profile/test',
'https://friendica.local/dfrn_request/test',
'https://friendica.local/photo/profile/test',
'a common note',
new \DateTime('2021-10-12 12:23:00', new \DateTimeZone('UTC'))
),
],
'minimum' => [
'input' => [
'id' => 20,
],
'assertion' => new Entity\FriendSuggest(
0,
0,
'',
'',
'',
'',
'',
new \DateTime('now', new \DateTimeZone('URC')),
28
),
],
'full' => [
'input' => [
'uid' => 12,
'cid' => 13,
'name' => 'test',
'url' => 'https://friendica.local/profile/test',
'request' => 'https://friendica.local/dfrn_request/test',
'photo' => 'https://friendica.local/photo/profile/test',
'note' => 'a common note',
'created' => '2021-10-12 12:23:00',
'id' => 666,
],
'assertion' => new Entity\FriendSuggest(
12,
13,
'test',
'https://friendica.local/profile/test',
'https://friendica.local/dfrn_request/test',
'https://friendica.local/photo/profile/test',
'a common note',
new \DateTime('2021-10-12 12:23:00', new \DateTimeZone('UTC')),
666
),
],
];
}
public function assertFriendSuggest(Entity\FriendSuggest $assertion, Entity\FriendSuggest $friendSuggest)
{
self::assertEquals($assertion->id, $friendSuggest->id);
self::assertEquals($assertion->uid, $friendSuggest->uid);
self::assertEquals($assertion->cid, $friendSuggest->cid);
self::assertEquals($assertion->name, $friendSuggest->name);
self::assertEquals($assertion->url, $friendSuggest->url);
self::assertEquals($assertion->request, $friendSuggest->request);
self::assertEquals($assertion->photo, $friendSuggest->photo);
self::assertEquals($assertion->note, $friendSuggest->note);
}
public function testCreateNew()
{
$factory = new FriendSuggest(new VoidLogger());
$this->assertFriendSuggest(
$factory->createNew(12, 13),
new Entity\FriendSuggest(12, 13, '', '', '', '', '',
new \DateTime('now', new \DateTimeZone('UTC')), null
)
);
}
/**
* @dataProvider dataCreate
*/
public function testCreateFromTableRow(array $input, Entity\FriendSuggest $assertion)
{
$factory = new FriendSuggest(new VoidLogger());
$this->assertFriendSuggest($factory->createFromTableRow($input), $assertion);
}
public function testCreateEmpty()
{
$factory = new FriendSuggest(new VoidLogger());
$this->assertFriendSuggest($factory->createEmpty(66), new Entity\FriendSuggest(0, 0, '', '', '', '', '',
new \DateTime('now', new \DateTimeZone('UTC')), 66
));
}
}

View file

@ -6,7 +6,7 @@ use Friendica\Profile\ProfileField\Entity\ProfileField;
use Friendica\Profile\ProfileField\Exception\ProfileFieldNotFoundException; use Friendica\Profile\ProfileField\Exception\ProfileFieldNotFoundException;
use Friendica\Profile\ProfileField\Exception\UnexpectedPermissionSetException; use Friendica\Profile\ProfileField\Exception\UnexpectedPermissionSetException;
use Friendica\Profile\ProfileField\Factory\ProfileField as ProfileFieldFactory; use Friendica\Profile\ProfileField\Factory\ProfileField as ProfileFieldFactory;
use Friendica\Security\PermissionSet\Depository\PermissionSet as PermissionSetDepository; use Friendica\Security\PermissionSet\Repository\PermissionSet as PermissionSetRepository;
use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory; use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory;
use Friendica\Test\MockedTest; use Friendica\Test\MockedTest;
use Friendica\Util\ACLFormatter; use Friendica\Util\ACLFormatter;
@ -16,8 +16,8 @@ use Mockery\MockInterface;
class ProfileFieldTest extends MockedTest class ProfileFieldTest extends MockedTest
{ {
/** @var MockInterface|PermissionSetDepository */ /** @var MockInterface|PermissionSetRepository */
protected $permissionSetDepository; protected $permissionSetRepository;
/** @var ProfileFieldFactory */ /** @var ProfileFieldFactory */
protected $profileFieldFactory; protected $profileFieldFactory;
/** @var MockInterface|PermissionSetFactory */ /** @var MockInterface|PermissionSetFactory */
@ -27,7 +27,7 @@ class ProfileFieldTest extends MockedTest
{ {
parent::setUp(); parent::setUp();
$this->permissionSetDepository = \Mockery::mock(PermissionSetDepository::class); $this->permissionSetRepository = \Mockery::mock(PermissionSetRepository::class);
$this->permissionSetFactory = new PermissionSetFactory(new VoidLogger(), new ACLFormatter()); $this->permissionSetFactory = new PermissionSetFactory(new VoidLogger(), new ACLFormatter());
$this->profileFieldFactory = new ProfileFieldFactory(new VoidLogger(), $this->permissionSetFactory); $this->profileFieldFactory = new ProfileFieldFactory(new VoidLogger(), $this->permissionSetFactory);
} }
@ -180,7 +180,7 @@ class ProfileFieldTest extends MockedTest
$permissionSet = $this->permissionSetFactory->createFromTableRow(['uid' => $uid, 'id' => $psid]); $permissionSet = $this->permissionSetFactory->createFromTableRow(['uid' => $uid, 'id' => $psid]);
$this->permissionSetDepository->shouldReceive('selectOneById')->with($psid, $uid)->andReturns($permissionSet); $this->permissionSetRepository->shouldReceive('selectOneById')->with($psid, $uid)->andReturns($permissionSet);
self::assertEquals($psid, $entity->permissionSet->id); self::assertEquals($psid, $entity->permissionSet->id);
} }

View file

@ -1,27 +1,27 @@
<?php <?php
namespace Friendica\Test\src\Profile\ProfileField\Depository; namespace Friendica\Test\src\Profile\ProfileField\Repository;
use Friendica\Profile\ProfileField\Collection\ProfileFields; use Friendica\Profile\ProfileField\Collection\ProfileFields;
use Friendica\Profile\ProfileField\Depository\ProfileField as ProfileFieldDepository; use Friendica\Profile\ProfileField\Repository\ProfileField as ProfileFieldRepository;
use Friendica\Profile\ProfileField\Exception\ProfileFieldPersistenceException; use Friendica\Profile\ProfileField\Exception\ProfileFieldPersistenceException;
use Friendica\Profile\ProfileField\Factory\ProfileField as ProfileFieldFactory; use Friendica\Profile\ProfileField\Factory\ProfileField as ProfileFieldFactory;
use Friendica\Security\PermissionSet\Depository\PermissionSet; use Friendica\Security\PermissionSet\Repository\PermissionSet;
use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory; use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory;
use Friendica\Security\PermissionSet\Depository\PermissionSet as PermissionSetDepository; use Friendica\Security\PermissionSet\Repository\PermissionSet as PermissionSetRepository;
use Friendica\Test\FixtureTest; use Friendica\Test\FixtureTest;
use Friendica\DI; use Friendica\DI;
class ProfileFieldTest extends FixtureTest class ProfileFieldTest extends FixtureTest
{ {
/** @var ProfileFieldDepository */ /** @var ProfileFieldRepository */
private $depository; private $depository;
/** @var ProfileFieldFactory */ /** @var ProfileFieldFactory */
private $factory; private $factory;
/** @var PermissionSetFactory */ /** @var PermissionSetFactory */
private $permissionSetFactory; private $permissionSetFactory;
/** @var PermissionSetDepository */ /** @var PermissionSetRepository */
private $permissionSetDepository; private $permissionSetRepository;
public function setUp(): void public function setUp(): void
{ {
@ -30,7 +30,7 @@ class ProfileFieldTest extends FixtureTest
$this->depository = DI::profileField(); $this->depository = DI::profileField();
$this->factory = DI::profileFieldFactory(); $this->factory = DI::profileFieldFactory();
$this->permissionSetFactory = DI::permissionSetFactory(); $this->permissionSetFactory = DI::permissionSetFactory();
$this->permissionSetDepository = DI::permissionSet(); $this->permissionSetRepository = DI::permissionSet();
} }
/** /**
@ -53,7 +53,7 @@ class ProfileFieldTest extends FixtureTest
*/ */
public function testSaveNew() public function testSaveNew()
{ {
$profileField = $this->factory->createFromValues(42, 0, 'public', 'value', $this->permissionSetDepository->save($this->permissionSetFactory->createFromString(42, '', '<~>'))); $profileField = $this->factory->createFromValues(42, 0, 'public', 'value', $this->permissionSetRepository->save($this->permissionSetFactory->createFromString(42, '', '<~>')));
self::assertEquals($profileField->uid, $profileField->permissionSet->uid); self::assertEquals($profileField->uid, $profileField->permissionSet->uid);
@ -75,7 +75,7 @@ class ProfileFieldTest extends FixtureTest
*/ */
public function testUpdateOrder() public function testUpdateOrder()
{ {
$profileField = $this->factory->createFromValues(42, 0, 'public', 'value', $this->permissionSetDepository->save($this->permissionSetFactory->createFromString(42, '', '<~>'))); $profileField = $this->factory->createFromValues(42, 0, 'public', 'value', $this->permissionSetRepository->save($this->permissionSetFactory->createFromString(42, '', '<~>')));
self::assertEquals($profileField->uid, $profileField->permissionSet->uid); self::assertEquals($profileField->uid, $profileField->permissionSet->uid);
@ -108,7 +108,7 @@ class ProfileFieldTest extends FixtureTest
*/ */
public function testUpdate() public function testUpdate()
{ {
$profileField = $this->factory->createFromValues(42, 0, 'public', 'value', $this->permissionSetDepository->save($this->permissionSetFactory->createFromString(42, '', '<~>'))); $profileField = $this->factory->createFromValues(42, 0, 'public', 'value', $this->permissionSetRepository->save($this->permissionSetFactory->createFromString(42, '', '<~>')));
self::assertEquals($profileField->uid, $profileField->permissionSet->uid); self::assertEquals($profileField->uid, $profileField->permissionSet->uid);
@ -121,12 +121,12 @@ class ProfileFieldTest extends FixtureTest
self::assertEquals($savedProfileField, $selectedProfileField); self::assertEquals($savedProfileField, $selectedProfileField);
$savedProfileField->update('another', 5, $this->permissionSetDepository->selectPublicForUser(42)); $savedProfileField->update('another', 5, $this->permissionSetRepository->selectPublicForUser(42));
self::assertEquals(PermissionSet::PUBLIC, $savedProfileField->permissionSet->id); self::assertEquals(PermissionSet::PUBLIC, $savedProfileField->permissionSet->id);
$publicProfileField = $this->depository->save($savedProfileField); $publicProfileField = $this->depository->save($savedProfileField);
self::assertEquals($this->permissionSetDepository->selectPublicForUser(42), $publicProfileField->permissionSet); self::assertEquals($this->permissionSetRepository->selectPublicForUser(42), $publicProfileField->permissionSet);
self::assertEquals('another', $publicProfileField->value); self::assertEquals('another', $publicProfileField->value);
self::assertEquals(5, $publicProfileField->order); self::assertEquals(5, $publicProfileField->order);

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Friendica\Test\src\Security\PermissionSet\Depository; namespace Friendica\Test\src\Security\PermissionSet\Repository;
use Friendica\Security\PermissionSet\Depository\PermissionSet as PermissionSetDepository; use Friendica\Security\PermissionSet\Repository\PermissionSet as PermissionSetRepository;
use Friendica\Security\PermissionSet\Entity\PermissionSet; use Friendica\Security\PermissionSet\Entity\PermissionSet;
use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory; use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory;
use Friendica\Test\FixtureTest; use Friendica\Test\FixtureTest;
@ -10,8 +10,8 @@ use Friendica\DI;
class PermissionSetTest extends FixtureTest class PermissionSetTest extends FixtureTest
{ {
/** @var PermissionSetDepository */ /** @var PermissionSetRepository */
private $depository; private $repository;
/** @var PermissionSetFactory */ /** @var PermissionSetFactory */
private $factory; private $factory;
@ -19,20 +19,20 @@ class PermissionSetTest extends FixtureTest
{ {
parent::setUp(); parent::setUp();
$this->depository = DI::permissionSet(); $this->repository = DI::permissionSet();
$this->factory = DI::permissionSetFactory(); $this->factory = DI::permissionSetFactory();
} }
public function testSelectOneByIdPublic() public function testSelectOneByIdPublic()
{ {
$permissionSet = $this->depository->selectPublicForUser(1); $permissionSet = $this->repository->selectPublicForUser(1);
$this->assertInstanceOf(PermissionSet::class, $permissionSet); $this->assertInstanceOf(PermissionSet::class, $permissionSet);
self::assertEmpty($permissionSet->allow_cid); self::assertEmpty($permissionSet->allow_cid);
self::assertEmpty($permissionSet->allow_gid); self::assertEmpty($permissionSet->allow_gid);
self::assertEmpty($permissionSet->deny_cid); self::assertEmpty($permissionSet->deny_cid);
self::assertEmpty($permissionSet->deny_gid); self::assertEmpty($permissionSet->deny_gid);
self::assertEmpty(PermissionSetDepository::PUBLIC, $permissionSet->id); self::assertEmpty(PermissionSetRepository::PUBLIC, $permissionSet->id);
self::assertEquals(1, $permissionSet->uid); self::assertEquals(1, $permissionSet->uid);
} }
@ -43,21 +43,21 @@ class PermissionSetTest extends FixtureTest
{ {
$permissionSet = $this->factory->createFromString(42, '', '<~>'); $permissionSet = $this->factory->createFromString(42, '', '<~>');
$permissionSet = $this->depository->selectOrCreate($permissionSet); $permissionSet = $this->repository->selectOrCreate($permissionSet);
self::assertNotNull($permissionSet->id); self::assertNotNull($permissionSet->id);
$permissionSetSelected = $this->depository->selectOneById($permissionSet->id, 42); $permissionSetSelected = $this->repository->selectOneById($permissionSet->id, 42);
self::assertEquals($permissionSet, $permissionSetSelected); self::assertEquals($permissionSet, $permissionSetSelected);
$newPermissionSet = $permissionSet->withAllowedContacts(['1', '2']); $newPermissionSet = $permissionSet->withAllowedContacts(['1', '2']);
$savedPermissionSet = $this->depository->save($newPermissionSet); $savedPermissionSet = $this->repository->save($newPermissionSet);
self::assertNotNull($savedPermissionSet->id); self::assertNotNull($savedPermissionSet->id);
self::assertNull($newPermissionSet->id); self::assertNull($newPermissionSet->id);
$permissionSetSavedSelected = $this->depository->selectOneById($savedPermissionSet->id, 42); $permissionSetSavedSelected = $this->repository->selectOneById($savedPermissionSet->id, 42);
self::assertEquals($savedPermissionSet, $permissionSetSavedSelected); self::assertEquals($savedPermissionSet, $permissionSetSavedSelected);
} }

View file

@ -55,7 +55,7 @@ use Friendica\Model\Photo;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Model\Profile; use Friendica\Model\Profile;
use Friendica\Model\Storage; use Friendica\Model\Storage;
use Friendica\Security\PermissionSet\Depository\PermissionSet; use Friendica\Security\PermissionSet\Repository\PermissionSet;
use Friendica\Worker\Delivery; use Friendica\Worker\Delivery;
// Post-update script of PR 5751 // Post-update script of PR 5751

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 2021.12-dev\n" "Project-Id-Version: 2021.12-dev\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-23 17:25+0000\n" "POT-Creation-Date: 2021-10-23 21:51-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -393,7 +393,7 @@ msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:141 #: src/Module/Debug/ActivityPubConversion.php:141
#: src/Module/Debug/Babel.php:313 src/Module/Debug/Localtime.php:64 #: src/Module/Debug/Babel.php:313 src/Module/Debug/Localtime.php:64
#: src/Module/Debug/Probe.php:56 src/Module/Debug/WebFinger.php:53 #: src/Module/Debug/Probe.php:56 src/Module/Debug/WebFinger.php:53
#: src/Module/Delegation.php:147 src/Module/FriendSuggest.php:129 #: src/Module/Delegation.php:147 src/Module/FriendSuggest.php:128
#: src/Module/Install.php:245 src/Module/Install.php:287 #: src/Module/Install.php:245 src/Module/Install.php:287
#: src/Module/Install.php:324 src/Module/Invite.php:177 #: src/Module/Install.php:324 src/Module/Invite.php:177
#: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:247 #: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:247
@ -1114,11 +1114,11 @@ msgstr ""
#: mod/redir.php:55 mod/redir.php:129 src/Module/Contact/Advanced.php:54 #: mod/redir.php:55 mod/redir.php:129 src/Module/Contact/Advanced.php:54
#: src/Module/Contact/Advanced.php:105 src/Module/Contact/Contacts.php:36 #: src/Module/Contact/Advanced.php:105 src/Module/Contact/Contacts.php:36
#: src/Module/Contact/Media.php:43 src/Module/FriendSuggest.php:54 #: src/Module/Contact/Media.php:43 src/Module/FriendSuggest.php:54
#: src/Module/FriendSuggest.php:93 src/Module/Group.php:105 #: src/Module/FriendSuggest.php:92 src/Module/Group.php:105
msgid "Contact not found." msgid "Contact not found."
msgstr "" msgstr ""
#: mod/removeme.php:63 src/Navigation/Notifications/Depository/Notify.php:454 #: mod/removeme.php:63 src/Navigation/Notifications/Repository/Notify.php:454
msgid "[Friendica System Notify]" msgid "[Friendica System Notify]"
msgstr "" msgstr ""
@ -7903,15 +7903,15 @@ msgstr ""
msgid "Suggested contact not found." msgid "Suggested contact not found."
msgstr "" msgstr ""
#: src/Module/FriendSuggest.php:84 #: src/Module/FriendSuggest.php:83
msgid "Friend suggestion sent." msgid "Friend suggestion sent."
msgstr "" msgstr ""
#: src/Module/FriendSuggest.php:121 #: src/Module/FriendSuggest.php:120
msgid "Suggest Friends" msgid "Suggest Friends"
msgstr "" msgstr ""
#: src/Module/FriendSuggest.php:124 #: src/Module/FriendSuggest.php:123
#, php-format #, php-format
msgid "Suggest a friend for %s" msgid "Suggest a friend for %s"
msgstr "" msgstr ""
@ -9920,262 +9920,6 @@ msgid ""
"features and resources." "features and resources."
msgstr "" msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:192
#: src/Navigation/Notifications/Depository/Notify.php:675
msgid "[Friendica:Notify]"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:256
#, php-format
msgid "%s New mail received at %s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:258
#, php-format
msgid "%1$s sent you a new private message at %2$s."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:259
msgid "a private message"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:259
#, php-format
msgid "%1$s sent you %2$s."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:261
#, php-format
msgid "Please visit %s to view and/or reply to your private messages."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:292
#, php-format
msgid "%1$s commented on %2$s's %3$s %4$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:297
#, php-format
msgid "%1$s commented on your %2$s %3$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:301
#, php-format
msgid "%1$s commented on their %2$s %3$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:305
#: src/Navigation/Notifications/Depository/Notify.php:710
#, php-format
msgid "%1$s Comment to conversation #%2$d by %3$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:307
#, php-format
msgid "%s commented on an item/conversation you have been following."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:311
#: src/Navigation/Notifications/Depository/Notify.php:326
#: src/Navigation/Notifications/Depository/Notify.php:345
#: src/Navigation/Notifications/Depository/Notify.php:725
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:318
#, php-format
msgid "%s %s posted to your profile wall"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:320
#, php-format
msgid "%1$s posted to your profile wall at %2$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:321
#, php-format
msgid "%1$s posted to [url=%2$s]your wall[/url]"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:333
#, php-format
msgid "%1$s %2$s poked you"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:335
#, php-format
msgid "%1$s poked you at %2$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:336
#, php-format
msgid "%1$s [url=%2$s]poked you[/url]."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:353
#, php-format
msgid "%s Introduction received"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:355
#, php-format
msgid "You've received an introduction from '%1$s' at %2$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:356
#, php-format
msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:361
#: src/Navigation/Notifications/Depository/Notify.php:407
#, php-format
msgid "You may visit their profile at %s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:363
#, php-format
msgid "Please visit %s to approve or reject the introduction."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:370
#, php-format
msgid "%s A new person is sharing with you"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:372
#: src/Navigation/Notifications/Depository/Notify.php:373
#, php-format
msgid "%1$s is sharing with you at %2$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:380
#, php-format
msgid "%s You have a new follower"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:382
#: src/Navigation/Notifications/Depository/Notify.php:383
#, php-format
msgid "You have a new follower at %2$s : %1$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:396
#, php-format
msgid "%s Friend suggestion received"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:398
#, php-format
msgid "You've received a friend suggestion from '%1$s' at %2$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:399
#, php-format
msgid "You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:405
msgid "Name:"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:406
msgid "Photo:"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:409
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:417
#: src/Navigation/Notifications/Depository/Notify.php:432
#, php-format
msgid "%s Connection accepted"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:419
#: src/Navigation/Notifications/Depository/Notify.php:434
#, php-format
msgid "'%1$s' has accepted your connection request at %2$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:420
#: src/Navigation/Notifications/Depository/Notify.php:435
#, php-format
msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:425
msgid ""
"You are now mutual friends and may exchange status updates, photos, and "
"email without restriction."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:427
#, php-format
msgid "Please visit %s if you wish to make any changes to this relationship."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:440
#, php-format
msgid ""
"'%1$s' has chosen to accept you a fan, which restricts some forms of "
"communication - such as private messaging and some profile interactions. If "
"this is a celebrity or community page, these settings were applied "
"automatically."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:442
#, php-format
msgid ""
"'%1$s' may choose to extend this into a two-way or more permissive "
"relationship in the future."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:444
#, php-format
msgid "Please visit %s if you wish to make any changes to this relationship."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:454
msgid "registration request"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:456
#, php-format
msgid "You've received a registration request from '%1$s' at %2$s"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:457
#, php-format
msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:462
#, php-format
msgid ""
"Full Name:\t%s\n"
"Site Location:\t%s\n"
"Login Name:\t%s (%s)"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:468
#, php-format
msgid "Please visit %s to approve or reject the request."
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:704
#, php-format
msgid "%s %s tagged you"
msgstr ""
#: src/Navigation/Notifications/Depository/Notify.php:707
#, php-format
msgid "%s %s shared a new post"
msgstr ""
#: src/Navigation/Notifications/Factory/FormattedNotification.php:89 #: src/Navigation/Notifications/Factory/FormattedNotification.php:89
#, php-format #, php-format
msgid "%s liked %s's post" msgid "%s liked %s's post"
@ -10334,6 +10078,262 @@ msgstr ""
msgid "%1$s shared a post" msgid "%1$s shared a post"
msgstr "" msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:192
#: src/Navigation/Notifications/Repository/Notify.php:675
msgid "[Friendica:Notify]"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:256
#, php-format
msgid "%s New mail received at %s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:258
#, php-format
msgid "%1$s sent you a new private message at %2$s."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:259
msgid "a private message"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:259
#, php-format
msgid "%1$s sent you %2$s."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:261
#, php-format
msgid "Please visit %s to view and/or reply to your private messages."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:292
#, php-format
msgid "%1$s commented on %2$s's %3$s %4$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:297
#, php-format
msgid "%1$s commented on your %2$s %3$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:301
#, php-format
msgid "%1$s commented on their %2$s %3$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:305
#: src/Navigation/Notifications/Repository/Notify.php:710
#, php-format
msgid "%1$s Comment to conversation #%2$d by %3$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:307
#, php-format
msgid "%s commented on an item/conversation you have been following."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:311
#: src/Navigation/Notifications/Repository/Notify.php:326
#: src/Navigation/Notifications/Repository/Notify.php:345
#: src/Navigation/Notifications/Repository/Notify.php:725
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:318
#, php-format
msgid "%s %s posted to your profile wall"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:320
#, php-format
msgid "%1$s posted to your profile wall at %2$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:321
#, php-format
msgid "%1$s posted to [url=%2$s]your wall[/url]"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:333
#, php-format
msgid "%1$s %2$s poked you"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:335
#, php-format
msgid "%1$s poked you at %2$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:336
#, php-format
msgid "%1$s [url=%2$s]poked you[/url]."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:353
#, php-format
msgid "%s Introduction received"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:355
#, php-format
msgid "You've received an introduction from '%1$s' at %2$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:356
#, php-format
msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:361
#: src/Navigation/Notifications/Repository/Notify.php:407
#, php-format
msgid "You may visit their profile at %s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:363
#, php-format
msgid "Please visit %s to approve or reject the introduction."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:370
#, php-format
msgid "%s A new person is sharing with you"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:372
#: src/Navigation/Notifications/Repository/Notify.php:373
#, php-format
msgid "%1$s is sharing with you at %2$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:380
#, php-format
msgid "%s You have a new follower"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:382
#: src/Navigation/Notifications/Repository/Notify.php:383
#, php-format
msgid "You have a new follower at %2$s : %1$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:396
#, php-format
msgid "%s Friend suggestion received"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:398
#, php-format
msgid "You've received a friend suggestion from '%1$s' at %2$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:399
#, php-format
msgid "You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:405
msgid "Name:"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:406
msgid "Photo:"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:409
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:417
#: src/Navigation/Notifications/Repository/Notify.php:432
#, php-format
msgid "%s Connection accepted"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:419
#: src/Navigation/Notifications/Repository/Notify.php:434
#, php-format
msgid "'%1$s' has accepted your connection request at %2$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:420
#: src/Navigation/Notifications/Repository/Notify.php:435
#, php-format
msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:425
msgid ""
"You are now mutual friends and may exchange status updates, photos, and "
"email without restriction."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:427
#, php-format
msgid "Please visit %s if you wish to make any changes to this relationship."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:440
#, php-format
msgid ""
"'%1$s' has chosen to accept you a fan, which restricts some forms of "
"communication - such as private messaging and some profile interactions. If "
"this is a celebrity or community page, these settings were applied "
"automatically."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:442
#, php-format
msgid ""
"'%1$s' may choose to extend this into a two-way or more permissive "
"relationship in the future."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:444
#, php-format
msgid "Please visit %s if you wish to make any changes to this relationship."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:454
msgid "registration request"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:456
#, php-format
msgid "You've received a registration request from '%1$s' at %2$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:457
#, php-format
msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:462
#, php-format
msgid ""
"Full Name:\t%s\n"
"Site Location:\t%s\n"
"Login Name:\t%s (%s)"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:468
#, php-format
msgid "Please visit %s to approve or reject the request."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:704
#, php-format
msgid "%s %s tagged you"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:707
#, php-format
msgid "%s %s shared a new post"
msgstr ""
#: src/Object/EMail/ItemCCEMail.php:42 #: src/Object/EMail/ItemCCEMail.php:42
#, php-format #, php-format
msgid "" msgid ""
@ -10687,7 +10687,7 @@ msgstr ""
msgid "%1$d %2$s ago" msgid "%1$d %2$s ago"
msgstr "" msgstr ""
#: src/Worker/Delivery.php:521 #: src/Worker/Delivery.php:525
msgid "(no subject)" msgid "(no subject)"
msgstr "" msgstr ""