/
index.js
96 lines (86 loc) · 2.56 KB
/
index.js
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
const env = process.env.NODE_ENV || 'development'
if (env === 'development' || env === 'test') {
require('dotenv').config()
}
if (!process.env.AIRTABLE_API_KEY) {
throw new Error('Missing AIRTABLE_API_KEY from environmental variables')
}
import { airtableLookup } from './utils'
import express from 'express'
import redis from 'redis'
import apicache from 'apicache'
let cacheWithRedis
if (process.env.REDIS_URL) {
const redisClient = redis.createClient(process.env.REDIS_URL)
cacheWithRedis = apicache.options({
redisClient,
statusCodes: { include: [200, 304] },
headers: {
'cache-control': 'no-cache',
},
}).middleware
} else {
console.log('No REDIS_URL env variable found, skipping caching!')
}
const app = express()
app.get('/', (req, res) => {
res.redirect(302, 'https://github.com/hackclub/api2')
})
app.get('/ping', (req, res) => {
res.status(200).json({ message: 'pong!' })
})
app.get('/v0/:base/:tableName?/:recordID?', async(req, res, next) => {
/*
version: api version to use. Before version 1.0 this isn't being checked– go ahead and put a 0 there
base: Either base ID ("apptEEFG5HTfGQE7h") or base name ("Operations")
tableName: Required if no recordID is provided. ex "Clubs"
recordID: Required if no tableName is provided. ex "rec02xw3TpmHOj7CA"
*/
const startTime = Date.now()
const meta = {
params: {...req.params, version: 0},
query: {...req.query},
}
if (req.query.authKey) {
meta.query.authKey = '[redacted]'
}
try {
let providedAuth
if (req.headers.authorization) {
// example auth header "Bearer key9uu912ij9e"
providedAuth = req.headers.authorization.replace('Bearer ', '')
}
if (env === 'development' || env === 'test') {
providedAuth = req.query.authKey
}
const options = {
base: req.params.base,
tableName: req.params.tableName,
authKey: providedAuth,
}
if (req.query.select) {
options.select = JSON.parse(req.query.select)
}
const result = await airtableLookup(options, providedAuth)
meta.duration = Date.now() - startTime
if (req.query.meta) {
res.json({result, meta})
} else {
res.json(result)
}
} catch (err) {
console.log(err.message)
const statusCode = err.statusCode || 500
meta.duration = Date.now() - startTime
res.status(statusCode).send({
error: {
message: err.message,
statusCode
},
meta
})
}
})
export const server = app.listen(process.env.PORT || 5000, () =>
console.log(`Up and listening on ${server.address().port}`)
)