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;