X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FProfile.php;h=5ace57004ce716c1ae64d43abade10651f367d93;hb=4467615021fad00ab92df0a79a9a792cbcb7280e;hp=ac008877c4bcae1d18ac3656e00913a0e054b3bf;hpb=5304373b0b5c9905b30c85b565c23246d377467b;p=quix0rs-gnu-social.git diff --git a/classes/Profile.php b/classes/Profile.php index ac008877c4..5ace57004c 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -1,7 +1,7 @@ 'local and remote users have profiles', + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'nickname' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'nickname or username', 'collate' => 'utf8_general_ci'), + 'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name', 'collate' => 'utf8_general_ci'), + 'profileurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL, cached so we dont regenerate'), + 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'identifying URL', 'collate' => 'utf8_general_ci'), + 'bio' => array('type' => 'text', 'description' => 'descriptive biography', 'collate' => 'utf8_general_ci'), + 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'physical location', 'collate' => 'utf8_general_ci'), + 'lat' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'latitude'), + 'lon' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'longitude'), + 'location_id' => array('type' => 'int', 'description' => 'location id if possible'), + 'location_ns' => array('type' => 'int', 'description' => 'namespace for location'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'indexes' => array( + 'profile_nickname_idx' => array('nickname'), + ), + 'fulltext indexes' => array( + 'nickname' => array('nickname', 'fullname', 'location', 'bio', 'homepage') + ), + ); + } + + function multiGet($keyCol, $keyVals, $skipNulls=true) + { + return parent::multiGet('Profile', $keyCol, $keyVals, $skipNulls); + } + /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE @@ -63,16 +98,41 @@ class Profile extends Memcached_DataObject return $this->_user; } + protected $_avatars; + function getAvatar($width, $height=null) { if (is_null($height)) { $height = $width; } - return Avatar::pkeyGet(array('profile_id' => $this->id, - 'width' => $width, - 'height' => $height)); + + if (!isset($this->_avatars)) { + $this->_avatars = array(); + } + + if (array_key_exists($width, $this->_avatars)) { + return $this->_avatars[$width]; + } + + $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->_avatars[$width] = $avatar; + + return $avatar; } + function _fillAvatar($width, $avatar) + { + $this->_avatars[$width] = $avatar; + } + function getOriginalAvatar() { $avatar = DB_DataObject::factory('avatar'); @@ -217,9 +277,14 @@ class Profile extends Memcached_DataObject function isMember($group) { - $gm = Group_member::pkeyGet(array('profile_id' => $this->id, - 'group_id' => $group->id)); - return (!empty($gm)); + $groups = $this->getGroups(0, null); + $gs = $groups->fetchAll(); + foreach ($gs as $g) { + if ($group->id == $g->id) { + return true; + } + } + return false; } function isAdmin($group) @@ -260,16 +325,7 @@ class Profile extends Memcached_DataObject self::cacheSet($keypart, implode(',', $ids)); } - $groups = array(); - - foreach ($ids as $id) { - $group = User_group::staticGet('id', $id); - if (!empty($group)) { - $groups[] = $group; - } - } - - return new ArrayWrapper($groups); + return User_group::multiGet('id', $ids); } function isTagged($peopletag) @@ -313,36 +369,66 @@ class Profile extends Memcached_DataObject return false; } - function getOwnedTags($auth_user, $offset=0, $limit=null, $since_id=0, $max_id=0) + function getLists($auth_user, $offset=0, $limit=null, $since_id=0, $max_id=0) { - $tags = new Profile_list(); - $tags->tagger = $this->id; + $ids = array(); - if (($auth_user instanceof User || $auth_user instanceof Profile) && - $auth_user->id === $this->id) { - // no condition, get both private and public tags + $keypart = sprintf('profile:lists:%d', $this->id); + + $idstr = self::cacheGet($keypart); + + if ($idstr !== false) { + $ids = explode(',', $idstr); } else { - $tags->private = false; - } + $list = new Profile_list(); + $list->selectAdd(); + $list->selectAdd('id'); + $list->tagger = $this->id; + $list->selectAdd('id as "cursor"'); + + if ($since_id>0) { + $list->whereAdd('id > '.$since_id); + } - $tags->selectAdd('id as "cursor"'); + if ($max_id>0) { + $list->whereAdd('id <= '.$max_id); + } - if ($since_id>0) { - $tags->whereAdd('id > '.$since_id); - } + if($offset>=0 && !is_null($limit)) { + $list->limit($offset, $limit); + } - if ($max_id>0) { - $tags->whereAdd('id <= '.$max_id); - } + $list->orderBy('id DESC'); - if($offset>=0 && !is_null($limit)) { - $tags->limit($offset, $limit); + if ($list->find()) { + while ($list->fetch()) { + $ids[] = $list->id; + } + } + + self::cacheSet($keypart, implode(',', $ids)); } - $tags->orderBy('id DESC'); - $tags->find(); + $showPrivate = (($auth_user instanceof User || + $auth_user instanceof Profile) && + $auth_user->id === $this->id); - return $tags; + $lists = array(); + + foreach ($ids as $id) { + $list = Profile_list::staticGet('id', $id); + if (!empty($list) && + ($showPrivate || !$list->private)) { + + if (!isset($list->cursor)) { + $list->cursor = $list->id; + } + + $lists[] = $list; + } + } + + return new ArrayWrapper($lists); } function getOtherTags($auth_user=null, $offset=0, $limit=null, $since_id=0, $max_id=0) @@ -353,6 +439,7 @@ class Profile extends Memcached_DataObject $tags->tagged = $this->id; $lists->joinAdd($tags); + #@fixme: postgres (round(date_part('epoch', my_date))) $lists->selectAdd('unix_timestamp(profile_tag.modified) as "cursor"'); @@ -425,7 +512,8 @@ class Profile extends Memcached_DataObject $lists = new Profile_list(); $subs = new Profile_tag_subscription(); - $lists->joinAdd($subs); + $lists->joinAdd('id', 'profile_tag_subscription:profile_tag_id'); + #@fixme: postgres (round(date_part('epoch', my_date))) $lists->selectAdd('unix_timestamp(profile_tag_subscription.created) as "cursor"'); @@ -690,7 +778,7 @@ class Profile extends Memcached_DataObject $faves = new Fave(); $faves->user_id = $this->id; - $cnt = (int) $faves->count('distinct notice_id'); + $cnt = (int) $faves->count('notice_id'); if (!empty($c)) { $c->set(Cache::key('profile:fave_count:'.$this->id), $cnt); @@ -1202,13 +1290,8 @@ class Profile extends Memcached_DataObject if (!empty($user)) { $uri = $user->uri; - } else { - // return OMB profile if any - $remote = Remote_profile::staticGet('id', $this->id); - if (!empty($remote)) { - $uri = $remote->uri; - } } + Event::handle('EndGetProfileUri', array($this, &$uri)); } @@ -1253,11 +1336,6 @@ class Profile extends Memcached_DataObject $user = User::staticGet('uri', $uri); if (!empty($user)) { $profile = $user->getProfile(); - } else { - $remote_profile = Remote_profile::staticGet('uri', $uri); - if (!empty($remote_profile)) { - $profile = Profile::staticGet('id', $remote_profile->profile_id); - } } Event::handle('EndGetProfileFromURI', array($uri, $profile)); } @@ -1304,4 +1382,47 @@ class Profile extends Memcached_DataObject return true; } + + static function current() + { + $user = common_current_user(); + if (empty($user)) { + $profile = null; + } else { + $profile = $user->getProfile(); + } + return $profile; + } + + /** + * Magic function called at serialize() time. + * + * We use this to drop a couple process-specific references + * from DB_DataObject which can cause trouble in future + * processes. + * + * @return array of variable names to include in serialization. + */ + + function __sleep() + { + $vars = parent::__sleep(); + $skip = array('_user', '_avatars'); + return array_diff($vars, $skip); + } + + static function fillAvatars(&$profiles, $width) + { + $ids = array(); + foreach ($profiles as $profile) { + $ids[] = $profile->id; + } + + $avatars = Avatar::pivotGet('profile_id', $ids, array('width' => $width, + 'height' => $width)); + + foreach ($profiles as $profile) { + $profile->_fillAvatar($width, $avatars[$profile->id]); + } + } }