From 6129439eab6ef69cccb06c27d39aa1e311396678 Mon Sep 17 00:00:00 2001 From: kyle hoell Date: Wed, 25 Nov 2020 15:21:29 -0500 Subject: [PATCH] cleaned up google file service putting it on a db util --- backend/db/utils/googleFileUtils/index.ts | 130 +++++++++++++++++ backend/services/GoogleFileService/index.ts | 153 +++----------------- backend/utils/convertDriveToMongo.ts | 1 + backend/utils/sortGoogleMongoQuickFiles.ts | 19 +++ 4 files changed, 170 insertions(+), 133 deletions(-) create mode 100644 backend/utils/sortGoogleMongoQuickFiles.ts diff --git a/backend/db/utils/googleFileUtils/index.ts b/backend/db/utils/googleFileUtils/index.ts index 0a66969..7e962c0 100644 --- a/backend/db/utils/googleFileUtils/index.ts +++ b/backend/db/utils/googleFileUtils/index.ts @@ -29,6 +29,136 @@ class GoogleDbUtil { return files } + + getFileInfo = async(id: string, user: UserInterface) => { + + const oauth2Client = await getGoogleAuth(user); + + const drive = google.drive({version:"v3", auth: oauth2Client}); + + const file = await drive.files.get({fileId: id, fields: fields}); + + return file; + } + + getQuickList = async(user: UserInterface) => { + + const oauth2Client = await getGoogleAuth(user); + + const drive = google.drive({version:"v3", auth: oauth2Client}); + + let query = 'mimeType != "application/vnd.google-apps.folder" and trashed=false'; + + const files = await drive.files.list({pageSize: 10, fields: `nextPageToken, files(${fields})`, q: query}); + + return files; + } + + getSuggestedList = async(searchQuery: string, user: UserInterface) => { + + const driveQuery = `name contains "${searchQuery}" and mimeType != "application/vnd.google-apps.folder" and trashed=false` + const driveQueryFolder = `name contains "${searchQuery}" and mimeType = "application/vnd.google-apps.folder" and trashed=false` + + const oauth2Client = await getGoogleAuth(user); + + const drive = google.drive({version:"v3", auth: oauth2Client}); + const files = await drive.files.list({pageSize: 10, fields: `nextPageToken, files(${fields})`, q: driveQuery}); + const folders = await drive.files.list({pageSize: 10, fields: `nextPageToken, files(${fields})`, q: driveQueryFolder}); + + return { + files, + folders + } + } + + renameFile = async(fileID: string, title: string, user: UserInterface) => { + + const oauth2Client = await getGoogleAuth(user); + + const drive = google.drive({version:"v3", auth: oauth2Client}); + + await drive.files.update({fileId: fileID, requestBody: {name:title}}) + } + + removeFile = async(fileID: string, user: UserInterface) => { + + const oauth2Client = await getGoogleAuth(user); + + const drive = google.drive({version:"v3", auth: oauth2Client}); + + await drive.files.delete({fileId:fileID}); + } + + getDownloadFileMetadata = async(fileID: string, user: UserInterface) => { + + const oauth2Client = await getGoogleAuth(user); + const drive = google.drive({version:"v3", auth: oauth2Client}); + + const fileMetadata = await drive.files.get({fileId: fileID, fields: "*"}); + + return {fileMetadata, drive}; + } + + moveFile = async(fileID: string, parentID: string, user: UserInterface) => { + + const oauth2Client = await getGoogleAuth(user); + + const drive = google.drive({version:"v3", auth: oauth2Client}); + + const previousFile = await drive.files.get({ + fileId: fileID, + fields: "*" + }) + + const previousParent = previousFile.data.parents![0]; + + await drive.files.update({ + fileId: fileID, + addParents: parentID, + removeParents: previousParent, + fields: fields + }) + } + + makeFilePublic = async(fileID: string, user: UserInterface) => { + + const oauth2Client = await getGoogleAuth(user); + + const drive = google.drive({version:"v3", auth: oauth2Client}); + + await drive.permissions.create({ + requestBody: { + type: "anyone", + role: "reader" + }, + fileId: fileID, + fields: "*" + }) + + const fileDetails = await drive.files.get({ + fileId: fileID, + fields: fields + }) + + const publicURL = fileDetails.data.webViewLink!; + + return publicURL; + } + + removePublicLink = async(fileID: string, user: UserInterface) => { + + const {fileMetadata, drive} = await this.getDownloadFileMetadata(fileID, user); + + await drive.permissions.get({ + fileId: fileID, + permissionId: fileMetadata.data.permissionIds![0] + }) + + await drive.permissions.delete({ + fileId: fileID, + permissionId: fileMetadata.data.permissionIds![0] + }) + } } export default GoogleDbUtil; \ No newline at end of file diff --git a/backend/services/GoogleFileService/index.ts b/backend/services/GoogleFileService/index.ts index 581cfa5..3beee04 100644 --- a/backend/services/GoogleFileService/index.ts +++ b/backend/services/GoogleFileService/index.ts @@ -15,6 +15,7 @@ import axios from "axios"; import awaitUploadGoogle from "../ChunkService/utils/awaitUploadGoogle"; import {googleQueryType} from "../../utils/createQueryGoogle"; import GoogleDbUtils from "../../db/utils/googleFileUtils"; +import sortGoogleMongoQuickFiles from "../../utils/sortGoogleMongoQuickFiles"; const googleDbUtils = new GoogleDbUtils(); @@ -48,19 +49,8 @@ class GoogleFileService { } getMongoGoogleList = async(user: UserInterface, query: googleQueryType) => { - - const oauth2Client = await getGoogleAuth(user); - - const limit = query.limit; - - let parent = query.parent === "/" ? "root" : query.parent; - - const {queryBuilder, orderBy} = createQueryGoogle(query, parent) - - const previosPageToken = query.pageToken; - - const drive = google.drive({version:"v3", auth: oauth2Client}); - const files = await drive.files.list({pageSize: limit, fields: `nextPageToken, files(${fields})`, q: queryBuilder, orderBy, pageToken: previosPageToken}); + + const files = await googleDbUtils.getList(query, user); const nextPageToken = files.data.nextPageToken; @@ -77,11 +67,7 @@ class GoogleFileService { getFileInfo = async(user: UserInterface, id: string) => { - const oauth2Client = await getGoogleAuth(user); - - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const file = await drive.files.get({fileId: id, fields: fields}); + const file = await googleDbUtils.getFileInfo(id, user); const userID = user._id; const convertedFile = convertDriveToMongo(file.data, userID); @@ -91,47 +77,24 @@ class GoogleFileService { getGoogleMongoQuickList = async(user: UserInterface) => { - const oauth2Client = await getGoogleAuth(user); - - const drive = google.drive({version:"v3", auth: oauth2Client}); - - let query = 'mimeType != "application/vnd.google-apps.folder" and trashed=false'; - - const files = await drive.files.list({pageSize: 10, fields: `nextPageToken, files(${fields})`, q: query}); - + const files = await googleDbUtils.getQuickList(user); + const userID = user._id const convertedFiles = convertDriveListToMongoList(files.data.files, userID); const quickList = await fileService.getQuickList(user); - let combinedData = [...convertedFiles, ...quickList] - - combinedData = combinedData.sort((a, b) => { - const convertedDateA = new Date(a.uploadDate).getTime(); - const convertedDateB = new Date(b.uploadDate).getTime(); - - return convertedDateB - convertedDateA; - }) + const sortedGoogleMongoQuickList = sortGoogleMongoQuickFiles(convertedFiles, quickList); - if (combinedData.length >= 10) { - combinedData = combinedData.slice(0, 10); - } - - return combinedData; + return sortedGoogleMongoQuickList; } getGoogleMongoSuggestedList = async(user: UserInterface, searchQuery: string) => { - const driveQuery = `name contains "${searchQuery}" and mimeType != "application/vnd.google-apps.folder" and trashed=false` - const driveQueryFolder = `name contains "${searchQuery}" and mimeType = "application/vnd.google-apps.folder" and trashed=false` - - const oauth2Client = await getGoogleAuth(user); - - const drive = google.drive({version:"v3", auth: oauth2Client}); - const files = await drive.files.list({pageSize: 10, fields: `nextPageToken, files(${fields})`, q: driveQuery}); - const folders = await drive.files.list({pageSize: 10, fields: `nextPageToken, files(${fields})`, q: driveQueryFolder}); + const {files, folders} = await googleDbUtils.getSuggestedList(searchQuery, user); const userID = user._id; + const convertedFiles = convertDriveListToMongoList(files.data.files, userID); const convertedFolders = convertDriveFoldersToMongoFolders(folders.data.files, userID); @@ -145,28 +108,17 @@ class GoogleFileService { renameFile = async(user: UserInterface, fileID: string, title: string) => { - const oauth2Client = await getGoogleAuth(user); - - const drive = google.drive({version:"v3", auth: oauth2Client}); - - await drive.files.update({fileId: fileID, requestBody: {name:title}}) + await googleDbUtils.renameFile(fileID, title, user); } removeFile = async(user: UserInterface, fileID: string) => { - const oauth2Client = await getGoogleAuth(user); - - const drive = google.drive({version:"v3", auth: oauth2Client}); - - await drive.files.delete({fileId:fileID}); + await googleDbUtils.removeFile(fileID, user); } downloadFile = async(user: UserInterface, fileID: string, res: Response) => { - const oauth2Client = await getGoogleAuth(user); - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const fileMetadata = await drive.files.get({fileId: fileID, fields: "*"}) + const {fileMetadata, drive} = await googleDbUtils.getDownloadFileMetadata(fileID, user); res.set('Content-Type', 'binary/octet-stream'); res.set('Content-Disposition', 'attachment; filename="' + fileMetadata.data.name! + '"'); @@ -195,10 +147,7 @@ class GoogleFileService { downloadDoc = async(user: UserInterface, fileID: string, res: Response) => { - const oauth2Client = await getGoogleAuth(user); - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const fileMetadata = await drive.files.get({fileId: fileID, fields: "*"}) + const {fileMetadata, drive} = await googleDbUtils.getDownloadFileMetadata(fileID, user); res.set('Content-Type', 'binary/octet-stream'); res.set('Content-Disposition', 'attachment; filename="' + fileMetadata.data.name! + ".pdf" + '"'); @@ -223,10 +172,7 @@ class GoogleFileService { getThumbnail = async(user: UserInterface, fileID: string, res: Response) => { - const oauth2Client = await getGoogleAuth(user); - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const fileMetadata = await drive.files.get({fileId: fileID, fields: "*"}) + const {fileMetadata, drive} = await googleDbUtils.getDownloadFileMetadata(fileID, user); res.set('Content-Type', 'binary/octet-stream'); res.set('Content-Disposition', 'attachment; filename="' + fileMetadata.data.name! + '"'); @@ -254,10 +200,7 @@ class GoogleFileService { getFullThumbnail = async(user: UserInterface, fileID: string, res: Response) => { - const oauth2Client = await getGoogleAuth(user); - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const fileMetadata = await drive.files.get({fileId: fileID, fields: "*"}) + const {fileMetadata, drive} = await googleDbUtils.getDownloadFileMetadata(fileID, user); res.set('Content-Type', 'binary/octet-stream'); res.set('Content-Disposition', 'attachment; filename="' + fileMetadata.data.name! + '"'); @@ -289,10 +232,7 @@ class GoogleFileService { const currentUUID = uuid.v4(); tempStorage[tempUUID] = currentUUID; - const oauth2Client = await getGoogleAuth(user); - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const fileMetadata = await drive.files.get({fileId: fileID, fields: "*"}) + const {fileMetadata, drive} = await googleDbUtils.getDownloadFileMetadata(fileID, user); const fileSize = +fileMetadata.data.size! @@ -406,72 +346,19 @@ class GoogleFileService { moveFile = async(user: UserInterface, fileID: string, parentID: string) => { - const oauth2Client = await getGoogleAuth(user); - - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const previousFile = await drive.files.get({ - fileId: fileID, - fields: "*" - }) - - const previousParent = previousFile.data.parents![0]; - - await drive.files.update({ - fileId: fileID, - addParents: parentID, - removeParents: previousParent, - fields: fields - }) + await googleDbUtils.moveFile(fileID, parentID, user); } makeFilePublic = async(user: UserInterface, fileID: string) => { - const oauth2Client = await getGoogleAuth(user); - - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const publicFile = await drive.permissions.create({ - requestBody: { - type: "anyone", - role: "reader" - }, - fileId: fileID, - fields: "*" - }) - - const fileDetails = await drive.files.get({ - fileId: fileID, - fields: fields - }) - - const publicURL = fileDetails.data.webViewLink!; + const publicURL = await googleDbUtils.makeFilePublic(fileID, user); return publicURL; } removePublicLink = async(user: UserInterface, fileID: string) => { - const oauth2Client = await getGoogleAuth(user); - - const drive = google.drive({version:"v3", auth: oauth2Client}); - - const fileMetadata = await drive.files.get({ - fileId: fileID, - fields: "*", - }) - - const permissions = await drive.permissions.get({ - fileId: fileID, - permissionId: fileMetadata.data.permissionIds![0] - }) - - console.log(permissions.data) - - await drive.permissions.delete({ - fileId: fileID, - permissionId: fileMetadata.data.permissionIds![0] - }) + await googleDbUtils.removePublicLink(fileID, user); } } diff --git a/backend/utils/convertDriveToMongo.ts b/backend/utils/convertDriveToMongo.ts index b02b099..5494e5a 100644 --- a/backend/utils/convertDriveToMongo.ts +++ b/backend/utils/convertDriveToMongo.ts @@ -1,4 +1,5 @@ import videoChecker from "./videoChecker"; +import {FileInterface} from "../models/file"; const convertDriveToMongo = (driveObj: any, ownerID: string, pageToken?: string | undefined | null) => { diff --git a/backend/utils/sortGoogleMongoQuickFiles.ts b/backend/utils/sortGoogleMongoQuickFiles.ts new file mode 100644 index 0000000..fa3c8a1 --- /dev/null +++ b/backend/utils/sortGoogleMongoQuickFiles.ts @@ -0,0 +1,19 @@ +const sortGoogleMongoQuickFiles = (convertedFiles: any[], quickList: any[]) => { + + let combinedData = [...convertedFiles, ...quickList] + + combinedData = combinedData.sort((a, b) => { + const convertedDateA = new Date(a.uploadDate).getTime(); + const convertedDateB = new Date(b.uploadDate).getTime(); + + return convertedDateB - convertedDateA; + }) + + if (combinedData.length >= 10) { + combinedData = combinedData.slice(0, 10); + } + + return combinedData; +} + +export default sortGoogleMongoQuickFiles; \ No newline at end of file