import type { OptionsWithUri } from 'request'; import type { IExecuteFunctions, IHookFunctions, IDataObject, ILoadOptionsFunctions, JsonObject, } from 'n8n-workflow'; import { NodeApiError, NodeOperationError } from 'n8n-workflow'; /** * Make an API request to Github * */ export async function githubApiRequest( this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions, method: string, endpoint: string, body: object, query?: object, option: IDataObject = {}, ): Promise { const options: OptionsWithUri = { method, headers: { 'User-Agent': 'n8n', }, body, qs: query, uri: '', json: true, }; if (Object.keys(option).length !== 0) { Object.assign(options, option); } try { const authenticationMethod = this.getNodeParameter( 'authentication', 0, 'accessToken', ) as string; let credentialType = ''; if (authenticationMethod === 'accessToken') { const credentials = await this.getCredentials('githubApi'); credentialType = 'githubApi'; const baseUrl = credentials.server || 'https://api.github.com'; options.uri = `${baseUrl}${endpoint}`; } else { const credentials = await this.getCredentials('githubOAuth2Api'); credentialType = 'githubOAuth2Api'; const baseUrl = credentials.server || 'https://api.github.com'; options.uri = `${baseUrl}${endpoint}`; } return await this.helpers.requestWithAuthentication.call(this, credentialType, options); } catch (error) { throw new NodeApiError(this.getNode(), error as JsonObject); } } /** * Returns the SHA of the given file * * @param {(IHookFunctions | IExecuteFunctions)} this */ export async function getFileSha( this: IHookFunctions | IExecuteFunctions, owner: string, repository: string, filePath: string, branch?: string, ): Promise { const query: IDataObject = {}; if (branch !== undefined) { query.ref = branch; } const getEndpoint = `/repos/${owner}/${repository}/contents/${encodeURI(filePath)}`; const responseData = await githubApiRequest.call(this, 'GET', getEndpoint, {}, query); if (responseData.sha === undefined) { throw new NodeOperationError(this.getNode(), 'Could not get the SHA of the file.'); } return responseData.sha; } export async function githubApiRequestAllItems( this: IHookFunctions | IExecuteFunctions, method: string, endpoint: string, body: any = {}, query: IDataObject = {}, ): Promise { const returnData: IDataObject[] = []; let responseData; query.per_page = 100; query.page = 1; do { responseData = await githubApiRequest.call(this, method, endpoint, body as IDataObject, query, { resolveWithFullResponse: true, }); query.page++; returnData.push.apply(returnData, responseData.body as IDataObject[]); } while (responseData.headers.link?.includes('next')); return returnData; }