<?php
/**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
use Exception;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
-use Friendica\Core\System;
use Friendica\Database\Database;
use Friendica\Database\DBA;
-use Friendica\Database\DBStructure;
+use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\ItemURI;
use PDOException;
*/
class User
{
+ const FREQUENCY_DEFAULT = 0;
+ const FREQUENCY_NEVER = 1;
+ const FREQUENCY_ALWAYS = 2;
+ const FREQUENCY_REDUCED = 3;
/**
* Insert a user-contact for a given contact array
*
}
if (empty($contact['uri-id']) && empty($contact['url'])) {
- Logger::info('Missing contact details', ['contact' => $contact, 'callstack' => System::callstack(20)]);
+ Logger::info('Missing contact details', ['contact' => $contact]);
return false;
}
$update_fields = self::preparedFields($fields);
if (!empty($update_fields)) {
- $contacts = DBA::select('contact', ['uri-id', 'uid'], $condition);
+ $contacts = DBA::select('account-user-view', ['pid', 'uri-id', 'uid'], $condition);
while ($contact = DBA::fetch($contacts)) {
if (empty($contact['uri-id']) || empty($contact['uid'])) {
continue;
}
- $ret = DBA::update('user-contact', $update_fields, ['uri-id' => $contact['uri-id'], 'uid' => $contact['uid']]);
- Logger::info('Updated user contact', ['uid' => $contact['uid'], 'uri-id' => $contact['uri-id'], 'ret' => $ret]);
+ $update_fields['cid'] = $contact['pid'];
+ $ret = DBA::update('user-contact', $update_fields, ['uri-id' => $contact['uri-id'], 'uid' => $contact['uid']], true);
+ Logger::info('Updated user contact', ['uid' => $contact['uid'], 'id' => $contact['pid'], 'uri-id' => $contact['uri-id'], 'ret' => $ret]);
}
DBA::close($contacts);
$fields['rel'] = Contact::SELF;
}
- return DBStructure::getFieldsForTable('user-contact', $fields);
+ return DI::dbaDefinition()->truncateFieldsForTable('user-contact', $fields);
}
/**
if (!empty($cdata['public'])) {
$public_contact = DBA::selectFirst('user-contact', ['blocked'], ['cid' => $cdata['public'], 'uid' => $uid]);
if (DBA::isResult($public_contact)) {
- $public_blocked = $public_contact['blocked'];
+ $public_blocked = (bool) $public_contact['blocked'];
}
}
if (!empty($cdata['user'])) {
$user_contact = DBA::selectFirst('contact', ['blocked'], ['id' => $cdata['user'], 'pending' => false]);
if (DBA::isResult($user_contact)) {
- $user_blocked = $user_contact['blocked'];
+ $user_blocked = (bool) $user_contact['blocked'];
}
}
if (!empty($cdata['public'])) {
$public_contact = DBA::selectFirst('user-contact', ['ignored'], ['cid' => $cdata['public'], 'uid' => $uid]);
if (DBA::isResult($public_contact)) {
- $public_ignored = $public_contact['ignored'];
+ $public_ignored = (bool) $public_contact['ignored'];
}
}
if (!empty($cdata['user'])) {
$user_contact = DBA::selectFirst('contact', ['readonly'], ['id' => $cdata['user'], 'pending' => false]);
if (DBA::isResult($user_contact)) {
- $user_ignored = $user_contact['readonly'];
+ $user_ignored = (bool) $user_contact['readonly'];
}
}
if (!empty($cdata['public'])) {
$public_contact = DBA::selectFirst('user-contact', ['collapsed'], ['cid' => $cdata['public'], 'uid' => $uid]);
if (DBA::isResult($public_contact)) {
- $collapsed = $public_contact['collapsed'];
+ $collapsed = (bool) $public_contact['collapsed'];
}
}
return $collapsed;
}
+ /**
+ * Set the channel post frequency for contact id and user id
+ *
+ * @param int $cid Either public contact id or user's contact id
+ * @param int $uid User ID
+ * @param int $frequency Type of post frequency in channels
+ * @return void
+ * @throws \Exception
+ */
+ public static function setChannelFrequency(int $cid, int $uid, int $frequency)
+ {
+ $cdata = Contact::getPublicAndUserContactID($cid, $uid);
+ if (empty($cdata)) {
+ return;
+ }
+
+ DBA::update('user-contact', ['channel-frequency' => $frequency], ['cid' => $cdata['public'], 'uid' => $uid], true);
+ }
+
+ /**
+ * Returns the channel frequency state for contact id and user id
+ *
+ * @param int $cid Either public contact id or user's contact id
+ * @param int $uid User ID
+ * @return int Type of post frequency in channels
+ * @throws HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public static function getChannelFrequency(int $cid, int $uid): int
+ {
+ $cdata = Contact::getPublicAndUserContactID($cid, $uid);
+ if (empty($cdata)) {
+ return false;
+ }
+
+ $frequency = self::FREQUENCY_DEFAULT;
+
+ if (!empty($cdata['public'])) {
+ $public_contact = DBA::selectFirst('user-contact', ['channel-frequency'], ['cid' => $cdata['public'], 'uid' => $uid]);
+ if (DBA::isResult($public_contact)) {
+ $frequency = $public_contact['channel-frequency'] ?? self::FREQUENCY_DEFAULT;
+ }
+ }
+
+ return $frequency;
+ }
+
/**
* Set/Release that the user is blocked by the contact
*