'note' => $introduction->note,
'hash' => $introduction->hash,
'blocked' => $introduction->blocked ? 1 : 0,
- 'ignore' => $introduction->ignore ? 1 : 0
+ 'ignore' => $introduction->ignore ? 1 : 0,
+ 'datetime' => $introduction->datetime->format(DateTimeFormat::MYSQL),
];
}
return new Collection\Introductions($BaseCollection->getArrayCopy(), $BaseCollection->getTotalCount());
}
+ /**
+ * Selects the introduction for a given contact
+ *
+ * @param int $cid
+ *
+ * @return Entity\Introduction
+ *
+ * @throws IntroductionNotFoundException in case there is not Introduction for this contact
+ */
+ public function selectForContact(int $cid): Entity\Introduction
+ {
+ try {
+ return $this->selectOne(['contact-id' => $cid]);
+ } catch (NotFoundException $exception) {
+ throw new IntroductionNotFoundException(sprintf('There is no Introduction for the contact %d', $cid), $exception);
+ }
+ }
+
+ public function countActiveForUser($uid, array $params = []): int
+ {
+ try {
+ return $this->count(['blocked' => false, 'ignore' => false, 'uid' => $uid], $params);
+ } catch (\Exception $e) {
+ throw new IntroductionPersistenceException(sprintf('Cannot count Introductions for used %d', $uid), $e);
+ }
+ }
+
+ public function existsForContact(int $cid, int $uid): bool
+ {
+ try {
+ return $this->exists(['uid' => $uid, 'suggest-cid' => $cid]);
+ } catch (\Exception $e) {
+ throw new IntroductionPersistenceException(sprintf('Cannot check Introductions for contact %d and user %d', $cid, $uid), $e);
+ }
+ }
+
/**
* @param Entity\Introduction $introduction
*
public function save(Entity\Introduction $introduction): Entity\Introduction
{
try {
- $fields = $this->convertToTableRow($introduction);
- $fields['datetime'] = DateTimeFormat::utcNow();
+ $fields = $this->convertToTableRow($introduction);
if ($introduction->id) {
$this->db->update(self::$table_name, $fields, ['id' => $introduction->id]);
/**
* @property-read int $uid
- * @property-read int $fid
- * @property-read int $cid
* @property-read int $sid
+ * @property-read int|null $fid
+ * @property-read int|null $cid
* @property-read bool $knowyou
* @property-read bool $duplex
* @property-read string $note
/** @var int */
protected $uid;
/** @var int */
+ protected $sid;
+ /** @var int|null */
protected $fid;
- /** @var int */
+ /** @var int|null */
protected $cid;
- /** @var int */
- protected $sid;
/** @var bool */
protected $knowyou;
/** @var bool */
protected $id;
/**
- * @param int $uid
- * @param int $fid
- * @param int $cid
- * @param bool $knowyou
- * @param bool $duplex
- * @param string $note
- * @param string $hash
- * @param bool $blocked
- * @param bool $ignore
- * @param int|null $id
+ * @param int $uid
+ * @param int $sid
+ * @param int|null $fid
+ * @param int|null $cid
+ * @param bool $knowyou
+ * @param bool $duplex
+ * @param string $note
+ * @param string $hash
+ * @param \DateTime $datetime
+ * @param bool $blocked
+ * @param bool $ignore
+ * @param int|null $id
*/
- public function __construct(int $uid, int $fid, int $cid, int $sid, bool $knowyou, bool $duplex, string $note, string $hash, \DateTime $datetime, bool $blocked, bool $ignore, ?int $id)
+ public function __construct(int $uid, int $sid, ?int $fid, ?int $cid, bool $knowyou, bool $duplex, string $note, string $hash, \DateTime $datetime, bool $blocked, bool $ignore, ?int $id)
{
$this->uid = $uid;
+ $this->sid = $sid;
$this->fid = $fid;
$this->cid = $cid;
- $this->sid = $sid;
$this->knowyou = $knowyou;
$this->duplex = $duplex;
$this->note = $note;
use Friendica\BaseFactory;
use Friendica\Contact\Introduction\Entity;
use Friendica\Capabilities\ICanCreateFromTableRow;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Strings;
class Introduction extends BaseFactory implements ICanCreateFromTableRow
{
public function createFromTableRow(array $row): Entity\Introduction
{
return new Entity\Introduction(
- $row['uid'],
- $row['fid'],
- $row['contact-id'],
- $row['suggested-cid'],
+ $row['uid'] ?? 0,
+ $row['suggest-cid'] ?? 0,
+ $row['fid'] ?? null,
+ $row['contact-id'] ?? null,
!empty($row['knowyou']),
- !empty($row['dupley']),
- $row['note'],
- $row['hash'],
- new \DateTime($row['datetime'], new \DateTimeZone('UTC')),
+ !empty($row['duplex']),
+ $row['note'] ?? '',
+ $row['hash'] ?? '',
+ new \DateTime($row['datetime'] ?? 'now', new \DateTimeZone('UTC')),
!empty($row['blocked']),
!empty($row['ignore']),
$row['id'] ?? null
);
}
+
+ public function createNew(
+ int $uid,
+ int $cid,
+ string $note,
+ int $fid = null,
+ int $sid = null,
+ bool $knowyou = false,
+ bool $duplex = false
+ ): Entity\Introduction {
+ return $this->createFromTableRow([
+ 'uid' => $uid,
+ 'fid' => $fid,
+ 'contact-id' => $cid,
+ 'suggest-cid' => $sid,
+ 'knowyou' => $knowyou,
+ 'duplex' => $duplex,
+ 'note' => $note,
+ 'hash' => Strings::getRandomHex(),
+ 'datetime' => DateTimeFormat::utcNow(),
+ 'blocked' => false,
+ 'ignore' => false,
+ ]);
+ }
+
+ public function createDummy(int $id): Entity\Introduction
+ {
+ return $this->createFromTableRow(['id' => $id]);
+ }
}
return self::$dice->create(Contact\Introduction\Depository\Introduction::class);
}
+ /**
+ * @return Contact\Introduction\Factory\Introduction
+ */
+ public static function introFactory()
+ {
+ return self::$dice->create(Contact\Introduction\Factory\Introduction::class);
+ }
+
public static function permissionSet(): Security\PermissionSet\Depository\PermissionSet
{
return self::$dice->create(Security\PermissionSet\Depository\PermissionSet::class);
namespace Friendica\Model;
use Friendica\App\BaseURL;
+use Friendica\Contact\Introduction\Exception\IntroductionNotFoundException;
use Friendica\Content\Pager;
use Friendica\Content\Text\HTML;
use Friendica\Core\Hook;
];
if (!empty($contact['pending'])) {
- $intro = DBA::selectFirst('intro', ['id'], ['contact-id' => $contact['id']]);
- if (DBA::isResult($intro)) {
+ try {
+ $intro = DI::intro()->selectForContact($contact['id']);
$menu['follow'] = [DI::l10n()->t('Approve'), 'notifications/intros/' . $intro['id'], true];
+ } catch (IntroductionNotFoundException $exception) {
+ DI::logger()->error('Pending contact doesn\'t have an introduction.', ['exception' => $exception]);
}
}
}
$user = DBA::selectFirst('user', $fields, ['uid' => $importer['uid']]);
if (DBA::isResult($user) && !in_array($user['page-flags'], [User::PAGE_FLAGS_SOAPBOX, User::PAGE_FLAGS_FREELOVE, User::PAGE_FLAGS_COMMUNITY])) {
// create notification
- $hash = Strings::getRandomHex();
-
if (is_array($contact_record)) {
- DBA::insert('intro', ['uid' => $importer['uid'], 'contact-id' => $contact_record['id'],
- 'blocked' => false, 'knowyou' => false, 'note' => $note,
- 'hash' => $hash, 'datetime' => DateTimeFormat::utcNow()]);
+ $intro = DI::introFactory()->createNew(
+ $importer['uid'],
+ $contact_record['id'],
+ $note
+ );
+ DI::intro()->save($intro);
}
Group::addMember(User::getDefaultGroup($importer['uid'], $contact_record["network"]), $contact_record['id']);
$params = ['distinct' => true, 'expression' => 'convid'];
$notifications += DBA::count('mail', ['uid' => $identity['uid'], 'seen' => false], $params);
- $notifications += DBA::count('intro', ['blocked' => false, 'ignore' => false, 'uid' => $identity['uid']]);
+ $notifications += DI::intro()->countActiveForUser($identity['uid']);
$identities[$key]['notifications'] = $notifications;
}
}
// Quit if we already have an introduction for this person
- if (DBA::exists('intro', ['uid' => $uid, 'suggest-cid' => $cid])) {
+ if (DI::intro()->existsForContact($cid, $uid)) {
return false;
}
$suggest['title'] = '';
$suggest['body'] = $note;
- $hash = Strings::getRandomHex();
- $fields = ['uid' => $suggest['uid'], 'suggest-cid' => $cid, 'contact-id' => $suggest['cid'],
- 'note' => $suggest['body'], 'hash' => $hash, 'datetime' => DateTimeFormat::utcNow(), 'blocked' => false];
- DBA::insert('intro', $fields);
+ DI::intro()->save(DI::introFactory()->createNew(
+ $suggest['uid'],
+ $suggest['cid'],
+ $suggest['body'],
+ null,
+ $cid
+ ));
DI::notify()->createFromArray([
'type' => Notification\Type::SUGGEST,
use Friendica\Core\Logger;
use Friendica\Database\DBA;
use Friendica\Database\DBStructure;
+use Friendica\DI;
use Friendica\Model\Photo;
use Friendica\Model\Post;
DBA::delete('user-contact', ['cid' => $id]);
DBA::delete('group_member', ['contact-id' => $id]);
- DBA::delete('intro', ['contact-id' => $id]);
+ DI::intro()->delete(DI::introFactory()->createDummy($id));
return $contact;
}