import { requestGoogle } from './core.ts'
import type { JsonObject } from './types.ts'
export type DriveAboutParams = { account: string; fields?: string }
export type DriveSearchParams = { account: string; query?: string; q?: string; pageSize?: number; pageToken?: string; orderBy?: string; fields?: string }
export type DriveFileParams = { account: string; fileId: string; fields?: string }
export type DriveExportParams = { account: string; fileId: string; mimeType?: string }
export async function getDriveAbout(params: DriveAboutParams): Promise<JsonObject> { const { fields = 'user(displayName,emailAddress),storageQuota(limit,usage)' } = params; return await requestGoogle({ ...params, api: 'google', path: '/drive/v3/about', query: { fields } }) as JsonObject }
export async function searchFiles(params: DriveSearchParams): Promise<JsonObject> { const { query, q = query, pageSize = 10, pageToken, orderBy, fields = 'files(id,name,mimeType,webViewLink,modifiedTime),nextPageToken' } = params; return await requestGoogle({ ...params, api: 'google', path: '/drive/v3/files', query: { q, pageSize, pageToken, orderBy, fields } }) as JsonObject }
export async function getFileMetadata(params: DriveFileParams): Promise<JsonObject> { const { fileId, fields = 'id,name,mimeType,webViewLink,modifiedTime,size,owners(displayName,emailAddress)' } = params; if (!fileId) throw new Error('getFileMetadata requires fileId.'); return await requestGoogle({ ...params, api: 'google', path: '/drive/v3/files/' + encodeURIComponent(fileId), query: { fields } }) as JsonObject }
export async function exportFile(params: DriveExportParams): Promise<unknown> { const { fileId, mimeType = 'text/plain' } = params; if (!fileId) throw new Error('exportFile requires fileId.'); return await requestGoogle({ ...params, api: 'google', path: '/drive/v3/files/' + encodeURIComponent(fileId) + '/export', query: { mimeType } }) }
/**
* Return the Google Drive helper namespace for about, search, metadata, and export.
* @example
* import drive from 'kody:@kentcdodds/google/drive'
* const files = await drive().searchFiles({ account: 'personal', query: "name contains 'notes'" })
* // => { files: [...], nextPageToken: null }
*/
export default function drive() { return { getDriveAbout, searchFiles, getFileMetadata, exportFile } }