63 lines
1.9 KiB
TypeScript
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.' })
|
|
}
|