]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Profile.php
Properly unlink all old avatars when deleting/uploading a new
[quix0rs-gnu-social.git] / classes / Profile.php
index 5d7946bcd8d0f93b0fe6d8957ea3998f79d9de87..afb3df6a5b8cebf98f386aa24a93d2d2ac2ea801 100644 (file)
@@ -82,6 +82,16 @@ class Profile extends Managed_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
+    public static function getByEmail($email)
+    {
+        // in the future, profiles should have emails stored...
+        $user = User::getKV('email', $email);
+        if (!($user instanceof User)) {
+            throw new NoSuchUserException(array('email'=>$email));
+        }
+        return $user->getProfile();
+    } 
+
     protected $_user = -1;  // Uninitialized value distinct from null
 
     public function getUser()
@@ -89,7 +99,7 @@ class Profile extends Managed_DataObject
         if ($this->_user === -1) {
             $this->_user = User::getKV('id', $this->id);
         }
-        if (!is_a($this->_user, 'User')) {
+        if (!($this->_user instanceof User)) {
             throw new NoSuchUserException(array('id'=>$this->id));
         }
 
@@ -106,42 +116,47 @@ class Profile extends Managed_DataObject
         return true;
     }
 
-    protected $_avatars;
-
-    function getAvatar($width, $height=null)
+    public function getAvatar($width, $height=null)
     {
+        $width = (int) floor($width);
+
         if (is_null($height)) {
             $height = $width;
         }
 
-        $avatar = $this->_getAvatar($width);
-
-        if (empty($avatar)) {
-
-            if (Event::handle('StartProfileGetAvatar', array($this, $width, &$avatar))) {
-                $avatar = Avatar::pkeyGet(
-                    array(
-                        'profile_id' => $this->id,
-                        'width'      => $width,
-                        'height'     => $height
-                    )
-                );
-                Event::handle('EndProfileGetAvatar', array($this, $width, &$avatar));
-            }
+        try {
+            return $this->_getAvatar($width);
+        } catch (Exception $e) {
+            $avatar = null;
+        }
+        
+        if (Event::handle('StartProfileGetAvatar', array($this, $width, &$avatar))) {
+            $avatar = Avatar::pkeyGet(
+                array(
+                    'profile_id' => $this->id,
+                    'width'      => $width,
+                    'height'     => $height
+                )
+            );
+            Event::handle('EndProfileGetAvatar', array($this, $width, &$avatar));
+        }
 
-            $this->_fillAvatar($width, $avatar);
+        if (is_null($avatar)) {
+            // Obviously we can't find an avatar, so let's resize the original!
+            $avatar = Avatar::newSize($this, $width);
         }
 
+        // cache the avatar for future use
+        $this->_fillAvatar($width, $avatar);
+
         return $avatar;
     }
 
+    protected $_avatars = array();
+
     // XXX: @Fix me gargargar
     function _getAvatar($width)
     {
-        if (empty($this->_avatars)) {
-            $this->_avatars = array();
-        }
-
         // GAR! I cannot figure out where _avatars gets pre-filled with the avatar from
         // the previously used profile! Please shoot me now! --Zach
         if (array_key_exists($width, $this->_avatars)) {
@@ -151,24 +166,23 @@ class Profile extends Managed_DataObject
             }
         }
 
-        return null;
+        throw new Exception('No cached avatar available for size ');
     }
 
-    function _fillAvatar($width, $avatar)
+    protected function _fillAvatar($width, $avatar)
     {
-      //common_debug("Storing avatar of width: {$avatar->width} and profile_id {$avatar->profile_id} in profile {$this->id}.");
-        $this->_avatars[$width] = $avatar;
-
+        // This avoids storing null values, a problem report in issue #3478
+        if (!empty($avatar)) {
+           $this->_avatars[$width] = $avatar;
+        }
     }
 
-    function getOriginalAvatar()
+    // For backwards compatibility only!
+    public function getOriginalAvatar()
     {
-        $pkey = array('profile_id' => $this->id,
-                      'original'   => true);
-        $avatar = Avatar::pkeyGet($pkey);
-        if (!empty($avatar)) {
-            return $avatar;
-        } else {
+        try {
+            return Avatar::getOriginal($this);
+        } catch (Exception $e) {
             return null;
         }
     }
@@ -188,8 +202,8 @@ class Profile extends Managed_DataObject
         $avatar->created = DB_DataObject_Cast::dateTime(); # current time
 
         // XXX: start a transaction here
-
-        if (!$this->delete_avatars() || !$avatar->insert()) {
+        if (!Avatar::deleteFromProfile($this, true) || !$avatar->insert()) {
+            // If we can't delete the old avatars, let's abort right here.
             @unlink(Avatar::path($filename));
             return null;
         }
@@ -197,21 +211,10 @@ class Profile extends Managed_DataObject
         foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
             // We don't do a scaled one if original is our scaled size
             if (!($avatar->width == $size && $avatar->height == $size)) {
-                $scaled_filename = $imagefile->resize($size);
-
-                //$scaled = DB_DataObject::factory('avatar');
-                $scaled = new Avatar();
-                $scaled->profile_id = $this->id;
-                $scaled->width = $size;
-                $scaled->height = $size;
-                $scaled->original = false;
-                $scaled->mediatype = image_type_to_mime_type($imagefile->type);
-                $scaled->filename = $scaled_filename;
-                $scaled->url = Avatar::url($scaled_filename);
-                $scaled->created = DB_DataObject_Cast::dateTime(); # current time
-
-                if (!$scaled->insert()) {
-                    return null;
+                try {
+                    Avatar::newSize($this, $size);
+                } catch (Exception $e) {
+                    // should we abort the generation and live without smaller avatars?
                 }
             }
         }
@@ -219,30 +222,6 @@ class Profile extends Managed_DataObject
         return $avatar;
     }
 
-    /**
-     * Delete attached avatars for this user from the database and filesystem.
-     * This should be used instead of a batch delete() to ensure that files
-     * get removed correctly.
-     *
-     * @param boolean $original true to delete only the original-size file
-     * @return <type>
-     */
-    function delete_avatars($original=true)
-    {
-        $avatar = new Avatar();
-        $avatar->profile_id = $this->id;
-        $avatar->find();
-        while ($avatar->fetch()) {
-            if ($avatar->original) {
-                if ($original == false) {
-                    continue;
-                }
-            }
-            $avatar->delete();
-        }
-        return true;
-    }
-
     /**
      * Gets either the full name (if filled) or the nickname.
      *
@@ -628,48 +607,27 @@ class Profile extends Managed_DataObject
 
     function avatarUrl($size=AVATAR_PROFILE_SIZE)
     {
-        $avatar = $this->getAvatar($size);
-        if ($avatar) {
+        $size = floor($size);
+        try {
+            $avatar = $this->getAvatar($size);
             return $avatar->displayUrl();
-        } else {
+        } catch (Exception $e) {
             return Avatar::defaultImage($size);
         }
     }
 
-    function getSubscriptions($offset=0, $limit=null)
+    function getSubscribed($offset=0, $limit=null)
     {
-        $subs = Subscription::bySubscriber($this->id,
-                                           $offset,
-                                           $limit);
-
-        $profiles = array();
-
-        while ($subs->fetch()) {
-            $profile = Profile::getKV($subs->subscribed);
-            if ($profile) {
-                $profiles[] = $profile;
-            }
-        }
-
-        return new ArrayWrapper($profiles);
+        $subs = Subscription::getSubscribedIDs($this->id, $offset, $limit);
+        $profiles = Profile::listFind('id', $subs);
+        return $profiles;
     }
 
     function getSubscribers($offset=0, $limit=null)
     {
-        $subs = Subscription::bySubscribed($this->id,
-                                           $offset,
-                                           $limit);
-
-        $profiles = array();
-
-        while ($subs->fetch()) {
-            $profile = Profile::getKV($subs->subscriber);
-            if ($profile) {
-                $profiles[] = $profile;
-            }
-        }
-
-        return new ArrayWrapper($profiles);
+        $subs = Subscription::getSubscriberIDs($this->id, $offset, $limit);
+        $profiles = Profile::listFind('id', $subs);
+        return $profiles;
     }
 
     function getTaggedSubscribers($tag)
@@ -927,7 +885,7 @@ class Profile extends Managed_DataObject
         $this->_deleteMessages();
         $this->_deleteTags();
         $this->_deleteBlocks();
-        $this->delete_avatars();
+        Avatar::deleteFromProfile($this, true);
 
         // Warning: delete() will run on the batch objects,
         // not on individual objects.
@@ -1339,12 +1297,26 @@ class Profile extends Managed_DataObject
         return $noun->asString('activity:' . $element);
     }
 
+    /**
+     * Returns the profile's canonical url, not necessarily a uri/unique id
+     *
+     * @return string $profileurl
+     */
+    public function getUrl()
+    {
+        if (empty($this->profileurl) ||
+                !filter_var($this->profileurl, FILTER_VALIDATE_URL)) {
+            throw new InvalidUrlException($this->profileurl);
+        }
+        return $this->profileurl;
+    }
+
     /**
      * Returns the best URI for a profile. Plugins may override.
      *
      * @return string $uri
      */
-    function getUri()
+    public function getUri()
     {
         $uri = null;