Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/fetch sync #2

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
_site
node_modules
.env
functions/.eleventy.js
23 changes: 23 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch 11ty",
"program": "${workspaceFolder}\\node_modules\\@11ty\\eleventy\\cmd.js",
"args": [],
},
{
"type": "node",
"request": "launch",
"name": "Launch Functions",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run-script",
"functions"
],
"port": 9229
}
]
}
105 changes: 0 additions & 105 deletions fetchData.js

This file was deleted.

148 changes: 148 additions & 0 deletions functions/fetchData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
const dotenv = require('dotenv');
const fetch = require('node-fetch');
const Octokit = require('@octokit/rest')

// pull in local .env variables
dotenv.config();

// create github client
const octokit = new Octokit({
auth: process.env.GITHUB_TOKEN
})

// default params
const PARAMS = {
owner: "vtcodecamp",
repo: "2018.vtcodecamp.org",
branch: "feature/fetch_sync",
committer: {
name: "sessionize-bot",
email: "[email protected]"
}
};

let UPDATE_COUNT = 0

// run on functions, attach handler
exports.handler = fetchData;

async function fetchData(event, context) {
const response = await fetch('https://sessionize.com/api/v2/bm8zoh0m/view/all');
const sessionize = await response.json();

const [levels, formats] = parseCategories(sessionize.categories);
const speakers = buildSpeakers(sessionize.speakers);
const sessions = buildSessions(sessionize.sessions, levels, formats);

await writeDataFile('sessions.json', sessions);
await writeDataFile('speakers.json', speakers);
await writeDataFile('rooms.json', sessionize.rooms);

return {
statusCode: 200,
body: `Fetched ${sessions.length} session(s) and ${speakers.length} speakers(s) from Sessionize. \r\n` +
`Compared to existing files in github and updated ${UPDATE_COUNT} files`
}
}


function parseCategories(categories) {
var levels = {};
var formats = {};

for (let category of categories) {
if (category.title == 'Level') {
for (level of category.items) {
levels[level.id] = level;
}
} else if (category.title == 'Session format') {
for (format of category.items) {
formats[format.id] = format;
}
}
}

return [levels, formats]
}

function buildSpeakers(speakersData) {
for (let speaker of speakersData) {
for (let link of speaker.links) {
link.name = link.title;
switch (link.linkType) {
case 'Twitter':
link.name = '@' + link.url.replace(/https*:\/\/(www\.)*twitter.com\//gi, '')
.replace(/\/?(\?.*)?$/, '');
break;
case 'Blog':
case 'Company_Website':
link.name = link.url.replace(/https*:\/\/(www\.)*/gi, '')
.replace(/\/?(\?.*)?$/, '')
.replace(/\/.*/, '');
break;
}
}
}

return speakersData
}


function buildSessions(sessionsData, levels, formats) {
for (let session of sessionsData) {
for (let categoryId of session.categoryItems) {
if (categoryId in levels) {
session.level = levels[categoryId].name;
} else if (categoryId in formats) {
session.format = formats[categoryId].name;
}
}
}
return sessionsData;
}


async function writeDataFile(filename, array) {

let data = flattenArrayToObj(array)
let filePath = `src/_data/${filename}`;
let content = JSON.stringify(data, null, 4);
let base64 = Buffer.from(content).toString('base64')

const readFileParams = {
...PARAMS,
path: filePath,
}

// READ file
const file = await octokit.repos.getContents(readFileParams)

// git file adds line breaks - remove and compare
let dataHasChanged = file.data.content.replace(/(\r\n|\n|\r)/gm,"") != base64

if (dataHasChanged) {
const writeFileParams = {
...PARAMS,
path: filePath,
sha: file.data.sha || "",
message: "Update sessionize data.",
content: base64
}

// WRITE file
await octokit.repos.createOrUpdateFile(writeFileParams)

UPDATE_COUNT++;
}

}

function flattenArrayToObj(array) {
let object = {};

for (let item of array) {
object[item.id] = item;
}

return object;
}
2 changes: 2 additions & 0 deletions netlify.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[build]
functions = "functions/"
Loading