From a54eb0941e4f8c9948149c9a7046fe200d7e47f2 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 21 Mar 2011 15:04:32 -0700 Subject: [PATCH] Tweaking request_queue -> group_join_queue, easier to deal with the indexes and keys and caching this way. --- classes/Group_join_queue.php | 54 ++++++++++++++++++++++++++++++++++ classes/Managed_DataObject.php | 1 + classes/Profile.php | 18 +++++++----- classes/Request_queue.php | 50 ------------------------------- classes/User_group.php | 3 ++ db/core.php | 2 +- lib/groupeditform.php | 6 ++-- 7 files changed, 73 insertions(+), 61 deletions(-) create mode 100644 classes/Group_join_queue.php delete mode 100644 classes/Request_queue.php diff --git a/classes/Group_join_queue.php b/classes/Group_join_queue.php new file mode 100644 index 0000000000..d8deb253b1 --- /dev/null +++ b/classes/Group_join_queue.php @@ -0,0 +1,54 @@ + 'Holder for group join requests awaiting moderation.', + 'fields' => array( + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'remote or local profile making the request'), + 'group_id' => array('type' => 'int', 'description' => 'remote or local group to join, if any'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + ), + 'primary key' => array('profile_id', 'group_id'), + 'indexes' => array( + 'group_join_queue_profile_id_created_idx' => array('profile_id', 'created'), + 'group_join_queue_group_id_created_idx' => array('group_id', 'created'), + ), + 'foreign keys' => array( + 'group_join_queue_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + 'group_join_queue_group_id_fkey' => array('user_group', array('group_id' => 'id')), + ) + ); + } + + public static function saveNew(Profile $profile, User_group $group) + { + $rq = new Group_join_queue(); + $rq->profile_id = $profile->id; + $rq->group_id = $group->id; + $rq->created = common_sql_now(); + $rq->insert(); + return $rq; + } +} diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index 7990d7f408..7263b3e320 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -93,6 +93,7 @@ abstract class Managed_DataObject extends Memcached_DataObject function keyTypes() { $table = call_user_func(array(get_class($this), 'schemaDef')); + $keys = array(); if (!empty($table['unique keys'])) { foreach ($table['unique keys'] as $idx => $fields) { diff --git a/classes/Profile.php b/classes/Profile.php index a80f121fc4..d4b288fa7a 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -344,14 +344,18 @@ class Profile extends Memcached_DataObject * May throw exceptions on failure. * * @param User_group $group - * @return Group_member + * @return mixed: Group_member on success, Group_join_queue if pending approval, null on some cancels? */ function joinGroup(User_group $group) { $ok = null; - if (Event::handle('StartJoinGroup', array($group, $this))) { - $ok = Group_member::join($group->id, $this->id); - Event::handle('EndJoinGroup', array($group, $this)); + if ($group->join_policy == User_group::JOIN_POLICY_MODERATE) { + $ok = Group_join_queue::saveNew($this, $group); + } else { + if (Event::handle('StartJoinGroup', array($group, $this))) { + $ok = Group_member::join($group->id, $this->id); + Event::handle('EndJoinGroup', array($group, $this)); + } } return $ok; } @@ -363,9 +367,9 @@ class Profile extends Memcached_DataObject */ function leaveGroup(User_group $group) { - if (Event::handle('StartLeaveGroup', array($this->group, $this))) { - Group_member::leave($this->group->id, $this->id); - Event::handle('EndLeaveGroup', array($this->group, $this)); + if (Event::handle('StartLeaveGroup', array($group, $this))) { + Group_member::leave($group->id, $this->id); + Event::handle('EndLeaveGroup', array($group, $this)); } } diff --git a/classes/Request_queue.php b/classes/Request_queue.php deleted file mode 100644 index 3d094b1dfc..0000000000 --- a/classes/Request_queue.php +++ /dev/null @@ -1,50 +0,0 @@ - 'Holder for subscription & group join requests awaiting moderation.', - 'fields' => array( - 'subscriber' => array('type' => 'int', 'not null' => true, 'description' => 'remote or local profile making the request'), - 'subscribed' => array('type' => 'int', 'description' => 'remote or local profile to subscribe to, if any'), - 'group_id' => array('type' => 'int', 'description' => 'remote or local group to join, if any'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - ), - 'unique key' => array( - 'request_queue_subscriber_subscribed_group_id' => array('subscriber', 'subscribed', 'group_id'), - ), - 'indexes' => array( - 'request_queue_subscriber_created_idx' => array('subscriber', 'created'), - 'request_queue_subscribed_created_idx' => array('subscriber', 'created'), - 'request_queue_group_id_created_idx' => array('group_id', 'created'), - ), - 'foreign keys' => array( - 'request_queue_subscriber_fkey' => array('profile', array('subscriber' => 'id')), - 'request_queue_subscribed_fkey' => array('profile', array('subscribed' => 'id')), - 'request_queue_group_id_fkey' => array('user_group', array('group_id' => 'id')), - ) - ); - } -} diff --git a/classes/User_group.php b/classes/User_group.php index 6ed51b506b..11efe8d3af 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -5,6 +5,9 @@ class User_group extends Memcached_DataObject { + const JOIN_POLICY_OPEN = 0; + const JOIN_POLICY_MODERATE = 1; + ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ diff --git a/db/core.php b/db/core.php index 4aa1911d46..928186d94d 100644 --- a/db/core.php +++ b/db/core.php @@ -1027,4 +1027,4 @@ $schema['schema_version'] = array( 'primary key' => array('table_name'), ); -$schema['request_queue'] = Request_queue::schemaDef(); +$schema['group_join_queue'] = Group_join_queue::schemaDef(); diff --git a/lib/groupeditform.php b/lib/groupeditform.php index 75f1344c11..0e9c41055e 100644 --- a/lib/groupeditform.php +++ b/lib/groupeditform.php @@ -189,11 +189,11 @@ class GroupEditForm extends Form $this->out->elementStart('li'); $this->out->dropdown('join_policy', _('Membership policy'), - array(0 => _('Open to all'), - 1 => _('Admin must approve all members')), + array(User_group::JOIN_POLICY_OPEN => _('Open to all'), + User_group::JOIN_POLICY_MODERATE => _('Admin must approve all members')), _('Whether admin approval is required to join this group.'), false, - (empty($this->group->join_policy)) ? 0 : $this->group->join_policy); + (empty($this->group->join_policy)) ? User_group::JOIN_POLICY_OPEN : $this->group->join_policy); $this->out->elementEnd('li'); Event::handle('EndGroupEditFormData', array($this)); } -- 2.39.2