From 2a274668fcf288a1de025b83b81b030bb05b6f75 Mon Sep 17 00:00:00 2001 From: Guan Xiying Date: Thu, 24 Jun 2021 13:27:41 +0800 Subject: [PATCH] * Finish parse issue webhook function. --- module/gitlab/model.php | 85 ++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 19 deletions(-) diff --git a/module/gitlab/model.php b/module/gitlab/model.php index 543b6f65e7..bfeb01d7e7 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -673,21 +673,52 @@ class gitlabModel extends model return $response; } - public function webhookParseBody($body) + /** + * Parse webhook body function. + * + * @param object $body + * @param int $gitlabID + * @access public + * @return object + */ + public function webhookParseBody($body, $gitlabID) { $type = zget($body, 'object_kind', ''); if(!$type or !is_callable(array($this, "webhookParse{$type}"))) return false; - $result = call_user_func_array(array($this, "webhookParse{$type}Webhook"), array('body' => $body)); + return call_user_func_array(array($this, "webhookParse{$type}"), array('body' => $body, $gitlabID)); } - public function WebhookParseIssue($body) + /** + * Parse Webhook issue. + * + * @param object $body + * @param int $gitlabID + * @access public + * @return object + */ + public function WebhookParseIssue($body, $gitlabID) { + $object = $this->parseObjectFromLabel($body->labels); + if(empty($object)) return null; + $issue = new stdclass; - $issue->action = $body->object_attributes->action . $body->object_kind; - $issue->issue = $body->object_attributes; - $object = $this->parseObjectFromLabels($issue->labels); + $issue->action = $body->object_attributes->action . $body->object_kind; + $issue->issue = $body->object_attributes; + $issue->objectType = $object->type; + $issue->objectID = $object->id; + + if(!is_callable(array($this, "issueTo{$object->type}"))) return false; + $issue->object = call_user_func_array(array($this, "issueTo{$object->type}"), array('body' => $issue->issue, 'gitlab' => $gitlabID)); + return $issue; } + /** + * Webhook parse note. + * + * @param object $body + * @access public + * @return void + */ public function webhookParseNote($body) { $request = new stdclass; @@ -718,18 +749,20 @@ class gitlabModel extends model * @access public * @return object|false */ - public function webhookParseZentaoLabel($labels) + public function parseObjectFromLabel($labels) { - foreach($body->labels as $label) + $object = null; + foreach($labels as $label) { - if($label->title == $config->gitlab->zentaoLabel) + if(preg_match($this->config->gitlab->labelPattern->task, $label->title)) { - $object = json_decode($label->description); - if(!$object or !isset($object->type)) continue; - return $object; + list($prefix, $id) = explode('/', $label->title); + $object = new stdclass; + $object->type = 'task'; + $object->id = $id; } } - return false; + return $object; } /** @@ -749,15 +782,29 @@ class gitlabModel extends model return $object; } - public function issue2Task($issue) + public function issueToTask($issue, $gitlabID) + { + $task = new stdclass; + $maps = $this->config->gitlab->maps->task; + $gitlabUsers = $this->getUserAccountIdPairs($gitlabID); + + foreach($maps as $taskField => $config) + { + $value = ''; + list($field, $optionType, $options) = explode('|', $config); + if($optionType == 'field') $value = $issue->$field; + if($optionType == 'userPairs') $value = zget($gitlabUsers, $issue->$field); + if($optionType == 'configItems' and isset($issue->$field)) $value = array_search($issue->$field, $this->config->gitlab->$options); + if($value) $task->$taskField = $value; + } + return $task; + } + + public function issueToStory($issue) { } - public function issue2Story($issue) - { - } - - public function issue2Bug($issue) + public function issueToBug($issue) { }