* Add test function and sync issue function.

This commit is contained in:
Guan Xiying
2021-06-23 17:29:04 +08:00
parent 12fde09988
commit 88ffd16820
4 changed files with 134 additions and 39 deletions
+24 -16
View File
@@ -31,23 +31,31 @@ $config->gitlab->storyLabel->priority = "0";
$config->gitlab->zentaoApiWebhookUrl = "%s/api.php?m=gitlab&f=webhook&product=%s&gitlab=%s";
$config->gitlab->zentaoApiWebhookToken = "<access token>";
$config->gitlab->skippedFields = new stdclass;
$config->gitlab->skippedFields->issueCreate = array();
$config->gitlab->skippedFields->issueCreate[] = '';
$config->gitlab->maps = new stdclass;
$config->gitlab->maps->task = array();
$config->gitlab->maps->task['execution'] = 'execution';
$config->gitlab->maps->task['name'] = 'title';
$config->gitlab->maps->task['desc'] = 'description';
$config->gitlab->maps->task['deadline'] = 'due_date';
$config->gitlab->maps->task['name'] = 'title|field|';
$config->gitlab->maps->task['desc'] = 'description|field|';
$config->gitlab->maps->task['openedDate'] = 'created_at|field|';
$config->gitlab->maps->task['assignedTo'] = 'assignee_id|userPairs|';
$config->gitlab->maps->task['lastEditedDate'] = 'updated_at|field|';
$config->gitlab->maps->task['deadline'] = 'due_date|field|';
$config->gitlab->maps->task['status'] = 'state_event|configItems|taskStateMap';
$config->gitlab->maps->task['pri'] = 'weight|configItems|taskWeightMap';
$config->gitlab->maps->task['openedBy'] = 'due_date';
$config->gitlab->maps->task['openedDate'] = 'created_at';
$config->gitlab->maps->task['assignedTo'] = 'due_date';
$config->gitlab->maps->task['closedBy'] = 'due_date';
$config->gitlab->maps->task['closedDate'] = 'due_date';
$config->gitlab->maps->task['finishedDate'] = 'closed_at';
$config->gitlab->maps->task['lastEditedDate'] = 'last_edited_at';
$config->gitlab->maps->task['deadline'] = 'due_date';
$config->gitlab->taskWeightMap = array();
$config->gitlab->taskWeightMap['1'] = '1';
$config->gitlab->taskWeightMap['2'] = '2';
$config->gitlab->taskWeightMap['3'] = '3';
$config->gitlab->issueOptions = new stdclass;
$config->gitlab->issueOptions->task['type'] = 'devel';
$config->gitlab->issueOptions->task['pri'] = '3';
$config->gitlab->issueOptions->task['status'] = array();
$config->gitlab->taskStateMap = array();
$config->gitlab->taskStateMap['doing'] = 'reopen';
$config->gitlab->taskStateMap['wait'] = 'reopen';
$config->gitlab->taskStateMap['done'] = 'close';
$config->gitlab->taskStateMap['cancel'] = 'close';
$config->gitlab->taskStateMap['closed'] = 'close';
$config->gitlab->taskTypesToSync = 'design,devel,request,discuss,ui,affair,misc';
+16
View File
@@ -246,4 +246,20 @@ class gitlab extends control
$this->view->data = 'ougiugjvh';
$this->display();
}
public function test($id = 11)
{
$gitlabID = 11; $projectID = 36;
$task = $this->loadModel('task')->getByID($id);
$issue = $this->gitlab->taskToIssue($gitlabID, $projectID, $task);
$issue = $this->gitlab->apiCreateIssue($gitlabID, $projectID, $issue);
a($issue);
$this->gitlab->saveSyncedIssue('task', $task, $gitlabID, $issue);
exit;
}
}
+92 -21
View File
@@ -56,7 +56,7 @@ class gitlabModel extends model
*/
public function getUserIdAccountPairs($gitlab)
{
return $this->dao->select('id,account')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andwhere('providerID')->eq($gitlabID)->fetchPairs();
return $this->dao->select('openID,account')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andwhere('providerID')->eq($gitlab)->fetchPairs();
}
/**
@@ -68,7 +68,7 @@ class gitlabModel extends model
*/
public function getUserAccountIdPairs($gitlab)
{
return $this->dao->select('account,id')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andwhere('providerID')->eq($gitlabID)->fetchPairs();
return $this->dao->select('account,openID')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andwhere('providerID')->eq($gitlab)->fetchPairs();
}
/**
@@ -554,38 +554,109 @@ class gitlabModel extends model
}
/**
* sync gitlab Issue.
* Sync task to gitlab issue.
*
* @param int $gitlabID
* @param int $projectID
* @param int $taskID
* @param int $gitlab
* @param int $gitlabProject
* @access public
* @return void
*/
public function syncGitlabIssue($taskID, $task, $gitlabID, $projectID)
public function syncTask($taskID, $gitlab, $gitlabProject)
{
$issue = new stdClass();
$issue->assignee_id = $taskID;
$issue->created_at = $task->create_at;
$issue->description = $task->description;
$issue->labelType = $task->labelType;
$issue->due_date = $task->data;
$issue->id = $task->project;
$issue->title = $task->title;
$issue->weight = $task->weight;
$issue->labels = $task->labels;
$response = $this->loadModel('gitlab')->apiCreateIssue($gitlabID, $projectID, $issue);
$task = $this->loadModel('task')->getByID($taskID);
$syncedIssue = $this->getSyncedIssue($objectType = 'task', $objectID = $taskID, $gitlab);
return $response;
$issue = $this->taskToIssue($gitlab, $gitlabProject, $task);
if($syncedIssue) $issue = $this->apiUpdateIssue($gitlab, $gitlabProject, $syncedIssue, $issue);
$issue = $this->apiCreateIssue($gitlab, $gitlabProject, $issue);
$this->saveSyncedIssue('task', $taskID, $gitlab, $issue);
}
/**
* Get synced issue from relation table.
*
* @param string $objectType
* @param int $objectID
* @param int $gitlab
* @access public
* @return object
*/
public function getSyncedIssue($objectType, $objectID, $gitlab)
{
return $this->dao->select('*')->from(TABLE_RELATION)
->where('AType')->eq($objectType)
->andWhere('AID')->eq($objectID)
->andWhere('extra')->eq($gitlab)
->fetch();
}
/**
* Save synced issue to relation table.
*
* @param string $objectType
* @param object $object
* @param int $gitlab
* @param object $issue
* @access public
* @return void
*/
public function saveSyncedIssue($objectType, $object, $gitlab, $issue)
{
$relation = new stdclass;
$relation->execution = zget($object, 'execution', 0);
$relation->AType = $objectType;
$relation->AID = $object->id;
$relation->AVersion = '';
$relation->relation = 'gitlab';
$relation->BType = 'issue';
$relation->BID = $issue->iid;
$relation->BVersion = $issue->project_id;
$relation->extra = $gitlab;
$this->dao->replace(TABLE_RELATION)->data($relation)->exec();
}
/**
* Parse task to issue.
*
* @param int $gitlabID
* @param int $gitlabProjectID
* @param object $task
* @access public
* @return object
*/
public function taskToIssue($gitlabID, $gitlabProjectID, $task)
{
$map = $this->config->gitlab->maps->task;
$issue = new stdclass;
$gitlabUsers = $this->getUserAccountIdPairs($gitlabID);
foreach($map as $taskField => $config)
{
$value = '';
list($field, $optionType, $options) = explode('|', $config);
if($optionType == 'field') $value = $task->$taskField;
if($optionType == 'userPairs') $value = zget($gitlabUsers, $task->$taskField);
if($optionType == 'configItems')
{
$value = zget($this->config->gitlab->$options, $task->$taskField, '');
}
if($value) $issue->$field = $value;
}
return $issue;
}
public function apiCreateIssue($gitlabID, $projectID, $issue)
{
$apiRoot = $this->getApiRoot($gitlabID);
$apiPath = "/projects/{$projectID}/issues/";
foreach($this->config->gitlab->skippedFields->issueCreate as $field)
{
if(isset($issue->$field)) unset($issue->$field);
}
$url = sprintf($apiRoot, $apiPath);
$response = json_decode(commonModel::http($url, $issue));
return $response;
return json_decode(commonModel::http($url, $issue));
}
public function pushTask($gitlabID, $projectID, $task)
+2 -2
View File
@@ -120,8 +120,8 @@ class taskModel extends model
$taskID = $this->dao->lastInsertID();
/*sync gitlab Issue*/
$this->loadModel('gitlab')->syncGitlabIssue($taskID, $gitlabID, $projectID);
/* Sync this task to gitlab issue. */
$this->loadModel('gitlab')->syncTask($taskID, $this->post->gitlab, $this->post->gitlabProject);
/* Mark design version.*/
if(isset($task->design) && !empty($task->design))