/**
* Tests if the given contact is a follower
*
- * @param int $cid Either public contact id or user's contact id
- * @param int $uid User ID
+ * @param int $cid Either public contact id or user's contact id
+ * @param int $uid User ID
+ * @param bool $strict If "true" then contact mustn't be set to pending or readonly
*
* @return boolean is the contact id a follower?
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public static function isFollower(int $cid, int $uid): bool
+ public static function isFollower(int $cid, int $uid, bool $strict = false): bool
{
if (Contact\User::isBlocked($cid, $uid)) {
return false;
}
$condition = ['id' => $cdata['user'], 'rel' => [self::FOLLOWER, self::FRIEND]];
+ if ($strict) {
+ $condition = array_merge($condition, ['pending' => false, 'readonly' => false, 'blocked' => false]);
+ }
return DBA::exists('contact', $condition);
}
/**
* Tests if the given contact url is a follower
*
- * @param string $url Contact URL
- * @param int $uid User ID
+ * @param string $url Contact URL
+ * @param int $uid User ID
+ * @param bool $strict If "true" then contact mustn't be set to pending or readonly
*
* @return boolean is the contact id a follower?
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public static function isFollowerByURL(string $url, int $uid): bool
+ public static function isFollowerByURL(string $url, int $uid, bool $strict = false): bool
{
$cid = self::getIdForURL($url, $uid);
return false;
}
- return self::isFollower($cid, $uid);
+ return self::isFollower($cid, $uid, $strict);
}
/**
* Tests if the given user shares with the given contact
*
- * @param int $cid Either public contact id or user's contact id
- * @param int $uid User ID
+ * @param int $cid Either public contact id or user's contact id
+ * @param int $uid User ID
+ * @param bool $strict If "true" then contact mustn't be set to pending or readonly
*
* @return boolean is the contact sharing with given user?
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public static function isSharing(int $cid, int $uid): bool
+ public static function isSharing(int $cid, int $uid, bool $strict = false): bool
{
if (Contact\User::isBlocked($cid, $uid)) {
return false;
}
$condition = ['id' => $cdata['user'], 'rel' => [self::SHARING, self::FRIEND]];
+ if ($strict) {
+ $condition = array_merge($condition, ['pending' => false, 'readonly' => false, 'blocked' => false]);
+ }
return DBA::exists('contact', $condition);
}
/**
* Tests if the given user follow the given contact url
*
- * @param string $url Contact URL
- * @param int $uid User ID
+ * @param string $url Contact URL
+ * @param int $uid User ID
+ * @param bool $strict If "true" then contact mustn't be set to pending or readonly
*
* @return boolean is the contact url being followed?
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public static function isSharingByURL(string $url, int $uid): bool
+ public static function isSharingByURL(string $url, int $uid, bool $strict = false): bool
{
$cid = self::getIdForURL($url, $uid);
return false;
}
- return self::isSharing($cid, $uid);
+ return self::isSharing($cid, $uid, $strict);
}
/**
$item['origin'] = 0;
$item['wall'] = 0;
- if ($item['gravity'] == GRAVITY_PARENT) {
- $contact = Contact::getByURLForUser($item['owner-link'], $uid, false, ['id']);
- } else {
- $contact = Contact::getByURLForUser($item['author-link'], $uid, false, ['id']);
+ if (!empty($item['causer-id']) && Contact::isSharing($item['causer-id'], $uid, true)) {
+ $cdata = Contact::getPublicAndUserContactID($item['causer-id'], $uid);
+ $contact_id = $cdata['user'] ?? 0;
}
- if (!empty($contact['id'])) {
- $item['contact-id'] = $contact['id'];
- } else {
- // Shouldn't happen at all
- Logger::warning('contact-id could not be fetched', ['uid' => $uid, 'item' => $item]);
- $self = DBA::selectFirst('contact', ['id'], ['self' => true, 'uid' => $uid]);
- if (!DBA::isResult($self)) {
- // Shouldn't happen even less
- Logger::warning('self contact could not be fetched', ['uid' => $uid, 'item' => $item]);
- return 0;
+ if (empty($contact_id)) {
+ if ($item['gravity'] == GRAVITY_PARENT) {
+ if (Contact::isSharingByURL($item['owner-link'], $uid, true)) {
+ $contact_id = Contact::getIdForURL($item['owner-link'], $uid);
+ } else {
+ $contact_id = Contact::getIdForURL($item['owner-link']);
+ }
+ } else {
+ if (Contact::isSharingByURL($item['author-link'], $uid, true)) {
+ $contact_id = Contact::getIdForURL($item['author-link'], $uid);
+ } else {
+ $contact_id = Contact::getIdForURL($item['author-link']);
+ }
}
- $item['contact-id'] = $self['id'];
}
+ if (empty($contact_id)) {
+ Logger::warning('contact-id could not be fetched, using self contact instead.', ['uid' => $uid, 'item' => $item]);
+ $self = Contact::selectFirst(['id'], ['self' => true, 'uid' => $uid]);
+ $contact_id = $self['id'];
+ }
+
+ $item['contact-id'] = $contact_id;
+
$notify = false;
if ($item['gravity'] == GRAVITY_PARENT) {
$contact = DBA::selectFirst('contact', [], ['id' => $item['contact-id'], 'self' => false]);