summaryrefslogtreecommitdiff
path: root/actions/twitapigroups.php
diff options
context:
space:
mode:
Diffstat (limited to 'actions/twitapigroups.php')
-rw-r--r--actions/twitapigroups.php267
1 files changed, 267 insertions, 0 deletions
diff --git a/actions/twitapigroups.php b/actions/twitapigroups.php
index 4deb1b764..a29485883 100644
--- a/actions/twitapigroups.php
+++ b/actions/twitapigroups.php
@@ -293,6 +293,105 @@ require_once INSTALLDIR.'/lib/twitterapi.php';
}
}
+ function join($args, $apidata)
+ {
+ parent::handle($args);
+
+ common_debug("in groups api action");
+
+ $this->auth_user = $apidata['user'];
+ $group = $this->get_group($apidata['api_arg'], $apidata);
+
+ if (empty($group)) {
+ $this->clientError('Not Found', 404, $apidata['content-type']);
+ return false;
+ }
+
+ if($this->auth_user->isMember($group)){
+ $this->clientError(_('You are already a member of that group'), $code = 403);
+ return false;
+ }
+
+ if (Group_block::isBlocked($group, $this->auth_user->getProfile())) {
+ $this->clientError(_('You have been blocked from that group by the admin.'), 403);
+ return false;
+ }
+
+ $member = new Group_member();
+
+ $member->group_id = $group->id;
+ $member->profile_id = $this->auth_user->id;
+ $member->created = common_sql_now();
+
+ $result = $member->insert();
+
+ if (!$result) {
+ common_log_db_error($member, 'INSERT', __FILE__);
+ $this->serverError(sprintf(_('Could not join user %s to group %s'),
+ $this->auth_user->nickname, $group->nickname));
+ }
+
+ switch($apidata['content-type']) {
+ case 'xml':
+ $this->show_single_xml_group($group);
+ break;
+ case 'json':
+ $this->show_single_json_group($group);
+ break;
+ default:
+ $this->clientError(_('API method not found!'), $code = 404);
+ }
+ }
+
+ function leave($args, $apidata)
+ {
+ parent::handle($args);
+
+ common_debug("in groups api action");
+
+ $this->auth_user = $apidata['user'];
+ $group = $this->get_group($apidata['api_arg'], $apidata);
+
+ if (empty($group)) {
+ $this->clientError('Not Found', 404, $apidata['content-type']);
+ return false;
+ }
+
+ if(! $this->auth_user->isMember($group)){
+ $this->clientError(_('You are not a member of that group'), $code = 403);
+ return false;
+ }
+
+ $member = new Group_member();
+
+ $member->group_id = $group->id;
+ $member->profile_id = $this->auth_user->id;
+
+ if (!$member->find(true)) {
+ $this->serverError(_('Could not find membership record.'));
+ return;
+ }
+
+ $result = $member->delete();
+
+ if (!$result) {
+ common_log_db_error($member, 'INSERT', __FILE__);
+ $this->serverError(sprintf(_('Could not remove user %s to group %s'),
+ $this->auth_user->nickname, $group->nickname));
+ }
+
+ switch($apidata['content-type']) {
+ case 'xml':
+ $this->show_single_xml_group($group);
+ break;
+ case 'json':
+ $this->show_single_json_group($group);
+ break;
+ default:
+ $this->clientError(_('API method not found!'), $code = 404);
+ }
+ }
+
function is_member($args, $apidata)
{
parent::handle($args);
@@ -326,4 +425,172 @@ require_once INSTALLDIR.'/lib/twitterapi.php';
$this->clientError(_('API method not found!'), $code = 404);
}
}
+
+ function create($args, $apidata)
+ {
+ parent::handle($args);
+
+ common_debug("in groups api action");
+ if (!common_config('inboxes','enabled')) {
+ $this->serverError(_('Inboxes must be enabled for groups to work'));
+ return false;
+ }
+
+ $this->auth_user = $apidata['user'];
+
+ $nickname = $args['nickname'];
+ $fullname = $args['full_name'];
+ $homepage = $args['homepage'];
+ $description = $args['description'];
+ $location = $args['location'];
+ $aliasstring = $args['aliases'];
+
+ if (!Validate::string($nickname, array('min_length' => 1,
+ 'max_length' => 64,
+ 'format' => NICKNAME_FMT))) {
+ $this->clientError(_('Nickname must have only lowercase letters '.
+ 'and numbers and no spaces.'), $code=403);
+ return;
+ } else if ($this->groupNicknameExists($nickname)) {
+ $this->clientError(_('Nickname already in use. Try another one.'), $code=403);
+ return;
+ } else if (!User_group::allowedNickname($nickname)) {
+ $this->clientError(_('Not a valid nickname.'), $code=403);
+ return;
+ } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
+ !Validate::uri($homepage,
+ array('allowed_schemes' =>
+ array('http', 'https')))) {
+ $this->clientError(_('Homepage is not a valid URL.'), $code=403);
+ return;
+ } else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
+ $this->clientError(_('Full name is too long (max 255 chars).'), $code=403);
+ return;
+ } else if (User_group::descriptionTooLong($description)) {
+ $this->clientError(sprintf(_('description is too long (max %d chars).'), User_group::maxDescription()), $code=403);
+ return;
+ } else if (!is_null($location) && mb_strlen($location) > 255) {
+ $this->clientError(_('Location is too long (max 255 chars).'), $code=403);
+ return;
+ }
+
+ if (!empty($aliasstring)) {
+ $aliases = array_map('common_canonical_nickname', array_unique(preg_split('/[\s,]+/', $aliasstring)));
+ } else {
+ $aliases = array();
+ }
+
+ if (count($aliases) > common_config('group', 'maxaliases')) {
+ $this->clientError(sprintf(_('Too many aliases! Maximum %d.'),
+ common_config('group', 'maxaliases')), $code=403);
+ return;
+ }
+
+ foreach ($aliases as $alias) {
+ if (!Validate::string($alias, array('min_length' => 1,
+ 'max_length' => 64,
+ 'format' => NICKNAME_FMT))) {
+ $this->clientError(sprintf(_('Invalid alias: "%s"'), $alias), $code=403);
+ return;
+ }
+ if ($this->groupNicknameExists($alias)) {
+ $this->clientError(sprintf(_('Alias "%s" already in use. Try another one.'),
+ $alias), $code=403);
+ return;
+ }
+ // XXX assumes alphanum nicknames
+ if (strcmp($alias, $nickname) == 0) {
+ $this->clientError(_('Alias can\'t be the same as nickname.'), $code=403);
+ return;
+ }
+ }
+
+ $group = new User_group();
+
+ $group->query('BEGIN');
+
+ $group->nickname = $nickname;
+ $group->fullname = $fullname;
+ $group->homepage = $homepage;
+ $group->description = $description;
+ $group->location = $location;
+ $group->created = common_sql_now();
+
+ $result = $group->insert();
+
+ if (!$result) {
+ common_log_db_error($group, 'INSERT', __FILE__);
+ $this->serverError(_('Could not create group.'));
+ }
+
+ $result = $group->setAliases($aliases);
+
+ if (!$result) {
+ $this->serverError(_('Could not create aliases.'));
+ }
+
+ $member = new Group_member();
+
+ $member->group_id = $group->id;
+ $member->profile_id = $this->auth_user->id;
+ $member->is_admin = 1;
+ $member->created = $group->created;
+
+ $result = $member->insert();
+
+ if (!$result) {
+ common_log_db_error($member, 'INSERT', __FILE__);
+ $this->serverError(_('Could not set group membership.'));
+ }
+
+ $group->query('COMMIT');
+
+ switch($apidata['content-type']) {
+ case 'xml':
+ $this->show_single_xml_group($group);
+ break;
+ case 'json':
+ $this->show_single_json_group($group);
+ break;
+ default:
+ $this->clientError(_('API method not found!'), $code = 404);
+ }
+ }
+
+ function update($args, $apidata)
+ {
+ die("todo");
+ }
+
+ function update_group_logo($args, $apidata)
+ {
+ die("todo");
+ }
+
+ function destroy($args, $apidata)
+ {
+ die("todo");
+ }
+
+ function tag($args, $apidata)
+ {
+ die("todo");
+ }
+
+ function groupNicknameExists($nickname)
+ {
+ $group = User_group::staticGet('nickname', $nickname);
+
+ if (!empty($group)) {
+ return true;
+ }
+
+ $alias = Group_alias::staticGet('alias', $nickname);
+
+ if (!empty($alias)) {
+ return true;
+ }
+
+ return false;
+ }
}