diff --git a/clickup-webhook-receiver/index.php b/clickup-webhook-receiver/index.php new file mode 100644 index 0000000..f80be04 --- /dev/null +++ b/clickup-webhook-receiver/index.php @@ -0,0 +1,114 @@ +event ?? null; +$clickup_task_id = $response_data->task_id ?? null; +$webhook_id = $_SERVER['HTTP_X_SIGNATURE'] ?? null; + +// check incoming request +if( CLICKUP_VALIDATE_WEBHOOK && $webhook_id !== CLICKUP_REGISTERED_WEBHOOK_ID ) { + echo "Unknown webhook signature\n"; + throw new Exception( sprintf( "unknown webhook ID: %s", $webhook_id ) ); +} + +$cache = ClickUpPhabricatorCache::instance(); + +switch( $event ) { + + case 'taskCreated': + + // get more ClickUp info (title and description etc.) and remember in cache + $clickup_task_details = ClickUpAPI::queryTaskData( $clickup_task_id ); + + // TODO: move in the QueryTaskData some validation on these + $clickup_task_title = $clickup_task_details->name; + $clickup_task_descr = $clickup_task_details->description; + $clickup_task_folder = $clickup_task_details->folder; + $clickup_task_folder_id = $clickup_task_folder->id; + $clickup_task_folder_name = $clickup_task_folder->name; + + if( !$clickup_task_title ) { + throw new Exception( "missing title in new ClickUp Task" ); + } + + // prepare description for new Task in Phabricator + $phab_task_description = $clickup_task_descr; + $phab_task_description .= "\n\n"; + $phab_task_description .= "> https://app.clickup.com/t/$clickup_task_id"; + + $phab_task_args = []; + + // try to assign to the right project + $phab_task_project = $cache->getPhabricatorTagIDFromClickupFolderID( $clickup_task_folder_id ); + if( $phab_task_project ) { + // assign to the right project + $phab_task_args['projects.add'] = [ $phab_task_project ]; + } else { + // or just give an hint + $clickup_task_title = "[$clickup_task_folder_name] $clickup_task_title"; + } + + $phab_task_args['title'] = $clickup_task_title; + $phab_task_args['description'] = $phab_task_description; + + // create Task in Phabricator + $phab_task_data = PhabricatorAPI::createTask( $phab_task_args ); + $phab_task_phid = $phab_task_data['object']['phid']; // TASK-PHID-00000000 + $phab_task_id = $phab_task_data['object']['id']; // 123 for T123 + + // associate the Phabricator Task to the Conduit Task in the cache + $cache->newlock()->registerClickupPhabricatorTaskID( $clickup_task_id, $phab_task_id )->save(); + + // update Click-Up adding the Phabricator URL + $phab_task_url = PHABRICATOR_URL . "T{$phab_task_id}"; + ClickUpAPI::putTaskData( $clickup_task_id, [], [ + 'description' => "$clickup_task_descr\n\n$phab_task_url", + ] ); + break; + + case 'taskDeleted': + + // mark as invalid in Phabricator + $phab_task_id = $cache->getClickupTaskPhabricatorID( $clickup_task_id ); + if( $phab_task_id ) { + PhabricatorAPI::editTask( $phab_task_id, [ + 'status' => 'invalid', + ] ); + } + + // drop from cache + $cache->removeClickupTask( $clickup_task_id ); + break; + + case 'taskCommentPosted': + + // post the comment on Phabricator too + $phab_task_id = $cache->getClickupTaskPhabricatorID( $clickup_task_id ); + if( $phab_task_id ) { + $phab_comment = "Test:\n\n"; + $phab_task_data = PhabricatorAPI::editTask( $phab_task_id, [ + 'comment' => $phab_comment, + ] ); + } + break; + +// case 'taskUpdated': + +// break; + + default: + echo "Method not supported.\n"; + error_log( "unsupported ClickUp webhoook: $event" ); +} + +$cache->save();