Repository navigation
Expand file tree
/
Copy pathgithub.js
More file actions
140 lines (120 loc) · 4.01 KB
/
Copy pathgithub.js
File metadata and controls
140 lines (120 loc) · 4.01 KB
1
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
require("isomorphic-unfetch");
const express = require("express");
const router = express.Router();
const apicache = require("apicache");
const fs = require("fs");
const set = require("lodash.set");
const get = require("lodash.get");
// router.use(apicache.middleware('60 minutes'))
router.get("/tree", async (req, res) => {
let lessons;
try {
const repoReq = await fetch(
`https://api.github.com/repos/${process.env.GITHUB_CONTENT_REPO}/branches/master`,
{
method: "GET",
headers: {
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`,
},
}
);
const repo = await repoReq.json();
const masterTreeReq = await fetch(
`https://api.github.com/repos/${process.env.GITHUB_CONTENT_REPO}/git/trees/${repo.commit.sha}?recursive=1`,
{
method: "GET",
headers: {
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`,
},
}
);
lessons = await masterTreeReq.json();
} catch (err) {
console.error("[API] /github/tree - Tree fetch error: ", err);
res.statusMessage = "Failed to retrieve GitHub repository";
return res.status(500).end();
}
try {
lessons = lessons.tree.reduce((lessonsSet, node) => {
// if the node is a directory
if (node.type === "tree") {
// get the path string in dot notation
const pathDotNotation = node.path.replace(/\//g, ".");
// preset path with content array
set(
lessonsSet,
pathDotNotation,
get(lessonsSet, pathDotNotation, { content: [] })
);
}
// otherwise if the node is a file
else if (node.type === "blob") {
// get the path string without filname in dot notation
const nodePaths = node.path.split("/");
const pathDotNotation = nodePaths.slice(0, -1).join(".");
const filename = nodePaths.slice(-1)[0];
// get the original object, default {content: []}
let obj = get(lessonsSet, pathDotNotation);
// add file sha
obj.content.push({ filename, sha: node.sha, url: node.url });
// overwrite the object
set(lessonsSet, pathDotNotation, obj);
} else
console.error(
`[API] /github/tree - Content type ${node.type} is neither tree nor blob.`
);
return lessonsSet;
}, {});
} catch (e) {
console.error("[API] /github/tree - Create lesson JSON exception: ", e);
res.statusMessage = "Failed to retrieve GitHub repository";
return res.status(500).end();
}
if (!lessons) {
console.error("[API] /github/tree - Failed to create lessons object.");
res.statusMessage = "Failed to retrieve GitHub repository";
return res.status(500).end();
}
return res.status(200).send(lessons);
});
router.get("/content/:sha", async (req, res) => {
let content;
try {
const contentReq = await fetch(
`https://api.github.com/repos/${process.env.GITHUB_CONTENT_REPO}/git/blobs/${req.params.sha}`,
{
method: "GET",
headers: {
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`,
},
}
);
content = await contentReq.json();
} catch (err) {
console.error("[API] /github/content/:sha - Content fetch error: ", err);
res.statusMessage = "Failed to retrieve content";
return res.status(500).end();
}
if (!content) {
console.error(
"[API] /github/content/:sha - Failed to create content object."
);
res.statusMessage = "Failed to retrieve content";
return res.status(500).end();
}
return res.status(200).send(content.content);
});
router.get("/locale", (req, res) => {
try {
const file = fs.readFileSync(
appRoot + "/static/assets/locale/github-locale.json"
);
const json = JSON.parse(file);
return res.status(200).send(JSON.stringify(json));
} catch (err) {
console.error("[API] /github/locale - File retrieval error: ", err);
res.statusMessage = "Failed to retrieve content";
return res.status(500).end();
}
});
module.exports = router;