//native
export type DynSelect_folder_id = string
// Dropdown of the account's folders (first 1000, by name).
export async function folder_id(auth: RT.Gdrive) {
const url = new URL("https://www.googleapis.com/drive/v3/files")
url.searchParams.append(
"q",
"mimeType = 'application/vnd.google-apps.folder' and trashed = false"
)
url.searchParams.append("fields", "files(id, name)")
url.searchParams.append("orderBy", "name")
url.searchParams.append("pageSize", "1000")
url.searchParams.append("supportsAllDrives", "true")
url.searchParams.append("includeItemsFromAllDrives", "true")
const response = await fetch(url, {
headers: {
Authorization: `Bearer ${auth.token}`,
Accept: "application/json",
},
})
if (!response.ok) {
throw new Error(`${response.status} ${await response.text()}`)
}
const { files } = (await response.json()) as {
files: { id: string; name: string }[]
}
return [
{ value: "root", label: "My Drive (root)" },
...files.map((f) => ({ value: f.id, label: `${f.name} (${f.id})` })),
]
}
/**
* List Files
* Search files and folders with a Drive query (e.g. `name contains 'report' and mimeType = 'application/pdf'`), optionally restricted to one folder. Includes shared drives; trashed files are excluded unless requested. Returns `files` and `nextPageToken`.
*/
export async function main(
auth: RT.Gdrive,
q: string | undefined,
folder_id: DynSelect_folder_id | undefined,
include_trashed: boolean = false,
order_by: string | undefined,
page_size: number = 100,
page_token: string | undefined,
fields: string = "nextPageToken, files(id, name, mimeType, parents, size, createdTime, modifiedTime, webViewLink)"
) {
const clauses: string[] = []
if (q !== undefined && q !== "") clauses.push(`(${q})`)
if (folder_id !== undefined && folder_id !== "")
clauses.push(`'${folder_id}' in parents`)
if (!include_trashed) clauses.push("trashed = false")
const url = new URL("https://www.googleapis.com/drive/v3/files")
if (clauses.length > 0) url.searchParams.append("q", clauses.join(" and "))
url.searchParams.append("pageSize", String(page_size))
url.searchParams.append("fields", fields)
url.searchParams.append("supportsAllDrives", "true")
url.searchParams.append("includeItemsFromAllDrives", "true")
if (order_by !== undefined && order_by !== "")
url.searchParams.append("orderBy", order_by)
if (page_token !== undefined && page_token !== "")
url.searchParams.append("pageToken", page_token)
const response = await fetch(url, {
headers: {
Authorization: `Bearer ${auth.token}`,
Accept: "application/json",
},
})
if (!response.ok) {
throw new Error(`${response.status} ${await response.text()}`)
}
return await response.json()
}
Submitted by hugo989 1 hour ago