mirror of
https://github.com/Nezumi-2711/next-gdrive-index.git
synced 2026-09-22 20:01:36 +00:00
72 lines
1.8 KiB
TypeScript
72 lines
1.8 KiB
TypeScript
import {
|
|
FilesResponse,
|
|
ErrorResponse,
|
|
SearchResponse,
|
|
} from "@/types/googleapis";
|
|
import drive from "@/utils/driveClient";
|
|
import { buildQuery } from "@/utils/driveHelper";
|
|
import { NextApiRequest, NextApiResponse } from "next";
|
|
import config from "@config/site.config";
|
|
|
|
export default async function handler(
|
|
request: NextApiRequest,
|
|
response: NextApiResponse<SearchResponse | ErrorResponse>,
|
|
) {
|
|
try {
|
|
const { query } = request.query;
|
|
if (!query) {
|
|
const payload: SearchResponse = {
|
|
success: true,
|
|
timestamp: new Date().toISOString(),
|
|
files: [],
|
|
};
|
|
|
|
return response.status(200).json(payload);
|
|
}
|
|
|
|
const fetchFiles = await drive.files.list({
|
|
q: buildQuery({
|
|
extraQuery: [`name contains '${query}'`],
|
|
globalSearch: true,
|
|
}),
|
|
fields:
|
|
"files(id, name, mimeType, thumbnailLink, fileExtension, createdTime, modifiedTime, size)",
|
|
pageSize: config.files.searchResult,
|
|
});
|
|
|
|
const payload: SearchResponse = {
|
|
success: true,
|
|
timestamp: new Date().toISOString(),
|
|
files: fetchFiles.data.files || [],
|
|
};
|
|
|
|
return response.status(200).json(payload);
|
|
} catch (error: any) {
|
|
if (error satisfies ErrorResponse) {
|
|
const payload: ErrorResponse = {
|
|
success: false,
|
|
timestamp: new Date().toISOString(),
|
|
code: error.code,
|
|
errors: {
|
|
message: error.errors[0].message,
|
|
reason: error.errors[0].reason,
|
|
},
|
|
};
|
|
|
|
return response.status(error.code).json(payload);
|
|
}
|
|
|
|
const payload: ErrorResponse = {
|
|
success: false,
|
|
timestamp: new Date().toISOString(),
|
|
code: 500,
|
|
errors: {
|
|
message: error.message,
|
|
reason: "internalError",
|
|
},
|
|
};
|
|
|
|
return response.status(500).json(payload);
|
|
}
|
|
}
|