diff --git a/module/gitlab/control.php b/module/gitlab/control.php index ddbc422eb6..572b99662b 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -72,60 +72,57 @@ class gitlab extends control } /** - * bind gitlab user to zentao users. + * Bind gitlab user to zentao users. * * @access public * @return void */ - public function bindUser($id) + public function bindUser($gitlabID) { + $userPairs = $this->loadModel('user')->getPairs(); if($_POST) { - if($this->post->zentaoUsers) + $users = $this->post->zentaoUsers; + $accountList = array(); + $repeatUsers = array(); + foreach($users as $openID => $user) { - if(count($this->post->zentaoUsers) != count(array_unique($this->post->zentaoUsers))) - { - $this->send(array('result' => 'fail', 'message' => $this->lang->gitlab->bindUserError, 'locate' => inlink('binduser'))); - } - - $data = array(); - $number = 0; - foreach($this->post->zentaoUsers as $gitlabId => $account) - { - if($account) - { - $data[$number]['openID'] = $gitlabId; - $data[$number]['account'] = $account; - $data[$number]['providerType'] = 'gitlab'; - $data[$number]['providerID'] = $id; - $number++; - } - } + if(empty($user)) continue; + if(isset($accountList[$user])) $repeatUsers[] = zget($userPairs, $user); + $accountList[$user] = $openID; } - foreach($data as $bindUser) + if(count($repeatUsers)) $this->send(array('result' => 'fail', 'message' => sprintf($this->lang->gitlab->bindUserError, join(',', $repeatUsers)))); + + $user = new stdclass; + $user->providerID = $gitlabID; + $user->providerType = 'gitlab'; + + foreach($users as $openID => $account) { - if(!$this->gitlab->checkAccountId($bindUser['openID'],$bindUser['providerID'])) - { - $this->dao->insert(TABLE_OAUTH)->data($bindUser)->exec(); - if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); - $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('binduser'))); - }else - { - $this->dao->update(TABLE_OAUTH)->data($bindUser)->where('openID')->eq($bindUser['openID'])->andWhere('providerID')->eq($bindUser['providerID'])->exec(); - if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); - $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('binduser'))); - } + if(!$account) continue; + $user->account = $account; + $user->openID = $openID; + + $this->dao->delete(TABLE_OAUTH) + ->where('openID')->eq($user->openID) + ->andWhere('providerType')->eq('gitlab') + ->andWhere('providerID')->eq($id) + ->andWhere('account')->eq($user->account) + ->exec(); + + $this->dao->insert(TABLE_OAUTH)->data($user)->exec(); } + $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->sever->http_referer)); } - $gitlab = $this->gitlab->getByID($id); + $gitlab = $this->gitlab->getByID($gitlabID); $zentaoUsers = $this->dao->select('account,email,realname')->from(TABLE_USER)->fetchAll('account'); $this->view->title = $this->lang->gitlab->bindUser; - $this->view->userPairs = $this->loadModel('user')->getPairs(); + $this->view->userPairs = $userPairs; $this->view->gitlabUsers = $this->gitlab->apiGetUsers($gitlab); - $this->view->matchedResult = $this->gitlab->getMatchedUsers($this->view->gitlabUsers, $zentaoUsers); + $this->view->matchedResult = $this->gitlab->getMatchedUsers($gitlabID, $this->view->gitlabUsers, $zentaoUsers); $this->display(); } diff --git a/module/gitlab/lang/zh-cn.php b/module/gitlab/lang/zh-cn.php index 8f1a3ecd4a..bd77ff6bc6 100644 --- a/module/gitlab/lang/zh-cn.php +++ b/module/gitlab/lang/zh-cn.php @@ -29,4 +29,4 @@ $lang->gitlab->gitlabTokenTips = "请填写具有admin权限账户的access $lang->gitlab->tokenError = "当前token非管理员权限。"; $lang->gitlab->hostError = "无效的gitlab服务地址。"; -$lang->gitlab->bindUserError = "禅道用户绑定gitlab服务号失败"; +$lang->gitlab->bindUserError = "不能重复绑定用户 %s"; diff --git a/module/gitlab/model.php b/module/gitlab/model.php index d20a815ae3..bc2bb9e2d7 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -123,7 +123,7 @@ class gitlabModel extends model * @access public * @return array */ - public function getMatchedUsers($gitlabUsers, $zentaoUsers) + public function getMatchedUsers($gitlabID, $gitlabUsers, $zentaoUsers) { $matches = new stdclass; foreach($gitlabUsers as $gitlabUser) @@ -136,11 +136,21 @@ class gitlabModel extends model } } - /*Get binded users from db.*/ + $bindedUsers = $this->dao->select('openID,account')->from(TABLE_OAUTH) + ->where('providerType')->eq('gitlab') + ->andWhere('providerID')->eq($gitlabID) + ->fetchPairs(); $matchedUsers = array(); foreach($gitlabUsers as $gitlabUser) { + if(isset($bindedUsers[$gitlabUser->id])) + { + $gitlabUser->zentaoAccount = $bindedUsers[$gitlabUser->id]; + $matchedUsers[] = $gitlabUser; + continue; + } + $matchedZentaoUsers = array(); if(isset($matches->accounts[$gitlabUser->account])) $matchedZentaoUsers = array_merge($matchedZentaoUsers, $matches->accounts[$gitlabUser->account]); if(isset($matches->emails[$gitlabUser->email])) $matchedZentaoUsers = array_merge($matchedZentaoUsers, $matches->emails[$gitlabUser->email]); @@ -196,19 +206,6 @@ class gitlabModel extends model return $gitlab_url; } - - /** - * check if gitlab id exists - * - * @param string - * @access public - * @return array - */ - public function checkAccountId($openID,$providerID) - { - return $this->dao->select('openID')->from(TABLE_OAUTH)->where('openID')->eq($openID)->andWhere('providerID')->eq($providerID)->fetch('openID'); - } - /** * Get hooks. * diff --git a/module/gitlab/view/binduser.html.php b/module/gitlab/view/binduser.html.php index 380a0550c6..a0cf0dd17f 100644 --- a/module/gitlab/view/binduser.html.php +++ b/module/gitlab/view/binduser.html.php @@ -15,7 +15,7 @@