server = endpoint("server", async (request, response, ctx) => {
const API_KEY = ctx.secrets["AIRTABLE_API_KEY"];
const base = new Airtable({ apiKey: API_KEY }).base("app2lD79fJnGQVTiP");
if (request.method === "PUT") {
const submission = JSON.parse(request.body);
if (!/^https:\/\/observablehq.com\/@[^/]*\/[^/]*$/.exec(submission.url))
return response.status(400).send("URL is not an Observable notebook");
base("notebooks").create(
[
{
fields: submission
}
],
function (err, records) {
if (err) return response.status(500).send(err.message);
else response.send("OK");
}
);
}
else if (request.method === "GET") {
const results = [];
base("notebooks")
.select({
maxRecords: 20,
view: "Grid view"
})
.eachPage(
function page(records, fetchNextPage) {
records.forEach(function (record) {
results.push(record.fields);
});
fetchNextPage();
},
function done(err) {
if (err) return response.status(500).send(err.message);
else response.json(results);
}
);
} else {
response.status(400).send("Unknown method", request.method);
}
})