Connect apps to use OAuth tokens and API keys in code via the
auths
objectWrite any Node.js
code and use any
npm package . You can also
export data for use in later steps via
return
or
this.key = 'value'
, pass input data to your code via
params
, and maintain state across invocations with
$checkpoint .
async
(event, steps) => {
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
let fetch = require ( 'node-fetch' ) ;
async function getImageAsBase64 ( imageUrl ) {
let result = await fetch ( imageUrl) ;
let data = await result. buffer ( ) ;
return data. toString ( 'base64' ) ;
}
let { request } = require ( "@octokit/request" ) ;
let requestWithAuth = request. defaults ( {
headers: {
authorization: 'token ' + process. env. GITHUB_TOKEN ,
} ,
} ) ;
async function getLastCommitSha ( ) {
let result = await requestWithAuth ( 'GET /repos/{owner}/{repo}/git/matching-refs/{ref}' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
ref: process. env. GITHUB_REF ,
} ) ;
return result. data. length ? result. data[ 0 ] . object. sha : '' ;
}
async function createBlob ( base64Image ) {
const result = await requestWithAuth ( 'POST /repos/{owner}/{repo}/git/blobs' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
content: base64Image,
encoding: 'base64' ,
} ) ;
return result. data;
}
async function createCommit ( fileName, data, lastCommitSha ) {
let tree = await requestWithAuth ( 'POST /repos/{owner}/{repo}/git/trees' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
tree: [
{
path: 'public/' + fileName,
mode: '100644' ,
type: 'blob' ,
sha: data. sha,
} ,
] ,
base_tree: lastCommitSha,
} ) ;
let result = await requestWithAuth ( 'POST /repos/{owner}/{repo}/git/commits' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
message: 'add new image ' + fileName,
tree: tree. data. sha,
parents: [ lastCommitSha] ,
} ) ;
return result. data;
}
async function pushCommit ( data ) {
let result = await requestWithAuth ( 'PATCH /repos/{owner}/{repo}/git/refs/{ref}' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
ref: process. env. GITHUB_REF ,
sha: data. sha,
} ) ;
return result. data;
}
function isValidURL ( targetUrl ) {
try {
let url = new URL ( targetUrl) ;
return url. protocol === 'http:' || url. protocol === 'https:' ;
}
catch ( error) {
return false ;
}
}
let message = '' ;
try {
if ( event. body. post?. post_status === 'publish' ) {
let postThumbnail = event. body. post_thumbnail;
if ( isValidURL ( postThumbnail) ) {
let fileName = new URL ( postThumbnail) . pathname. slice ( 28 ) ;
let base64Image = await getImageAsBase64 ( postThumbnail) ;
let blobData = await createBlob ( base64Image) ;
let lastCommit = await getLastCommitSha ( ) ;
let commit = await createCommit ( fileName, blobData, lastCommit) ;
let result = await pushCommit ( commit) ;
message = JSON . stringify ( result) ;
}
}
message = 'success' ;
} catch ( error) {
console. error ( error) ;
message = error. message;
}
return message;
let fetch = require ( 'node-fetch' ) ;
async function getImageAsBase64 ( imageUrl ) {
let result = await fetch ( imageUrl) ;
let data = await result. buffer ( ) ;
return data. toString ( 'base64' ) ;
}
let { request } = require ( "@octokit/request" ) ;
let requestWithAuth = request. defaults ( {
headers: {
authorization: 'token ' + process. env. GITHUB_TOKEN ,
} ,
} ) ;
async function getLastCommitSha ( ) {
let result = await requestWithAuth ( 'GET /repos/{owner}/{repo}/git/matching-refs/{ref}' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
ref: process. env. GITHUB_REF ,
} ) ;
return result. data. length ? result. data[ 0 ] . object. sha : '' ;
}
async function createBlob ( base64Image ) {
const result = await requestWithAuth ( 'POST /repos/{owner}/{repo}/git/blobs' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
content: base64Image,
encoding: 'base64' ,
} ) ;
return result. data;
}
async function createCommit ( fileName, data, lastCommitSha ) {
let tree = await requestWithAuth ( 'POST /repos/{owner}/{repo}/git/trees' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
tree: [
{
path: 'public/' + fileName,
mode: '100644' ,
type: 'blob' ,
sha: data. sha,
} ,
] ,
base_tree: lastCommitSha,
} ) ;
let result = await requestWithAuth ( 'POST /repos/{owner}/{repo}/git/commits' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
message: 'add new image ' + fileName,
tree: tree. data. sha,
parents: [ lastCommitSha] ,
} ) ;
return result. data;
}
async function pushCommit ( data ) {
let result = await requestWithAuth ( 'PATCH /repos/{owner}/{repo}/git/refs/{ref}' , {
owner: process. env. GITHUB_USERNAME ,
repo: process. env. GITHUB_REPO ,
ref: process. env. GITHUB_REF ,
sha: data. sha,
} ) ;
return result. data;
}
function isValidURL ( targetUrl ) {
try {
let url = new URL ( targetUrl) ;
return url. protocol === 'http:' || url. protocol === 'https:' ;
}
catch ( error) {
return false ;
}
}
let message = '' ;
try {
if ( event. body. post?. post_status === 'publish' ) {
let postThumbnail = event. body. post_thumbnail;
if ( isValidURL ( postThumbnail) ) {
let fileName = new URL ( postThumbnail) . pathname. slice ( 28 ) ;
let base64Image = await getImageAsBase64 ( postThumbnail) ;
let blobData = await createBlob ( base64Image) ;
let lastCommit = await getLastCommitSha ( ) ;
let commit = await createCommit ( fileName, blobData, lastCommit) ;
let result = await pushCommit ( commit) ;
message = JSON . stringify ( result) ;
}
}
message = 'success' ;
} catch ( error) {
console. error ( error) ;
message = error. message;
}
return message;
// const axios = require('axios')