* Finish task #60453.

This commit is contained in:
liyuchun
2022-07-12 06:30:13 +00:00
parent 625631c625
commit 6cef93edd9
19 changed files with 282 additions and 24 deletions
+180 -4
View File
@@ -104,6 +104,62 @@ class giteaModel extends model
return $this->loadModel('pipeline')->update($id);
}
/**
* Bind users.
*
* @param int $giteaID
* @access public
* @return array
*/
public function bindUser($giteaID)
{
$users = $this->post->zentaoUsers;
$giteaNames = $this->post->giteaUserNames;
$accountList = array();
$repeatUsers = array();
foreach($users as $openID => $user)
{
if(empty($user)) continue;
if(isset($accountList[$user])) $repeatUsers[] = zget($userPairs, $user);
$accountList[$user] = $openID;
}
if(count($repeatUsers))
{
dao::$errors[] = sprintf($this->lang->gitea->bindUserError, join(',', $repeatUsers));
return false;
}
$user = new stdclass;
$user->providerID = $giteaID;
$user->providerType = 'gitea';
$oldUsers = $this->dao->select('*')->from(TABLE_OAUTH)->where('providerType')->eq($user->providerType)->andWhere('providerID')->eq($user->providerID)->fetchAll('openID');
foreach($users as $openID => $account)
{
$existAccount = isset($oldUsers[$openID]) ? $oldUsers[$openID] : '';
if($existAccount and $existAccount->account != $account)
{
$this->dao->delete()
->from(TABLE_OAUTH)
->where('openID')->eq($openID)
->andWhere('providerType')->eq($user->providerType)
->andWhere('providerID')->eq($user->providerID)
->exec();
$this->loadModel('action')->create('giteauser', $openID, 'unbind', '', sprintf($this->lang->gitea->bindDynamic, $giteaNames[$openID], $zentaoUsers[$existAccount->account]->realname));
}
if(!$existAccount or $existAccount->account != $account)
{
if(!$account) continue;
$user->account = $account;
$user->openID = $openID;
$this->dao->insert(TABLE_OAUTH)->data($user)->exec();
$this->loadModel('action')->create('giteauser', $openID, 'bind', '', sprintf($this->lang->gitea->bindDynamic, $giteaNames[$openID], $zentaoUsers[$account]->realname));
}
}
}
/**
* Api error handling.
*
@@ -225,6 +281,70 @@ class giteaModel extends model
->fetchPairs('providerID');
}
/**
* Get zentao account gitea user id pairs of one gitea.
*
* @param int $giteaID
* @access public
* @return array
*/
public function getUserAccountIdPairs($giteaID, $fields = 'account,openID')
{
return $this->dao->select($fields)->from(TABLE_OAUTH)
->where('providerType')->eq('gitea')
->andWhere('providerID')->eq($giteaID)
->fetchPairs();
}
/**
* Get matched gitea users.
*
* @param int $giteaID
* @param array $giteaUsers
* @param array $zentaoUsers
* @access public
* @return array
*/
public function getMatchedUsers($giteaID, $giteaUsers, $zentaoUsers)
{
$matches = new stdclass;
foreach($giteaUsers as $giteaUser)
{
foreach($zentaoUsers as $zentaoUser)
{
if($giteaUser->account == $zentaoUser->account) $matches->accounts[$giteaUser->account][] = $zentaoUser->account;
if($giteaUser->realname == $zentaoUser->realname) $matches->names[$giteaUser->realname][] = $zentaoUser->account;
if($giteaUser->email == $zentaoUser->email) $matches->emails[$giteaUser->email][] = $zentaoUser->account;
}
}
$bindedUsers = $this->getUserAccountIdPairs($giteaID, 'openID,account');
$matchedUsers = array();
foreach($giteaUsers as $giteaUser)
{
if(isset($bindedUsers[$giteaUser->id]))
{
$giteaUser->zentaoAccount = $bindedUsers[$giteaUser->id];
$matchedUsers[] = $giteaUser;
continue;
}
$matchedZentaoUsers = array();
if(isset($matches->accounts[$giteaUser->account])) $matchedZentaoUsers = array_merge($matchedZentaoUsers, $matches->accounts[$giteaUser->account]);
if(isset($matches->emails[$giteaUser->email])) $matchedZentaoUsers = array_merge($matchedZentaoUsers, $matches->emails[$giteaUser->email]);
if(isset($matches->names[$giteaUser->realname])) $matchedZentaoUsers = array_merge($matchedZentaoUsers, $matches->names[$giteaUser->realname]);
$matchedZentaoUsers = array_unique($matchedZentaoUsers);
if(count($matchedZentaoUsers) == 1)
{
$giteaUser->zentaoAccount = current($matchedZentaoUsers);
$matchedUsers[] = $giteaUser;
}
}
return $matchedUsers;
}
/**
* Get project by api.
*
@@ -250,14 +370,70 @@ class giteaModel extends model
* @access public
* @return array
*/
public function apiGetProjects($giteaID, $sudo = 'true')
public function apiGetProjects($giteaID, $sudo = true)
{
$apiRoot = $this->getApiRoot($giteaID, $sudo);
if(!$apiRoot) return array();
$url = sprintf($apiRoot, "/repos/search");
$results = json_decode(commonModel::http($url));
$url = sprintf($apiRoot, "/repos/search");
$allResults = array();
for($page = 1; true; $page++)
{
$results = json_decode(commonModel::http($url . "&page={$page}&limit=50"));
if(!is_array($results->data)) break;
if(!empty($results->data)) $allResults = array_merge($allResults, $results->data);
if(count($results->data) < 50) break;
}
return $results->data;
return $allResults;
}
/**
* Get gitea user list.
*
* @param int $giteaID
* @param bool $onlyLinked
* @access public
* @return array
*/
public function apiGetUsers($giteaID, $onlyLinked = false)
{
$response = array();
$apiRoot = $this->getApiRoot($giteaID);
for($page = 1; true; $page++)
{
$url = sprintf($apiRoot, "/users/search") . "&page={$page}&limit=50";
$result = json_decode(commonModel::http($url));
if(empty($result->data)) break;
$response = array_merge($response, $result->data);
$page += 1;
}
if(empty($response)) return array();
/* Get linked users. */
$linkedUsers = array();
if($onlyLinked) $linkedUsers = $this->getUserAccountIdPairs($giteaID, 'openID,account');
$users = array();
foreach($response as $giteaUser)
{
if($onlyLinked and !isset($linkedUsers[$giteaUser->id])) continue;
$user = new stdclass;
$user->id = $giteaUser->id;
$user->realname = $giteaUser->full_name ? $giteaUser->full_name : $giteaUser->username;
$user->account = $giteaUser->username;
$user->email = zget($giteaUser, 'email', '');
$user->avatar = $giteaUser->avatar_url;
$user->createdAt = zget($giteaUser, 'created', '');
$user->lastActivityOn = zget($giteaUser, 'last_login', '');
$users[] = $user;
}
return $users;
}
}