2021-10-20 20:35:51 -07:00
import { OptionsWithUri } from 'request' ;
2019-06-23 03:35:23 -07:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
import {
2021-10-20 20:35:51 -07:00
ICredentialsDecrypted ,
ICredentialTestFunctions ,
2019-06-23 03:35:23 -07:00
IDataObject ,
2022-02-05 13:55:43 -08:00
INodeCredentialTestResult ,
2019-06-23 03:35:23 -07:00
INodeExecutionData ,
INodeType ,
2020-10-01 05:01:39 -07:00
INodeTypeDescription ,
2021-04-16 09:33:36 -07:00
NodeOperationError ,
2019-06-23 03:35:23 -07:00
} from 'n8n-workflow' ;
import {
getFileSha ,
2020-10-01 05:01:39 -07:00
githubApiRequest ,
2021-01-19 23:33:17 -08:00
githubApiRequestAllItems ,
2019-06-23 03:35:23 -07:00
} from './GenericFunctions' ;
2021-01-19 23:33:17 -08:00
import {
snakeCase ,
} from 'change-case' ;
2019-06-23 03:35:23 -07:00
export class Github implements INodeType {
description : INodeTypeDescription = {
2020-07-07 02:31:05 -07:00
displayName : 'GitHub' ,
2019-06-23 03:35:23 -07:00
name : 'github' ,
2021-01-19 23:33:17 -08:00
icon : 'file:github.svg' ,
2019-06-23 03:35:23 -07:00
group : [ 'input' ] ,
version : 1 ,
2021-01-19 23:33:17 -08:00
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
2021-07-03 05:40:16 -07:00
description : 'Consume GitHub API' ,
2019-06-23 03:35:23 -07:00
defaults : {
2020-07-07 02:31:05 -07:00
name : 'GitHub' ,
2019-06-23 03:35:23 -07:00
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'githubApi' ,
required : true ,
2021-10-20 20:35:51 -07:00
testedBy : 'githubApiTest' ,
2020-02-09 07:11:15 -08:00
displayOptions : {
show : {
authentication : [
'accessToken' ,
] ,
} ,
} ,
} ,
{
2020-02-09 15:39:14 -08:00
name : 'githubOAuth2Api' ,
2020-02-09 07:11:15 -08:00
required : true ,
displayOptions : {
show : {
authentication : [
2020-05-31 10:24:14 -07:00
'oAuth2' ,
2020-02-09 07:11:15 -08:00
] ,
} ,
} ,
} ,
2019-06-23 03:35:23 -07:00
] ,
properties : [
2020-02-09 07:11:15 -08:00
{
displayName : 'Authentication' ,
name : 'authentication' ,
type : 'options' ,
options : [
{
name : 'Access Token' ,
value : 'accessToken' ,
} ,
{
name : 'OAuth2' ,
2020-05-31 10:24:14 -07:00
value : 'oAuth2' ,
2020-02-09 07:11:15 -08:00
} ,
] ,
default : 'accessToken' ,
description : 'The resource to operate on.' ,
} ,
2019-07-14 07:50:26 -07:00
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
options : [
{
name : 'File' ,
value : 'file' ,
} ,
{
name : 'Issue' ,
value : 'issue' ,
} ,
{
name : 'Repository' ,
value : 'repository' ,
} ,
{
name : 'Release' ,
value : 'release' ,
} ,
2021-01-19 23:33:17 -08:00
{
name : 'Review' ,
value : 'review' ,
} ,
2019-07-14 07:50:26 -07:00
{
name : 'User' ,
value : 'user' ,
} ,
] ,
default : 'issue' ,
description : 'The resource to operate on.' ,
} ,
// ----------------------------------
// operations
// ----------------------------------
2019-06-23 03:35:23 -07:00
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2019-07-14 07:50:26 -07:00
displayOptions : {
show : {
resource : [
'issue' ,
] ,
} ,
} ,
2019-06-23 03:35:23 -07:00
options : [
{
2019-07-14 07:50:26 -07:00
name : 'Create' ,
value : 'create' ,
2021-03-20 13:18:47 -07:00
description : 'Create a new issue.' ,
2019-06-23 03:35:23 -07:00
} ,
{
2019-07-14 07:50:26 -07:00
name : 'Create Comment' ,
value : 'createComment' ,
2021-03-20 13:18:47 -07:00
description : 'Create a new comment on an issue.' ,
2019-06-23 03:35:23 -07:00
} ,
{
2019-07-14 07:50:26 -07:00
name : 'Edit' ,
value : 'edit' ,
2021-03-20 13:18:47 -07:00
description : 'Edit an issue.' ,
2019-06-23 03:35:23 -07:00
} ,
{
2019-07-14 07:50:26 -07:00
name : 'Get' ,
value : 'get' ,
2021-03-20 13:18:47 -07:00
description : 'Get the data of a single issue.' ,
2019-06-23 03:35:23 -07:00
} ,
{
2019-07-14 07:50:26 -07:00
name : 'Lock' ,
value : 'lock' ,
2021-03-20 13:18:47 -07:00
description : 'Lock an issue.' ,
2019-06-23 03:35:23 -07:00
} ,
2019-07-14 07:50:26 -07:00
] ,
default : 'create' ,
description : 'The operation to perform.' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
displayOptions : {
show : {
resource : [
'file' ,
] ,
} ,
} ,
options : [
2019-06-23 03:35:23 -07:00
{
2019-07-14 07:50:26 -07:00
name : 'Create' ,
value : 'create' ,
2021-03-20 13:18:47 -07:00
description : 'Create a new file in repository.' ,
2019-06-23 03:35:23 -07:00
} ,
{
2019-07-14 07:50:26 -07:00
name : 'Delete' ,
value : 'delete' ,
2021-03-20 13:18:47 -07:00
description : 'Delete a file in repository.' ,
2019-06-23 03:35:23 -07:00
} ,
{
2019-07-14 07:50:26 -07:00
name : 'Edit' ,
value : 'edit' ,
2021-03-20 13:18:47 -07:00
description : 'Edit a file in repository.' ,
2019-06-23 03:35:23 -07:00
} ,
{
2019-07-14 07:50:26 -07:00
name : 'Get' ,
value : 'get' ,
2022-02-04 11:18:30 -08:00
description : 'Get the data of a single file.' ,
} ,
{
name : 'List' ,
value : 'list' ,
description : 'List contents of a folder.' ,
2019-06-23 03:35:23 -07:00
} ,
2019-07-14 07:50:26 -07:00
] ,
default : 'create' ,
description : 'The operation to perform.' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
displayOptions : {
show : {
resource : [
'repository' ,
] ,
} ,
} ,
options : [
2019-09-11 14:46:17 -07:00
{
name : 'Get' ,
value : 'get' ,
2021-03-20 13:18:47 -07:00
description : 'Get the data of a single repository.' ,
2019-09-11 14:46:17 -07:00
} ,
2019-06-23 03:35:23 -07:00
{
2019-07-14 07:50:26 -07:00
name : 'Get License' ,
value : 'getLicense' ,
2021-03-20 13:18:47 -07:00
description : 'Returns the contents of the repository\'s license file, if one is detected.' ,
2019-07-14 07:50:26 -07:00
} ,
{
name : 'Get Issues' ,
value : 'getIssues' ,
2021-03-20 13:18:47 -07:00
description : 'Returns issues of a repository.' ,
2019-06-23 03:35:23 -07:00
} ,
{
2019-07-14 07:50:26 -07:00
name : 'Get Profile' ,
value : 'getProfile' ,
2021-03-20 13:18:47 -07:00
description : 'Get the community profile of a repository with metrics, health score, description, license, etc.' ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'List Popular Paths' ,
value : 'listPopularPaths' ,
2020-07-07 02:31:05 -07:00
description : 'Get the top 10 popular content paths over the last 14 days.' ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'List Referrers' ,
value : 'listReferrers' ,
2021-03-20 13:18:47 -07:00
description : 'Get the top 10 referrering domains over the last 14 days.' ,
2019-06-23 03:35:23 -07:00
} ,
2019-07-14 07:50:26 -07:00
] ,
default : 'getIssues' ,
description : 'The operation to perform.' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
} ,
} ,
options : [
2019-06-23 03:35:23 -07:00
{
2019-07-14 07:50:26 -07:00
name : 'Get Repositories' ,
value : 'getRepositories' ,
2021-03-20 13:18:47 -07:00
description : 'Returns the repositories of a user.' ,
2019-06-23 03:35:23 -07:00
} ,
2021-01-23 04:11:00 -08:00
{
name : 'Invite' ,
value : 'invite' ,
description : 'Invites a user to an organization.' ,
} ,
2019-07-14 07:50:26 -07:00
] ,
default : 'getRepositories' ,
description : 'The operation to perform.' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
displayOptions : {
show : {
resource : [
'release' ,
] ,
2019-06-23 03:35:23 -07:00
} ,
2019-07-14 07:50:26 -07:00
} ,
options : [
2019-06-23 03:35:23 -07:00
{
2019-07-14 07:50:26 -07:00
name : 'Create' ,
value : 'create' ,
2021-03-20 13:18:47 -07:00
description : 'Creates a new release.' ,
2019-06-23 03:35:23 -07:00
} ,
2021-04-09 22:54:05 -07:00
{
name : 'Get' ,
value : 'get' ,
description : 'Get a release.' ,
} ,
{
name : 'Get All' ,
value : 'getAll' ,
description : 'Get all repository releases.' ,
} ,
{
name : 'Delete' ,
value : 'delete' ,
description : 'Delete a release.' ,
} ,
{
name : 'Update' ,
value : 'update' ,
description : 'Update a release.' ,
} ,
2019-06-23 03:35:23 -07:00
] ,
2019-07-14 07:50:26 -07:00
default : 'create' ,
2019-06-23 03:35:23 -07:00
description : 'The operation to perform.' ,
} ,
2021-01-19 23:33:17 -08:00
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
displayOptions : {
show : {
resource : [
'review' ,
] ,
} ,
} ,
options : [
{
name : 'Create' ,
value : 'create' ,
2021-03-20 13:18:47 -07:00
description : 'Creates a new review.' ,
2021-01-19 23:33:17 -08:00
} ,
{
name : 'Get' ,
value : 'get' ,
2021-03-20 13:18:47 -07:00
description : 'Get a review for a pull request.' ,
2021-01-19 23:33:17 -08:00
} ,
{
name : 'Get All' ,
value : 'getAll' ,
2021-03-20 13:18:47 -07:00
description : 'Get all reviews for a pull request.' ,
2021-01-19 23:33:17 -08:00
} ,
{
name : 'Update' ,
value : 'update' ,
2021-03-20 13:18:47 -07:00
description : 'Update a review.' ,
2021-01-19 23:33:17 -08:00
} ,
] ,
default : 'create' ,
description : 'The operation to perform.' ,
} ,
2019-07-14 07:50:26 -07:00
// ----------------------------------
// shared
// ----------------------------------
2019-06-23 03:35:23 -07:00
{
displayName : 'Repository Owner' ,
name : 'owner' ,
type : 'string' ,
default : '' ,
required : true ,
2021-01-23 04:11:00 -08:00
displayOptions : {
hide : {
operation : [
'invite' ,
] ,
} ,
} ,
2019-06-23 03:35:23 -07:00
placeholder : 'n8n-io' ,
2021-01-23 04:11:00 -08:00
description : 'Owner of the repository.' ,
2019-06-23 03:35:23 -07:00
} ,
{
displayName : 'Repository Name' ,
name : 'repository' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
hide : {
2019-07-14 07:50:26 -07:00
resource : [
'user' ,
] ,
2019-06-23 03:35:23 -07:00
operation : [
2019-07-14 07:50:26 -07:00
'getRepositories' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
placeholder : 'n8n' ,
2021-01-23 04:11:00 -08:00
description : 'The name of the repository.' ,
2019-06-23 03:35:23 -07:00
} ,
// ----------------------------------
2019-07-14 07:50:26 -07:00
// file
2019-06-23 03:35:23 -07:00
// ----------------------------------
2019-07-14 07:50:26 -07:00
// ----------------------------------
// file:create/delete/edit/get
// ----------------------------------
2019-06-23 03:35:23 -07:00
{
displayName : 'File Path' ,
name : 'filePath' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
2019-07-14 07:50:26 -07:00
resource : [
'file' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
2022-02-04 11:18:30 -08:00
hide : {
operation : [
'list' ,
] ,
} ,
2019-06-23 03:35:23 -07:00
} ,
placeholder : 'docs/README.md' ,
description : 'The file path of the file. Has to contain the full path.' ,
} ,
2022-02-04 11:18:30 -08:00
// ----------------------------------
// file:list
// ----------------------------------
{
displayName : 'Path' ,
name : 'filePath' ,
type : 'string' ,
default : '' ,
required : false ,
displayOptions : {
show : {
resource : [
'file' ,
] ,
operation : [
'list' ,
] ,
} ,
} ,
placeholder : 'docs/' ,
description : 'The path of the folder to list.' ,
} ,
2019-06-23 03:35:23 -07:00
// ----------------------------------
2019-07-14 07:50:26 -07:00
// file:create/edit
2019-06-23 03:35:23 -07:00
// ----------------------------------
{
displayName : 'Binary Data' ,
name : 'binaryData' ,
type : 'boolean' ,
default : false ,
required : true ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'create' ,
'edit' ,
] ,
resource : [
'file' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
description : 'If the data to upload should be taken from binary field.' ,
} ,
{
displayName : 'File Content' ,
name : 'fileContent' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
binaryData : [
false ,
] ,
2019-07-14 07:50:26 -07:00
operation : [
'create' ,
'edit' ,
] ,
resource : [
'file' ,
] ,
2019-06-23 03:35:23 -07:00
} ,
} ,
placeholder : '' ,
description : 'The text content of the file.' ,
} ,
{
displayName : 'Binary Property' ,
name : 'binaryPropertyName' ,
type : 'string' ,
default : 'data' ,
required : true ,
displayOptions : {
show : {
binaryData : [
true ,
] ,
2019-07-14 07:50:26 -07:00
operation : [
'create' ,
'edit' ,
] ,
resource : [
'file' ,
] ,
2019-06-23 03:35:23 -07:00
} ,
} ,
placeholder : '' ,
2021-10-27 13:00:13 -07:00
description : 'Name of the binary property which contains the data for the file.' ,
2019-06-23 03:35:23 -07:00
} ,
{
displayName : 'Commit Message' ,
name : 'commitMessage' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'create' ,
'delete' ,
'edit' ,
] ,
resource : [
'file' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
description : 'The commit message.' ,
} ,
{
displayName : 'Additional Parameters' ,
name : 'additionalParameters' ,
placeholder : 'Add Parameter' ,
description : 'Additional fields to add.' ,
type : 'fixedCollection' ,
default : { } ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'create' ,
'delete' ,
'edit' ,
] ,
resource : [
'file' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
options : [
{
name : 'author' ,
displayName : 'Author' ,
values : [
{
displayName : 'Name' ,
name : 'name' ,
type : 'string' ,
default : '' ,
description : 'The name of the author of the commit.' ,
} ,
{
2020-07-07 02:31:05 -07:00
displayName : 'Email' ,
2019-06-23 03:35:23 -07:00
name : 'email' ,
type : 'string' ,
default : '' ,
description : 'The email of the author of the commit.' ,
} ,
2020-10-22 06:46:03 -07:00
] ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'branch' ,
displayName : 'Branch' ,
values : [
{
displayName : 'Branch' ,
name : 'branch' ,
type : 'string' ,
default : '' ,
description : 'The branch to commit to. If not set the repository’ s default branch (usually master) is used.' ,
} ,
2020-10-22 06:46:03 -07:00
] ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'committer' ,
displayName : 'Committer' ,
values : [
{
displayName : 'Name' ,
name : 'name' ,
type : 'string' ,
default : '' ,
description : 'The name of the committer of the commit.' ,
} ,
{
2020-07-07 02:31:05 -07:00
displayName : 'Email' ,
2019-06-23 03:35:23 -07:00
name : 'email' ,
type : 'string' ,
default : '' ,
description : 'The email of the committer of the commit.' ,
} ,
2020-10-22 06:46:03 -07:00
] ,
2019-06-23 03:35:23 -07:00
} ,
] ,
} ,
2019-07-14 07:50:26 -07:00
// ----------------------------------
// file:get
// ----------------------------------
{
displayName : 'As Binary Property' ,
name : 'asBinaryProperty' ,
type : 'boolean' ,
default : true ,
displayOptions : {
show : {
operation : [
'get' ,
] ,
resource : [
'file' ,
] ,
} ,
} ,
2021-10-27 13:00:13 -07:00
description : 'If set it will set the data of the file as binary property instead of returning the raw API response.' ,
2019-07-14 07:50:26 -07:00
} ,
{
displayName : 'Binary Property' ,
name : 'binaryPropertyName' ,
type : 'string' ,
default : 'data' ,
required : true ,
displayOptions : {
show : {
asBinaryProperty : [
true ,
] ,
operation : [
'get' ,
] ,
resource : [
'file' ,
] ,
} ,
} ,
placeholder : '' ,
2021-10-27 13:00:13 -07:00
description : 'Name of the binary property in which to save the binary data of the received file.' ,
2019-07-14 07:50:26 -07:00
} ,
2022-02-12 09:36:57 -08:00
{
displayName : 'Additional Parameters' ,
name : 'additionalParameters' ,
placeholder : 'Add Parameter' ,
description : 'Additional fields to add.' ,
type : 'collection' ,
default : { } ,
displayOptions : {
show : {
operation : [
'get' ,
] ,
resource : [
'file' ,
] ,
} ,
} ,
options : [
{
displayName : 'Reference' ,
name : 'reference' ,
type : 'string' ,
default : '' ,
placeholder : 'master' ,
description : 'The name of the commit/branch/tag. Default: the repository’ s default branch (usually master).' ,
2022-02-13 00:42:51 -08:00
} ,
2022-02-12 09:36:57 -08:00
] ,
} ,
2019-06-23 03:35:23 -07:00
// ----------------------------------
2019-07-14 07:50:26 -07:00
// issue
2019-06-23 03:35:23 -07:00
// ----------------------------------
2019-07-14 07:50:26 -07:00
// ----------------------------------
// issue:create
// ----------------------------------
2019-06-23 03:35:23 -07:00
{
displayName : 'Title' ,
name : 'title' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'create' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
description : 'The title of the issue.' ,
} ,
{
displayName : 'Body' ,
name : 'body' ,
type : 'string' ,
typeOptions : {
rows : 5 ,
} ,
default : '' ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'create' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
description : 'The body of the issue.' ,
} ,
{
displayName : 'Labels' ,
name : 'labels' ,
type : 'collection' ,
typeOptions : {
multipleValues : true ,
multipleValueButtonText : 'Add Label' ,
} ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'create' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
default : { 'label' : '' } ,
options : [
{
displayName : 'Label' ,
name : 'label' ,
type : 'string' ,
default : '' ,
description : 'Label to add to issue.' ,
} ,
] ,
} ,
{
displayName : 'Assignees' ,
name : 'assignees' ,
type : 'collection' ,
typeOptions : {
multipleValues : true ,
multipleValueButtonText : 'Add Assignee' ,
} ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'create' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
default : { 'assignee' : '' } ,
options : [
{
displayName : 'Assignee' ,
name : 'assignee' ,
type : 'string' ,
default : '' ,
description : 'User to assign issue too.' ,
} ,
] ,
} ,
// ----------------------------------
2019-07-14 07:50:26 -07:00
// issue:createComment
2019-06-23 03:35:23 -07:00
// ----------------------------------
{
displayName : 'Issue Number' ,
name : 'issueNumber' ,
type : 'number' ,
default : 0 ,
required : true ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'createComment' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
description : 'The number of the issue on which to create the comment on.' ,
} ,
{
displayName : 'Body' ,
name : 'body' ,
type : 'string' ,
typeOptions : {
rows : 5 ,
} ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'createComment' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
default : '' ,
description : 'The body of the comment.' ,
} ,
// ----------------------------------
2019-07-14 07:50:26 -07:00
// issue:edit
2019-06-23 03:35:23 -07:00
// ----------------------------------
{
displayName : 'Issue Number' ,
name : 'issueNumber' ,
type : 'number' ,
default : 0 ,
required : true ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'edit' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
description : 'The number of the issue edit.' ,
} ,
{
displayName : 'Edit Fields' ,
name : 'editFields' ,
type : 'collection' ,
typeOptions : {
multipleValueButtonText : 'Add Field' ,
} ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'edit' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
default : { } ,
options : [
{
displayName : 'Title' ,
name : 'title' ,
type : 'string' ,
default : '' ,
description : 'The title of the issue.' ,
} ,
{
displayName : 'Body' ,
name : 'body' ,
type : 'string' ,
typeOptions : {
rows : 5 ,
} ,
default : '' ,
description : 'The body of the issue.' ,
} ,
{
displayName : 'State' ,
name : 'state' ,
type : 'options' ,
options : [
{
name : 'Closed' ,
value : 'closed' ,
2021-03-20 13:18:47 -07:00
description : 'Set the state to "closed".' ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'Open' ,
value : 'open' ,
2021-03-20 13:18:47 -07:00
description : 'Set the state to "open".' ,
2019-06-23 03:35:23 -07:00
} ,
] ,
default : 'open' ,
description : 'The state to set.' ,
} ,
{
displayName : 'Labels' ,
name : 'labels' ,
type : 'collection' ,
typeOptions : {
multipleValues : true ,
multipleValueButtonText : 'Add Label' ,
} ,
default : { 'label' : '' } ,
options : [
{
displayName : 'Label' ,
name : 'label' ,
type : 'string' ,
default : '' ,
description : 'Label to add to issue.' ,
} ,
] ,
} ,
{
displayName : 'Assignees' ,
name : 'assignees' ,
type : 'collection' ,
typeOptions : {
multipleValues : true ,
multipleValueButtonText : 'Add Assignee' ,
} ,
default : { 'assignee' : '' } ,
options : [
{
displayName : 'Assignees' ,
name : 'assignee' ,
type : 'string' ,
default : '' ,
2021-03-20 13:18:47 -07:00
description : 'User to assign issue to.' ,
2019-06-23 03:35:23 -07:00
} ,
] ,
} ,
] ,
} ,
// ----------------------------------
2019-07-14 07:50:26 -07:00
// issue:get
2019-06-23 03:35:23 -07:00
// ----------------------------------
{
2019-07-14 07:50:26 -07:00
displayName : 'Issue Number' ,
name : 'issueNumber' ,
type : 'number' ,
default : 0 ,
required : true ,
2019-06-23 03:35:23 -07:00
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'get' ,
] ,
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
2019-07-14 07:50:26 -07:00
description : 'The number of the issue get data of.' ,
2019-06-23 03:35:23 -07:00
} ,
2019-07-14 07:50:26 -07:00
// ----------------------------------
// issue:lock
// ----------------------------------
2019-06-23 03:35:23 -07:00
{
2019-07-14 07:50:26 -07:00
displayName : 'Issue Number' ,
name : 'issueNumber' ,
type : 'number' ,
default : 0 ,
2019-06-23 03:35:23 -07:00
required : true ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'lock' ,
2019-06-23 03:35:23 -07:00
] ,
2019-07-14 07:50:26 -07:00
resource : [
'issue' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
2019-07-14 07:50:26 -07:00
description : 'The number of the issue to lock.' ,
} ,
{
displayName : 'Lock Reason' ,
name : 'lockReason' ,
type : 'options' ,
displayOptions : {
show : {
operation : [
'lock' ,
] ,
resource : [
'issue' ,
] ,
} ,
} ,
options : [
{
name : 'Off-Topic' ,
value : 'off-topic' ,
description : 'The issue is Off-Topic' ,
} ,
{
name : 'Too Heated' ,
value : 'too heated' ,
description : 'The discussion is too heated' ,
} ,
{
name : 'Resolved' ,
value : 'resolved' ,
description : 'The issue got resolved' ,
} ,
{
name : 'Spam' ,
value : 'spam' ,
description : 'The issue is spam' ,
} ,
] ,
default : 'resolved' ,
description : 'The reason to lock the issue.' ,
2019-06-23 03:35:23 -07:00
} ,
// ----------------------------------
2019-07-14 07:50:26 -07:00
// release
2019-06-23 03:35:23 -07:00
// ----------------------------------
2019-07-14 07:50:26 -07:00
// ----------------------------------
// release:create
// ----------------------------------
2019-06-23 03:35:23 -07:00
{
2019-07-14 07:50:26 -07:00
displayName : 'Tag' ,
name : 'releaseTag' ,
type : 'string' ,
default : '' ,
2019-06-23 03:35:23 -07:00
required : true ,
displayOptions : {
show : {
operation : [
2019-07-14 07:50:26 -07:00
'create' ,
] ,
resource : [
'release' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
2019-07-14 07:50:26 -07:00
description : 'The tag of the release.' ,
} ,
{
displayName : 'Additional Fields' ,
name : 'additionalFields' ,
type : 'collection' ,
typeOptions : {
multipleValueButtonText : 'Add Field' ,
} ,
displayOptions : {
show : {
operation : [
'create' ,
] ,
resource : [
'release' ,
] ,
} ,
} ,
default : { } ,
options : [
{
displayName : 'Name' ,
name : 'name' ,
type : 'string' ,
default : '' ,
description : 'The name of the issue.' ,
} ,
{
displayName : 'Body' ,
name : 'body' ,
type : 'string' ,
typeOptions : {
rows : 5 ,
} ,
default : '' ,
description : 'The body of the release.' ,
} ,
{
displayName : 'Draft' ,
name : 'draft' ,
type : 'boolean' ,
default : false ,
description : 'Set "true" to create a draft (unpublished) release, "false" to create a published one.' ,
} ,
{
displayName : 'Prerelease' ,
name : 'prerelease' ,
type : 'boolean' ,
default : false ,
description : 'If set to "true" it will point out that the release is non-production ready.' ,
} ,
{
displayName : 'Target Commitish' ,
name : 'target_commitish' ,
type : 'string' ,
default : '' ,
description : 'Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists. Default: the repository\'s default branch(usually master).' ,
} ,
] ,
2019-06-23 03:35:23 -07:00
} ,
2021-04-09 22:54:05 -07:00
// ----------------------------------
// release:get/delete/update
// ----------------------------------
{
displayName : 'Release ID' ,
name : 'release_id' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
resource : [
'release' ,
] ,
operation : [
'get' ,
'delete' ,
'update' ,
] ,
} ,
} ,
description : 'The release ID.' ,
} ,
// ----------------------------------
// release:update
// ----------------------------------
{
displayName : 'Additional Fields' ,
name : 'additionalFields' ,
type : 'collection' ,
typeOptions : {
multipleValueButtonText : 'Add Field' ,
} ,
displayOptions : {
show : {
operation : [
'update' ,
] ,
resource : [
'release' ,
] ,
} ,
} ,
default : { } ,
options : [
{
displayName : 'Body' ,
name : 'body' ,
type : 'string' ,
typeOptions : {
rows : 5 ,
} ,
default : '' ,
description : 'The body of the release.' ,
} ,
{
displayName : 'Draft' ,
name : 'draft' ,
type : 'boolean' ,
default : false ,
description : 'Set "true" to create a draft (unpublished) release, "false" to create a published one.' ,
} ,
2021-04-09 22:54:27 -07:00
{
displayName : 'Name' ,
name : 'name' ,
type : 'string' ,
default : '' ,
description : 'The name of the release.' ,
} ,
2021-04-09 22:54:05 -07:00
{
displayName : 'Prerelease' ,
name : 'prerelease' ,
type : 'boolean' ,
default : false ,
description : 'If set to "true" it will point out that the release is non-production ready.' ,
} ,
{
displayName : 'Tag Name' ,
name : 'tag_name' ,
type : 'string' ,
default : '' ,
description : 'The name of the tag.' ,
} ,
{
displayName : 'Target Commitish' ,
name : 'target_commitish' ,
type : 'string' ,
default : '' ,
description : 'Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists. Default: the repository\'s default branch(usually master).' ,
} ,
] ,
} ,
// ----------------------------------
// release:getAll
// ----------------------------------
{
displayName : 'Return All' ,
name : 'returnAll' ,
type : 'boolean' ,
displayOptions : {
show : {
resource : [
'release' ,
] ,
operation : [
'getAll' ,
] ,
} ,
} ,
default : false ,
description : 'If all results should be returned or only up to a given limit.' ,
} ,
{
displayName : 'Limit' ,
name : 'limit' ,
type : 'number' ,
displayOptions : {
show : {
resource : [
'release' ,
] ,
operation : [
'getAll' ,
] ,
returnAll : [
false ,
] ,
} ,
} ,
typeOptions : {
minValue : 1 ,
maxValue : 100 ,
} ,
default : 50 ,
description : 'How many results to return.' ,
} ,
2019-06-23 03:35:23 -07:00
2019-07-14 07:50:26 -07:00
2019-06-23 03:35:23 -07:00
// ----------------------------------
2019-07-14 07:50:26 -07:00
// repository
2019-06-23 03:35:23 -07:00
// ----------------------------------
2019-07-14 07:50:26 -07:00
// ----------------------------------
// repository:getIssues
// ----------------------------------
2021-03-20 13:18:47 -07:00
{
displayName : 'Return All' ,
name : 'returnAll' ,
type : 'boolean' ,
displayOptions : {
show : {
resource : [
'repository' ,
] ,
operation : [
'getIssues' ,
] ,
} ,
} ,
default : false ,
description : 'If all results should be returned or only up to a given limit.' ,
} ,
{
displayName : 'Limit' ,
name : 'limit' ,
type : 'number' ,
displayOptions : {
show : {
resource : [
'repository' ,
] ,
operation : [
'getIssues' ,
] ,
returnAll : [
false ,
] ,
} ,
} ,
typeOptions : {
minValue : 1 ,
maxValue : 100 ,
} ,
default : 50 ,
description : 'How many results to return.' ,
} ,
2019-06-23 03:35:23 -07:00
{
displayName : 'Filters' ,
name : 'getRepositoryIssuesFilters' ,
type : 'collection' ,
typeOptions : {
multipleValueButtonText : 'Add Filter' ,
} ,
displayOptions : {
show : {
operation : [
2020-10-22 06:46:03 -07:00
'getIssues' ,
2019-07-14 07:50:26 -07:00
] ,
resource : [
'repository' ,
2019-06-23 03:35:23 -07:00
] ,
} ,
} ,
default : { } ,
options : [
{
displayName : 'Assignee' ,
name : 'assignee' ,
type : 'string' ,
default : '' ,
2020-07-07 02:31:05 -07:00
description : 'Return only issues which are assigned to a specific user.' ,
2019-06-23 03:35:23 -07:00
} ,
{
displayName : 'Creator' ,
name : 'creator' ,
type : 'string' ,
default : '' ,
2020-07-07 02:31:05 -07:00
description : 'Return only issues which were created by a specific user.' ,
2019-06-23 03:35:23 -07:00
} ,
{
displayName : 'Mentioned' ,
name : 'mentioned' ,
type : 'string' ,
default : '' ,
2020-07-07 02:31:05 -07:00
description : 'Return only issues in which a specific user was mentioned.' ,
2019-06-23 03:35:23 -07:00
} ,
{
displayName : 'Labels' ,
name : 'labels' ,
type : 'string' ,
default : '' ,
2020-07-07 02:31:05 -07:00
description : 'Return only issues with the given labels. Multiple lables can be separated by comma.' ,
2019-06-23 03:35:23 -07:00
} ,
{
displayName : 'Updated Since' ,
name : 'since' ,
type : 'dateTime' ,
default : '' ,
description : 'Return only issues updated at or after this time.' ,
} ,
{
displayName : 'State' ,
name : 'state' ,
type : 'options' ,
options : [
{
name : 'All' ,
value : 'all' ,
2021-03-20 13:18:47 -07:00
description : 'Returns issues with any state.' ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'Closed' ,
value : 'closed' ,
2021-03-20 13:18:47 -07:00
description : 'Return issues with "closed" state.' ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'Open' ,
value : 'open' ,
2021-03-20 13:18:47 -07:00
description : 'Return issues with "open" state.' ,
2019-06-23 03:35:23 -07:00
} ,
] ,
default : 'open' ,
description : 'The state to set.' ,
} ,
{
displayName : 'Sort' ,
name : 'sort' ,
type : 'options' ,
options : [
{
name : 'Created' ,
value : 'created' ,
2021-03-20 13:18:47 -07:00
description : 'Sort by created date.' ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'Updated' ,
value : 'updated' ,
2021-03-20 13:18:47 -07:00
description : 'Sort by updated date.' ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'Comments' ,
value : 'comments' ,
2021-03-20 13:18:47 -07:00
description : 'Sort by comments.' ,
2019-06-23 03:35:23 -07:00
} ,
] ,
default : 'created' ,
description : 'The order the issues should be returned in.' ,
} ,
{
displayName : 'Direction' ,
name : 'direction' ,
type : 'options' ,
options : [
{
name : 'Ascending' ,
value : 'asc' ,
2021-03-20 13:18:47 -07:00
description : 'Sort in ascending order.' ,
2019-06-23 03:35:23 -07:00
} ,
{
name : 'Descending' ,
value : 'desc' ,
2021-03-20 13:18:47 -07:00
description : 'Sort in descending order.' ,
2019-06-23 03:35:23 -07:00
} ,
] ,
default : 'desc' ,
description : 'The sort order.' ,
} ,
] ,
} ,
2021-01-19 23:33:17 -08:00
// ----------------------------------
// rerview
// ----------------------------------
// ----------------------------------
// review:getAll
// ----------------------------------
{
displayName : 'PR Number' ,
name : 'pullRequestNumber' ,
type : 'number' ,
default : 0 ,
required : true ,
displayOptions : {
show : {
operation : [
'get' ,
'update' ,
] ,
resource : [
'review' ,
] ,
} ,
} ,
description : 'The number of the pull request.' ,
} ,
{
displayName : 'Review ID' ,
name : 'reviewId' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'get' ,
'update' ,
] ,
resource : [
'review' ,
] ,
} ,
} ,
2021-03-20 13:18:47 -07:00
description : 'ID of the review.' ,
2021-01-19 23:33:17 -08:00
} ,
// ----------------------------------
// review:getAll
// ----------------------------------
{
displayName : 'PR Number' ,
name : 'pullRequestNumber' ,
type : 'number' ,
default : 0 ,
required : true ,
displayOptions : {
show : {
operation : [
'getAll' ,
] ,
resource : [
'review' ,
] ,
} ,
} ,
description : 'The number of the pull request.' ,
} ,
{
displayName : 'Return All' ,
name : 'returnAll' ,
type : 'boolean' ,
displayOptions : {
show : {
resource : [
'review' ,
] ,
operation : [
'getAll' ,
] ,
} ,
} ,
default : false ,
description : 'If all results should be returned or only up to a given limit.' ,
} ,
{
displayName : 'Limit' ,
name : 'limit' ,
type : 'number' ,
displayOptions : {
show : {
resource : [
'review' ,
] ,
operation : [
'getAll' ,
] ,
returnAll : [
false ,
] ,
} ,
} ,
typeOptions : {
minValue : 1 ,
maxValue : 100 ,
} ,
default : 50 ,
description : 'How many results to return.' ,
} ,
// ----------------------------------
// review:create
// ----------------------------------
{
displayName : 'PR Number' ,
name : 'pullRequestNumber' ,
type : 'number' ,
default : 0 ,
required : true ,
displayOptions : {
show : {
operation : [
'create' ,
] ,
resource : [
'review' ,
] ,
} ,
} ,
description : 'The number of the pull request to review.' ,
} ,
{
displayName : 'Event' ,
name : 'event' ,
type : 'options' ,
displayOptions : {
show : {
operation : [
'create' ,
] ,
resource : [
'review' ,
] ,
} ,
} ,
options : [
{
name : 'Approve' ,
value : 'approve' ,
2021-03-20 13:18:47 -07:00
description : 'Approve the pull request.' ,
2021-01-19 23:33:17 -08:00
} ,
{
name : 'Request Change' ,
value : 'requestChanges' ,
2021-03-20 13:18:47 -07:00
description : 'Request code changes.' ,
2021-01-19 23:33:17 -08:00
} ,
{
name : 'Comment' ,
value : 'comment' ,
2021-03-20 13:18:47 -07:00
description : 'Add a comment without approval or change requests.' ,
2021-01-19 23:33:17 -08:00
} ,
{
name : 'Pending' ,
value : 'pending' ,
description : 'You will need to submit the pull request review when you are ready.' ,
} ,
] ,
default : 'approve' ,
description : 'The review action you want to perform.' ,
} ,
{
displayName : 'Body' ,
name : 'body' ,
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
displayOptions : {
show : {
operation : [
'create' ,
] ,
resource : [
'review' ,
] ,
event : [
'requestChanges' ,
'comment' ,
] ,
} ,
} ,
default : '' ,
description : 'The body of the review (required for events Request Changes or Comment).' ,
} ,
{
displayName : 'Additional Fields' ,
name : 'additionalFields' ,
placeholder : 'Add Field' ,
description : 'Additional fields.' ,
type : 'collection' ,
default : { } ,
displayOptions : {
show : {
operation : [
'create' ,
] ,
resource : [
'review' ,
] ,
} ,
} ,
options : [
{
displayName : 'Commit ID' ,
name : 'commitId' ,
type : 'string' ,
default : '' ,
2021-03-20 13:18:47 -07:00
description : 'The SHA of the commit that needs a review, if different from the latest.' ,
2021-01-19 23:33:17 -08:00
} ,
] ,
} ,
// ----------------------------------
// review:update
// ----------------------------------
{
displayName : 'Body' ,
name : 'body' ,
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
} ,
displayOptions : {
show : {
operation : [
'update' ,
] ,
resource : [
'review' ,
] ,
} ,
} ,
default : '' ,
description : 'The body of the review' ,
} ,
2021-01-23 04:11:00 -08:00
// ----------------------------------
2021-03-20 13:18:47 -07:00
// user:getRepositories
// ----------------------------------
{
displayName : 'Return All' ,
name : 'returnAll' ,
type : 'boolean' ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
operation : [
'getRepositories' ,
] ,
} ,
} ,
default : false ,
description : 'If all results should be returned or only up to a given limit.' ,
} ,
{
displayName : 'Limit' ,
name : 'limit' ,
type : 'number' ,
displayOptions : {
show : {
resource : [
'user' ,
] ,
operation : [
'getRepositories' ,
] ,
returnAll : [
false ,
] ,
} ,
} ,
typeOptions : {
minValue : 1 ,
maxValue : 100 ,
} ,
default : 50 ,
description : 'How many results to return.' ,
} ,
// ----------------------------------
2021-01-23 04:11:00 -08:00
// user:invite
// ----------------------------------
{
displayName : 'Organization' ,
name : 'organization' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'invite' ,
] ,
resource : [
'user' ,
] ,
} ,
} ,
description : 'The GitHub organization that the user is being invited to.' ,
} ,
{
displayName : 'Email' ,
name : 'email' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'invite' ,
] ,
resource : [
'user' ,
] ,
} ,
} ,
description : 'The email address of the invited user.' ,
} ,
2019-06-23 03:35:23 -07:00
] ,
} ;
2021-10-20 20:35:51 -07:00
methods = {
credentialTest : {
2022-02-05 13:55:43 -08:00
async githubApiTest ( this : ICredentialTestFunctions , credential : ICredentialsDecrypted ) : Promise < INodeCredentialTestResult > {
2021-10-20 20:35:51 -07:00
const credentials = credential . data ;
2022-03-20 02:24:04 -07:00
const baseUrl = credentials ! . server as string || 'https://api.github.com' ;
2021-10-20 20:35:51 -07:00
const options : OptionsWithUri = {
method : 'GET' ,
headers : {
'User-Agent' : 'n8n' ,
Authorization : ` token ${ credentials ! . accessToken } ` ,
} ,
2022-03-20 02:24:04 -07:00
uri : baseUrl.endsWith ( '/' ) ? baseUrl + 'user' : baseUrl + '/user' ,
2021-10-20 20:35:51 -07:00
json : true ,
timeout : 5000 ,
} ;
try {
const response = await this . helpers . request ( options ) ;
if ( ! response . id ) {
return {
status : 'Error' ,
message : ` Token is not valid: ${ response . error } ` ,
} ;
}
} catch ( error ) {
return {
status : 'Error' ,
message : ` Settings are not valid: ${ error } ` ,
} ;
}
return {
status : 'OK' ,
message : 'Authentication successful!' ,
} ;
} ,
} ,
} ;
2019-06-23 03:35:23 -07:00
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
2021-01-19 23:33:17 -08:00
let returnAll = false ;
let responseData ;
2019-06-23 03:35:23 -07:00
// Operations which overwrite the returned data
const overwriteDataOperations = [
2019-07-14 07:50:26 -07:00
'file:create' ,
'file:delete' ,
'file:edit' ,
'file:get' ,
'issue:create' ,
'issue:createComment' ,
'issue:edit' ,
'issue:get' ,
'release:create' ,
2021-04-09 22:54:05 -07:00
'release:delete' ,
'release:get' ,
'release:update' ,
2019-09-11 14:46:17 -07:00
'repository:get' ,
2019-07-14 07:50:26 -07:00
'repository:getLicense' ,
'repository:getProfile' ,
2021-01-19 23:33:17 -08:00
'review:create' ,
'review:get' ,
'review:update' ,
2021-01-23 04:11:00 -08:00
'user:invite' ,
2019-06-23 03:35:23 -07:00
] ;
// Operations which overwrite the returned data and return arrays
// and has so to be merged with the data of other items
const overwriteDataOperationsArray = [
2022-02-04 11:18:30 -08:00
'file:list' ,
2019-07-14 07:50:26 -07:00
'repository:getIssues' ,
'repository:listPopularPaths' ,
'repository:listReferrers' ,
'user:getRepositories' ,
2021-04-09 22:54:05 -07:00
'release:getAll' ,
2021-01-19 23:33:17 -08:00
'review:getAll' ,
2019-06-23 03:35:23 -07:00
] ;
// For Post
let body : IDataObject ;
// For Query string
let qs : IDataObject ;
let requestMethod : string ;
let endpoint : string ;
const operation = this . getNodeParameter ( 'operation' , 0 ) as string ;
2019-07-14 07:50:26 -07:00
const resource = this . getNodeParameter ( 'resource' , 0 ) as string ;
const fullOperation = ` ${ resource } : ${ operation } ` ;
2019-06-23 03:35:23 -07:00
for ( let i = 0 ; i < items . length ; i ++ ) {
2021-07-19 23:58:54 -07:00
try {
// Reset all values
requestMethod = 'GET' ;
endpoint = '' ;
body = { } ;
qs = { } ;
let owner = '' ;
if ( fullOperation !== 'user:invite' ) {
// Request the parameters which almost all operations need
owner = this . getNodeParameter ( 'owner' , i ) as string ;
}
2021-01-23 04:11:00 -08:00
2021-07-19 23:58:54 -07:00
let repository = '' ;
if ( fullOperation !== 'user:getRepositories' && fullOperation !== 'user:invite' ) {
repository = this . getNodeParameter ( 'repository' , i ) as string ;
}
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
if ( resource === 'file' ) {
if ( [ 'create' , 'edit' ] . includes ( operation ) ) {
// ----------------------------------
// create/edit
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'PUT' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const filePath = this . getNodeParameter ( 'filePath' , i ) as string ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const additionalParameters = this . getNodeParameter ( 'additionalParameters' , i , { } ) as IDataObject ;
if ( additionalParameters . author ) {
body . author = additionalParameters . author ;
}
if ( additionalParameters . committer ) {
body . committer = additionalParameters . committer ;
}
if ( additionalParameters . branch && ( additionalParameters . branch as IDataObject ) . branch ) {
body . branch = ( additionalParameters . branch as IDataObject ) . branch ;
}
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
if ( operation === 'edit' ) {
// If the file should be updated the request has to contain the SHA
// of the file which gets replaced.
body . sha = await getFileSha . call ( this , owner , repository , filePath , body . branch as string | undefined ) ;
}
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
body . message = this . getNodeParameter ( 'commitMessage' , i ) as string ;
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
if ( this . getNodeParameter ( 'binaryData' , i ) === true ) {
// Is binary file to upload
const item = items [ i ] ;
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
if ( item . binary === undefined ) {
throw new NodeOperationError ( this . getNode ( ) , 'No binary data exists on item!' ) ;
}
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const binaryPropertyName = this . getNodeParameter ( 'binaryPropertyName' , i ) as string ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
if ( item . binary [ binaryPropertyName ] === undefined ) {
throw new NodeOperationError ( this . getNode ( ) , ` No binary data property " ${ binaryPropertyName } " does not exists on item! ` ) ;
}
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
// Currently internally n8n uses base64 and also Github expects it base64 encoded.
// If that ever changes the data has to get converted here.
body . content = item . binary [ binaryPropertyName ] . data ;
} else {
// Is text file
// body.content = Buffer.from(this.getNodeParameter('fileContent', i) as string, 'base64');
body . content = Buffer . from ( this . getNodeParameter ( 'fileContent' , i ) as string ) . toString ( 'base64' ) ;
}
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /contents/ ${ encodeURI ( filePath ) } ` ;
} else if ( operation === 'delete' ) {
// ----------------------------------
// delete
// ----------------------------------
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'DELETE' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const additionalParameters = this . getNodeParameter ( 'additionalParameters' , i , { } ) as IDataObject ;
if ( additionalParameters . author ) {
body . author = additionalParameters . author ;
}
if ( additionalParameters . committer ) {
body . committer = additionalParameters . committer ;
}
if ( additionalParameters . branch && ( additionalParameters . branch as IDataObject ) . branch ) {
body . branch = ( additionalParameters . branch as IDataObject ) . branch ;
}
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const filePath = this . getNodeParameter ( 'filePath' , i ) as string ;
body . message = this . getNodeParameter ( 'commitMessage' , i ) as string ;
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
body . sha = await getFileSha . call ( this , owner , repository , filePath , body . branch as string | undefined ) ;
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /contents/ ${ encodeURI ( filePath ) } ` ;
2022-03-20 02:24:04 -07:00
} else if ( operation === 'get' ) {
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
const filePath = this . getNodeParameter ( 'filePath' , i ) as string ;
2022-02-12 09:36:57 -08:00
const additionalParameters = this . getNodeParameter ( 'additionalParameters' , i ) as IDataObject ;
2019-07-14 07:50:26 -07:00
2022-02-12 09:36:57 -08:00
if ( additionalParameters . reference ) {
qs . ref = additionalParameters . reference ;
}
2022-03-20 02:24:04 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /contents/ ${ encodeURI ( filePath ) } ` ;
} else if ( operation === 'list' ) {
requestMethod = 'GET' ;
const filePath = this . getNodeParameter ( 'filePath' , i ) as string ;
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /contents/ ${ encodeURI ( filePath ) } ` ;
}
} else if ( resource === 'issue' ) {
if ( operation === 'create' ) {
// ----------------------------------
// create
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'POST' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
body . title = this . getNodeParameter ( 'title' , i ) as string ;
body . body = this . getNodeParameter ( 'body' , i ) as string ;
const labels = this . getNodeParameter ( 'labels' , i ) as IDataObject [ ] ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const assignees = this . getNodeParameter ( 'assignees' , i ) as IDataObject [ ] ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
body . labels = labels . map ( ( data ) = > data [ 'label' ] ) ;
body . assignees = assignees . map ( ( data ) = > data [ 'assignee' ] ) ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /issues ` ;
} else if ( operation === 'createComment' ) {
// ----------------------------------
// createComment
// ----------------------------------
requestMethod = 'POST' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const issueNumber = this . getNodeParameter ( 'issueNumber' , i ) as string ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
body . body = this . getNodeParameter ( 'body' , i ) as string ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /issues/ ${ issueNumber } /comments ` ;
} else if ( operation === 'edit' ) {
// ----------------------------------
// edit
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'PATCH' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const issueNumber = this . getNodeParameter ( 'issueNumber' , i ) as string ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
body = this . getNodeParameter ( 'editFields' , i , { } ) as IDataObject ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
if ( body . labels !== undefined ) {
body . labels = ( body . labels as IDataObject [ ] ) . map ( ( data ) = > data [ 'label' ] ) ;
}
if ( body . assignees !== undefined ) {
body . assignees = ( body . assignees as IDataObject [ ] ) . map ( ( data ) = > data [ 'assignee' ] ) ;
}
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /issues/ ${ issueNumber } ` ;
} else if ( operation === 'get' ) {
// ----------------------------------
// get
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const issueNumber = this . getNodeParameter ( 'issueNumber' , i ) as string ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /issues/ ${ issueNumber } ` ;
} else if ( operation === 'lock' ) {
// ----------------------------------
// lock
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'PUT' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const issueNumber = this . getNodeParameter ( 'issueNumber' , i ) as string ;
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
qs . lock_reason = this . getNodeParameter ( 'lockReason' , i ) as string ;
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /issues/ ${ issueNumber } /lock ` ;
}
} else if ( resource === 'release' ) {
if ( operation === 'create' ) {
// ----------------------------------
// create
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'POST' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
body = this . getNodeParameter ( 'additionalFields' , i , { } ) as IDataObject ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
body . tag_name = this . getNodeParameter ( 'releaseTag' , i ) as string ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /releases ` ;
}
if ( operation === 'delete' ) {
// ----------------------------------
// delete
// ----------------------------------
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'DELETE' ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
const releaseId = this . getNodeParameter ( 'release_id' , i ) as string ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /releases/ ${ releaseId } ` ;
}
if ( operation === 'get' ) {
// ----------------------------------
// get
// ----------------------------------
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
const releaseId = this . getNodeParameter ( 'release_id' , i ) as string ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /releases/ ${ releaseId } ` ;
}
if ( operation === 'getAll' ) {
// ----------------------------------
// getAll
// ----------------------------------
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /releases ` ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
returnAll = this . getNodeParameter ( 'returnAll' , 0 ) as boolean ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
if ( returnAll === false ) {
qs . per_page = this . getNodeParameter ( 'limit' , 0 ) as number ;
}
2021-04-09 22:54:05 -07:00
}
2021-07-19 23:58:54 -07:00
if ( operation === 'update' ) {
// ----------------------------------
// update
// ----------------------------------
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'PATCH' ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
const releaseId = this . getNodeParameter ( 'release_id' , i ) as string ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
body = this . getNodeParameter ( 'additionalFields' , i , { } ) as IDataObject ;
2021-04-09 22:54:05 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /releases/ ${ releaseId } ` ;
}
} else if ( resource === 'repository' ) {
if ( operation === 'listPopularPaths' ) {
// ----------------------------------
// listPopularPaths
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /traffic/popular/paths ` ;
} else if ( operation === 'listReferrers' ) {
// ----------------------------------
// listReferrers
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /traffic/popular/referrers ` ;
} else if ( operation === 'get' ) {
// ----------------------------------
// get
// ----------------------------------
2019-09-11 14:46:17 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2019-09-11 14:46:17 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } ` ;
} else if ( operation === 'getLicense' ) {
// ----------------------------------
// getLicense
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /license ` ;
} else if ( operation === 'getIssues' ) {
// ----------------------------------
// getIssues
// ----------------------------------
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
qs = this . getNodeParameter ( 'getRepositoryIssuesFilters' , i ) as IDataObject ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /issues ` ;
2021-03-20 13:18:47 -07:00
2021-07-19 23:58:54 -07:00
returnAll = this . getNodeParameter ( 'returnAll' , 0 ) as boolean ;
2021-03-20 13:18:47 -07:00
2021-07-19 23:58:54 -07:00
if ( returnAll === false ) {
qs . per_page = this . getNodeParameter ( 'limit' , 0 ) as number ;
}
2021-03-20 13:18:47 -07:00
}
2021-07-19 23:58:54 -07:00
} else if ( resource === 'review' ) {
if ( operation === 'get' ) {
// ----------------------------------
// get
// ----------------------------------
requestMethod = 'GET' ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
const reviewId = this . getNodeParameter ( 'reviewId' , i ) as string ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
const pullRequestNumber = this . getNodeParameter ( 'pullRequestNumber' , i ) as string ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /pulls/ ${ pullRequestNumber } /reviews/ ${ reviewId } ` ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
} else if ( operation === 'getAll' ) {
// ----------------------------------
// getAll
// ----------------------------------
requestMethod = 'GET' ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
returnAll = this . getNodeParameter ( 'returnAll' , 0 ) as boolean ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
const pullRequestNumber = this . getNodeParameter ( 'pullRequestNumber' , i ) as string ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
if ( returnAll === false ) {
qs . per_page = this . getNodeParameter ( 'limit' , 0 ) as number ;
}
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /pulls/ ${ pullRequestNumber } /reviews ` ;
} else if ( operation === 'create' ) {
// ----------------------------------
// create
// ----------------------------------
requestMethod = 'POST' ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
const pullRequestNumber = this . getNodeParameter ( 'pullRequestNumber' , i ) as string ;
const additionalFields = this . getNodeParameter ( 'additionalFields' , i ) as IDataObject ;
Object . assign ( body , additionalFields ) ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
body . event = snakeCase ( this . getNodeParameter ( 'event' , i ) as string ) . toUpperCase ( ) ;
if ( body . event === 'REQUEST_CHANGES' || body . event === 'COMMENT' ) {
body . body = this . getNodeParameter ( 'body' , i ) as string ;
}
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /pulls/ ${ pullRequestNumber } /reviews ` ;
} else if ( operation === 'update' ) {
// ----------------------------------
// update
// ----------------------------------
requestMethod = 'PUT' ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
const pullRequestNumber = this . getNodeParameter ( 'pullRequestNumber' , i ) as string ;
const reviewId = this . getNodeParameter ( 'reviewId' , i ) as string ;
2021-01-19 23:33:17 -08:00
2021-07-19 23:58:54 -07:00
body . body = this . getNodeParameter ( 'body' , i ) as string ;
2021-03-20 13:18:47 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /repos/ ${ owner } / ${ repository } /pulls/ ${ pullRequestNumber } /reviews/ ${ reviewId } ` ;
}
} else if ( resource === 'user' ) {
if ( operation === 'getRepositories' ) {
// ----------------------------------
// getRepositories
// ----------------------------------
2019-07-14 07:50:26 -07:00
2021-07-19 23:58:54 -07:00
requestMethod = 'GET' ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
endpoint = ` /users/ ${ owner } /repos ` ;
2021-01-23 04:11:00 -08:00
2021-07-19 23:58:54 -07:00
returnAll = this . getNodeParameter ( 'returnAll' , 0 ) as boolean ;
2021-03-20 13:18:47 -07:00
2021-07-19 23:58:54 -07:00
if ( returnAll === false ) {
qs . per_page = this . getNodeParameter ( 'limit' , 0 ) as number ;
}
2021-03-20 13:18:47 -07:00
2021-07-19 23:58:54 -07:00
} else if ( operation === 'invite' ) {
// ----------------------------------
// invite
// ----------------------------------
2021-01-23 04:11:00 -08:00
2021-07-19 23:58:54 -07:00
requestMethod = 'POST' ;
const org = this . getNodeParameter ( 'organization' , i ) as string ;
endpoint = ` /orgs/ ${ org } /invitations ` ;
body . email = this . getNodeParameter ( 'email' , i ) as string ;
2021-01-23 04:11:00 -08:00
2021-07-19 23:58:54 -07:00
}
} else {
throw new NodeOperationError ( this . getNode ( ) , ` The resource " ${ resource } " is not known! ` ) ;
2019-07-14 07:50:26 -07:00
}
2021-01-23 04:11:00 -08:00
2021-07-19 23:58:54 -07:00
if ( returnAll === true ) {
responseData = await githubApiRequestAllItems . call ( this , requestMethod , endpoint , body , qs ) ;
} else {
responseData = await githubApiRequest . call ( this , requestMethod , endpoint , body , qs ) ;
}
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
if ( fullOperation === 'file:get' ) {
const asBinaryProperty = this . getNodeParameter ( 'asBinaryProperty' , i ) ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
if ( asBinaryProperty === true ) {
2022-02-04 11:18:30 -08:00
if ( Array . isArray ( responseData ) ) {
throw new NodeOperationError ( this . getNode ( ) , 'File Path is a folder, not a file.' ) ;
}
2021-07-19 23:58:54 -07:00
// Add the returned data to the item as binary property
const binaryPropertyName = this . getNodeParameter ( 'binaryPropertyName' , i ) as string ;
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const newItem : INodeExecutionData = {
json : items [ i ] . json ,
binary : { } ,
} ;
2019-08-01 13:55:33 -07:00
2021-07-19 23:58:54 -07:00
if ( items [ i ] . binary !== undefined ) {
// Create a shallow copy of the binary data so that the old
// data references which do not get changed still stay behind
// but the incoming data does not get changed.
Object . assign ( newItem . binary , items [ i ] . binary ) ;
}
2019-08-01 13:55:33 -07:00
2021-07-19 23:58:54 -07:00
newItem . binary ! [ binaryPropertyName ] = await this . helpers . prepareBinaryData ( Buffer . from ( responseData . content , 'base64' ) , responseData . path ) ;
2019-08-01 13:55:33 -07:00
2021-07-19 23:58:54 -07:00
items [ i ] = newItem ;
2019-08-01 13:55:33 -07:00
2021-07-19 23:58:54 -07:00
return this . prepareOutputData ( items ) ;
}
}
if ( fullOperation === 'release:delete' ) {
responseData = { success : true } ;
}
2019-08-01 13:55:33 -07:00
2021-07-19 23:58:54 -07:00
if ( overwriteDataOperations . includes ( fullOperation ) ) {
returnData . push ( responseData ) ;
} else if ( overwriteDataOperationsArray . includes ( fullOperation ) ) {
returnData . push . apply ( returnData , responseData ) ;
2019-06-23 03:35:23 -07:00
}
2021-07-19 23:58:54 -07:00
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
if ( overwriteDataOperations . includes ( fullOperation ) || overwriteDataOperationsArray . includes ( fullOperation ) ) {
returnData . push ( { error : error.message } ) ;
} else {
items [ i ] . json = { error : error.message } ;
}
continue ;
}
throw error ;
2019-06-23 03:35:23 -07:00
}
}
2019-07-14 07:50:26 -07:00
if ( overwriteDataOperations . includes ( fullOperation ) || overwriteDataOperationsArray . includes ( fullOperation ) ) {
2019-06-23 03:35:23 -07:00
// Return data gets replaced
return [ this . helpers . returnJsonArray ( returnData ) ] ;
} else {
// For all other ones simply return the unchanged items
return this . prepareOutputData ( items ) ;
}
}
}