site/pages/api/team.js

86 lines
2.7 KiB
JavaScript

import AirtablePlus from 'airtable-plus'
const airtable = new AirtablePlus({
baseID: 'app79wD9AFys1NMUp',
apiKey: process.env.AIRTABLE_API_KEY,
tableName: 'Current',
})
const cache = {
refreshed_at: 0,
current: [],
acknowledged: []
};
export async function fetchTeam() {
if ((cache.refreshed_at + (5 * 60 * 1000)) >= Date.now()) {
return cache
}
const records = await airtable.read();
const current = [];
const acknowledged = [];
for (let record of records.sort((a, b) => a.fields['Order'] - b.fields['Order'])) {
const member = {
name: record.fields["Name"],
bio: record.fields["Bio"] || null,
department: record.fields["Department"],
role: record.fields["Role"],
bio_hackfoundation: null,
pronouns: null,
slack_id: record.fields["Slack ID"] || null,
slack_display_name: "",
avatar: record.fields["Override Avatar"] ? record.fields["Override Avatar"][0].thumbnails.large.url : null,
avatar_id: "",
email: record.fields["Email"] || null,
website: record.fields["Website"] || null,
}
if (process.env.SLACK_API_TOKEN) {
const slackData = await fetch(
'https://hackclub.slack.com/api/users.profile.get?user=' + record.fields["Slack ID"],
{
method: 'POST',
headers: {
'content-type': 'multipart/form-data; boundary=----orpheus',
cookie: process.env.SLACK_API_COOKIE
},
body: `------orpheus\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n${process.env.SLACK_API_TOKEN}\r\n------orpheus\r\nContent-Disposition: form-data; name=\"user\"\r\n\r\n${record.fields["Slack ID"]}\r\n------orpheus\r\n`
}
).then(r => r.json());
if (slackData.ok) {
if (!record.fields["Override Avatar"]) {
member.avatar = `https://ca.slack-edge.com/T0266FRGM-${record.fields["Slack ID"]}-${slackData.profile.avatar_hash}-128`
}
member.pronouns = slackData.profile.pronouns
}
}
if (record.fields["Acknowledged"]) {
acknowledged.push(member)
} else {
current.push(member)
}
}
cache.current = current;
cache.acknowledged = acknowledged;
cache.refreshed_at = Date.now();
return {
current,
acknowledged
}
}
export default async function handler(req, res) {
const team = await fetchTeam()
res.status(200).json({
refreshed_at: cache.refreshed_at,
...team
});
}