2015-01-16 14:23:05 +01:00
< ? php
namespace Integration ;
use Event\GenericEvent ;
use Model\Task ;
/**
* Gitlab Webhook
*
* @ package integration
* @ author Frederic Guillot
*/
2015-08-16 17:04:56 +02:00
class GitlabWebhook extends \Core\Base
2015-01-16 14:23:05 +01:00
{
/**
* Events
*
* @ var string
*/
const EVENT_ISSUE_OPENED = 'gitlab.webhook.issue.opened' ;
const EVENT_ISSUE_CLOSED = 'gitlab.webhook.issue.closed' ;
const EVENT_COMMIT = 'gitlab.webhook.commit' ;
2015-08-16 17:04:56 +02:00
const EVENT_ISSUE_COMMENT = 'gitlab.webhook.issue.commented' ;
2015-01-16 14:23:05 +01:00
/**
* Supported webhook events
*
* @ var string
*/
2015-08-16 17:04:56 +02:00
const TYPE_PUSH = 'push' ;
const TYPE_ISSUE = 'issue' ;
const TYPE_COMMENT = 'comment' ;
2015-01-16 14:23:05 +01:00
/**
* Project id
*
* @ access private
* @ var integer
*/
private $project_id = 0 ;
/**
* Set the project id
*
* @ access public
* @ param integer $project_id Project id
*/
public function setProjectId ( $project_id )
{
$this -> project_id = $project_id ;
}
/**
* Parse events
*
* @ access public
* @ param array $payload Gitlab event
* @ return boolean
*/
public function parsePayload ( array $payload )
{
switch ( $this -> getType ( $payload )) {
case self :: TYPE_PUSH :
return $this -> handlePushEvent ( $payload );
case self :: TYPE_ISSUE ;
return $this -> handleIssueEvent ( $payload );
2015-08-16 17:04:56 +02:00
case self :: TYPE_COMMENT ;
return $this -> handleCommentEvent ( $payload );
2015-01-16 14:23:05 +01:00
}
return false ;
}
/**
* Get event type
*
* @ access public
* @ param array $payload Gitlab event
* @ return string
*/
public function getType ( array $payload )
{
2015-08-16 17:04:56 +02:00
if ( empty ( $payload [ 'object_kind' ])) {
return '' ;
2015-01-16 14:23:05 +01:00
}
2015-08-16 17:04:56 +02:00
switch ( $payload [ 'object_kind' ]) {
case 'issue' :
return self :: TYPE_ISSUE ;
case 'note' :
return self :: TYPE_COMMENT ;
case 'push' :
return self :: TYPE_PUSH ;
default :
return '' ;
2015-01-16 14:23:05 +01:00
}
}
/**
* Parse push event
*
* @ access public
* @ param array $payload Gitlab event
* @ return boolean
*/
public function handlePushEvent ( array $payload )
{
foreach ( $payload [ 'commits' ] as $commit ) {
$this -> handleCommit ( $commit );
}
return true ;
}
/**
* Parse commit
*
* @ access public
* @ param array $commit Gitlab commit
* @ return boolean
*/
public function handleCommit ( array $commit )
{
$task_id = $this -> task -> getTaskIdFromText ( $commit [ 'message' ]);
2015-08-16 17:04:56 +02:00
if ( empty ( $task_id )) {
2015-01-16 14:23:05 +01:00
return false ;
}
$task = $this -> taskFinder -> getById ( $task_id );
2015-04-21 17:56:16 +02:00
if ( empty ( $task )) {
2015-01-16 14:23:05 +01:00
return false ;
}
2015-08-16 17:04:56 +02:00
if ( $task [ 'project_id' ] != $this -> project_id ) {
return false ;
2015-01-16 14:23:05 +01:00
}
2015-08-16 17:04:56 +02:00
$this -> container [ 'dispatcher' ] -> dispatch (
self :: EVENT_COMMIT ,
new GenericEvent ( array (
'task_id' => $task_id ,
'commit_message' => $commit [ 'message' ],
'commit_url' => $commit [ 'url' ],
'commit_comment' => $commit [ 'message' ] . " \n \n [ " . t ( 'Commit made by @%s on Gitlab' , $commit [ 'author' ][ 'name' ]) . '](' . $commit [ 'url' ] . ')'
) + $task )
);
return true ;
2015-01-16 14:23:05 +01:00
}
/**
* Parse issue event
*
* @ access public
* @ param array $payload Gitlab event
* @ return boolean
*/
public function handleIssueEvent ( array $payload )
{
2015-02-25 17:29:06 +01:00
switch ( $payload [ 'object_attributes' ][ 'action' ]) {
case 'open' :
2015-01-16 14:23:05 +01:00
return $this -> handleIssueOpened ( $payload [ 'object_attributes' ]);
2015-02-25 17:29:06 +01:00
case 'close' :
2015-01-16 14:23:05 +01:00
return $this -> handleIssueClosed ( $payload [ 'object_attributes' ]);
}
return false ;
}
/**
* Handle new issues
*
* @ access public
* @ param array $issue Issue data
* @ return boolean
*/
public function handleIssueOpened ( array $issue )
{
$event = array (
'project_id' => $this -> project_id ,
'reference' => $issue [ 'id' ],
'title' => $issue [ 'title' ],
'description' => $issue [ 'description' ] . " \n \n [ " . t ( 'Gitlab Issue' ) . '](' . $issue [ 'url' ] . ')' ,
);
$this -> container [ 'dispatcher' ] -> dispatch (
self :: EVENT_ISSUE_OPENED ,
new GenericEvent ( $event )
);
return true ;
}
/**
* Handle issue closing
*
* @ access public
* @ param array $issue Issue data
* @ return boolean
*/
public function handleIssueClosed ( array $issue )
{
2015-08-16 17:04:56 +02:00
$task = $this -> taskFinder -> getByReference ( $this -> project_id , $issue [ 'id' ]);
2015-01-16 14:23:05 +01:00
2015-04-21 17:56:16 +02:00
if ( ! empty ( $task )) {
2015-01-16 14:23:05 +01:00
$event = array (
'project_id' => $this -> project_id ,
'task_id' => $task [ 'id' ],
'reference' => $issue [ 'id' ],
);
$this -> container [ 'dispatcher' ] -> dispatch (
self :: EVENT_ISSUE_CLOSED ,
new GenericEvent ( $event )
);
return true ;
}
return false ;
}
2015-08-16 17:04:56 +02:00
/**
* Parse comment issue events
*
* @ access public
* @ param array $payload Event data
* @ return boolean
*/
public function handleCommentEvent ( array $payload )
{
if ( ! isset ( $payload [ 'issue' ])) {
return false ;
}
$task = $this -> taskFinder -> getByReference ( $this -> project_id , $payload [ 'issue' ][ 'id' ]);
if ( ! empty ( $task )) {
$user = $this -> user -> getByUsername ( $payload [ 'user' ][ 'username' ]);
if ( ! empty ( $user ) && ! $this -> projectPermission -> isMember ( $this -> project_id , $user [ 'id' ])) {
$user = array ();
}
$event = array (
'project_id' => $this -> project_id ,
'reference' => $payload [ 'object_attributes' ][ 'id' ],
'comment' => $payload [ 'object_attributes' ][ 'note' ] . " \n \n [ " . t ( 'By @%s on Gitlab' , $payload [ 'user' ][ 'username' ]) . '](' . $payload [ 'object_attributes' ][ 'url' ] . ')' ,
'user_id' => ! empty ( $user ) ? $user [ 'id' ] : 0 ,
'task_id' => $task [ 'id' ],
);
$this -> container [ 'dispatcher' ] -> dispatch (
self :: EVENT_ISSUE_COMMENT ,
new GenericEvent ( $event )
);
return true ;
}
return false ;
}
2015-01-16 14:23:05 +01:00
}