UNPKG

@remcostoeten/fync

Version:

Unified TypeScript library for 9 popular APIs with consistent functional architecture

254 lines 9.27 kB
import { createApiBuilder, defineResource } from "../core"; const GOOGLE_DRIVE_API_BASE = "https://www.googleapis.com/drive/v3"; const filesResource = defineResource({ name: "files", basePath: "/files", methods: { listFiles: { path: "" }, getFile: { path: "/{fileId}" }, createFile: { path: "", method: "POST" }, updateFile: { path: "/{fileId}", method: "PATCH" }, deleteFile: { path: "/{fileId}", method: "DELETE" }, copyFile: { path: "/{fileId}/copy", method: "POST" }, moveFile: { path: "/{fileId}", method: "PATCH" }, exportFile: { path: "/{fileId}/export" }, downloadFile: { path: "/{fileId}" }, generateIds: { path: "/generateIds" }, watchFile: { path: "/{fileId}/watch", method: "POST" }, emptyTrash: { path: "/trash", method: "DELETE" }, getFileMetadata: { path: "/{fileId}" }, updateFileMetadata: { path: "/{fileId}", method: "PATCH" }, }, }); const permissionsResource = defineResource({ name: "permissions", basePath: "/files/{fileId}/permissions", methods: { listPermissions: { path: "" }, getPermission: { path: "/{permissionId}" }, createPermission: { path: "", method: "POST" }, updatePermission: { path: "/{permissionId}", method: "PATCH" }, deletePermission: { path: "/{permissionId}", method: "DELETE" }, }, }); const commentsResource = defineResource({ name: "comments", basePath: "/files/{fileId}/comments", methods: { listComments: { path: "" }, getComment: { path: "/{commentId}" }, createComment: { path: "", method: "POST" }, updateComment: { path: "/{commentId}", method: "PATCH" }, deleteComment: { path: "/{commentId}", method: "DELETE" }, }, }); const repliesResource = defineResource({ name: "replies", basePath: "/files/{fileId}/comments/{commentId}/replies", methods: { listReplies: { path: "" }, getReply: { path: "/{replyId}" }, createReply: { path: "", method: "POST" }, updateReply: { path: "/{replyId}", method: "PATCH" }, deleteReply: { path: "/{replyId}", method: "DELETE" }, }, }); const revisionsResource = defineResource({ name: "revisions", basePath: "/files/{fileId}/revisions", methods: { listRevisions: { path: "" }, getRevision: { path: "/{revisionId}" }, updateRevision: { path: "/{revisionId}", method: "PATCH" }, deleteRevision: { path: "/{revisionId}", method: "DELETE" }, }, }); const drivesResource = defineResource({ name: "drives", basePath: "/drives", methods: { listDrives: { path: "" }, getDrive: { path: "/{driveId}" }, createDrive: { path: "", method: "POST" }, updateDrive: { path: "/{driveId}", method: "PATCH" }, deleteDrive: { path: "/{driveId}", method: "DELETE" }, hideDrive: { path: "/{driveId}/hide", method: "POST" }, unhideDrive: { path: "/{driveId}/unhide", method: "POST" }, }, }); const changesResource = defineResource({ name: "changes", basePath: "/changes", methods: { listChanges: { path: "" }, getStartPageToken: { path: "/startPageToken" }, watchChanges: { path: "/watch", method: "POST" }, }, }); const channelsResource = defineResource({ name: "channels", basePath: "/channels", methods: { stopChannel: { path: "/stop", method: "POST" }, }, }); const aboutResource = defineResource({ name: "about", basePath: "/about", methods: { getAbout: { path: "" }, }, }); const resources = { files: filesResource, permissions: permissionsResource, comments: commentsResource, replies: repliesResource, revisions: revisionsResource, drives: drivesResource, changes: changesResource, channels: channelsResource, about: aboutResource, }; const buildGoogleDrive = createApiBuilder({ baseUrl: GOOGLE_DRIVE_API_BASE, auth: { type: "bearer" }, headers: { "Content-Type": "application/json", }, }); export function GoogleDrive(config) { const base = buildGoogleDrive(config, resources); const drive = base; drive.listFiles = function (options) { return base.files.listFiles(options); }; drive.getFile = function (fileId) { return base.files.getFile({ fileId }); }; drive.createFile = function (metadata, content) { const body = content ? { ...metadata, media: content } : metadata; return base.files.createFile(body); }; drive.updateFile = function (fileId, metadata, content) { const body = content ? { ...metadata, media: content } : metadata; return base.files.updateFile({ fileId, ...body }); }; drive.deleteFile = function (fileId) { return base.files.deleteFile({ fileId }); }; drive.copyFile = function (fileId, name) { const body = name ? { name } : {}; return base.files.copyFile({ fileId, ...body }); }; drive.moveFile = function (fileId, parentId) { return base.files.updateFile({ fileId, addParents: parentId, removeParents: "root", }); }; drive.downloadFile = function (fileId) { return base.files.downloadFile({ fileId, alt: "media" }); }; drive.exportFile = function (fileId, mimeType) { return base.files.exportFile({ fileId, mimeType }); }; drive.createFolder = function (name, parentId) { const metadata = { name, mimeType: "application/vnd.google-apps.folder", parents: parentId ? [parentId] : ["root"], }; return base.files.createFile(metadata); }; drive.listFolders = async function () { const response = await base.files.listFiles({ q: "mimeType='application/vnd.google-apps.folder'", fields: "files(id, name, parents, createdTime, modifiedTime)", }); return response.files || []; }; drive.getFolderContents = async function (folderId) { const response = await base.files.listFiles({ q: `'${folderId}' in parents`, fields: "files(id, name, mimeType, size, createdTime, modifiedTime)", }); return response.files || []; }; drive.searchFiles = async function (query) { const response = await base.files.listFiles({ q: `name contains '${query}'`, fields: "files(id, name, mimeType, size, createdTime, modifiedTime)", }); return response.files || []; }; drive.getFilesByName = async function (name) { const response = await base.files.listFiles({ q: `name = '${name}'`, fields: "files(id, name, mimeType, size, createdTime, modifiedTime)", }); return response.files || []; }; drive.getFilesByType = async function (mimeType) { const response = await base.files.listFiles({ q: `mimeType = '${mimeType}'`, fields: "files(id, name, size, createdTime, modifiedTime)", }); return response.files || []; }; drive.getSharedFiles = async function () { const response = await base.files.listFiles({ q: "sharedWithMe = true", fields: "files(id, name, mimeType, size, owners, sharingUser)", }); return response.files || []; }; drive.getRecentFiles = async function (days = 7) { const date = new Date(); date.setDate(date.getDate() - days); const dateString = date.toISOString(); const response = await base.files.listFiles({ q: `modifiedTime > '${dateString}'`, orderBy: "modifiedTime desc", fields: "files(id, name, mimeType, size, modifiedTime)", }); return response.files || []; }; drive.getStorageQuota = async function () { const response = await base.about.getAbout({ fields: "storageQuota, user", }); return { used: response.storageQuota?.usage || 0, limit: response.storageQuota?.limit || 0, usageInDrive: response.storageQuota?.usageInDrive || 0, usageInDriveTrash: response.storageQuota?.usageInDriveTrash || 0, }; }; drive.shareFile = function (fileId, email, role = "reader") { return base.permissions.createPermission({ type: "user", role, emailAddress: email, }, { fileId }); }; drive.unshareFile = function (fileId, permissionId) { return base.permissions.deletePermission({ fileId, permissionId }); }; drive.getFilePermissions = function (fileId) { return base.permissions.listPermissions({ fileId }); }; drive.emptyTrash = function () { return base.files.emptyTrash(); }; drive.restoreFile = function (fileId) { return base.files.updateFile({ fileId, trashed: false }); }; drive.permanentlyDeleteFile = function (fileId) { return base.files.deleteFile({ fileId, supportsAllDrives: true }); }; return drive; } export * from "./types"; //# sourceMappingURL=index.js.map