]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact/User.php
Merge pull request #13561 from annando/log-callstack
[friendica.git] / src / Model / Contact / User.php
index c656d1f003f1066396d6fa25abf1e6ac61492385..c86b1c6bea8d1aba1037a96ed35528a04cfbe4c8 100644 (file)
@@ -1,6 +1,6 @@
 <?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
  *
@@ -24,10 +24,9 @@ namespace Friendica\Model\Contact;
 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;
@@ -37,6 +36,10 @@ 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
         *
@@ -51,7 +54,7 @@ class User
                }
 
                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;
                }
 
@@ -94,13 +97,14 @@ class User
 
                $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);
@@ -129,7 +133,7 @@ class User
                        $fields['rel'] = Contact::SELF;
                }
 
-               return DBStructure::getFieldsForTable('user-contact', $fields);
+               return DI::dbaDefinition()->truncateFieldsForTable('user-contact', $fields);
        }
 
        /**
@@ -313,6 +317,53 @@ class User
                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
         *