onedrive/pages/api/index.ts
2021-06-23 21:27:51 +01:00

63 lines
1.9 KiB
TypeScript

import axios from 'axios'
import type { NextApiRequest, NextApiResponse } from 'next'
import apiConfig from '../../config/api.json'
const encodePath = (path: string) => {
const encodedPath = `${apiConfig.base}${path === '/' ? '' : path}`
if (encodedPath === '/' || encodedPath === '') {
return ''
}
return encodeURIComponent(':' + encodedPath)
}
// Store access token in memory, cuz Vercel doesn't provide key-value storage natively
let _access_token = ''
const getAccessToken = async () => {
if (_access_token) {
console.log('Fetch token from memory.')
return _access_token
}
const body = new URLSearchParams()
body.append('client_id', apiConfig.clientId)
body.append('redirect_uri', apiConfig.redirectUri)
body.append('client_secret', process.env.CLIENT_SECRET ? process.env.CLIENT_SECRET : '')
body.append('refresh_token', process.env.REFRESH_TOKEN ? process.env.REFRESH_TOKEN : '')
body.append('grant_type', 'refresh_token')
const resp = await axios.post(apiConfig.authApi, body, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
if (resp.data.access_token) {
_access_token = resp.data.access_token
return _access_token
}
}
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { path = '/' } = req.query
if (path === '[...path]') {
res.status(400).json({ error: 'Path query invalid.' })
}
if (typeof path === 'string') {
const accessToken = await getAccessToken()
const requestUrl = `${apiConfig.driveApi}/root${encodePath(path)}`
const files = await axios.get(requestUrl, {
headers: { Authorization: `Bearer ${accessToken}` },
params: {
select: 'name,size,id,createdDateTime',
expand: 'children(select=name,createdDateTime,eTag,size,id,file)',
},
})
res.status(200).json({ path, files: files.data })
return
}
res.status(404).json({ error: 'Path query invalid.' })
}