-
Notifications
You must be signed in to change notification settings - Fork 1
/
getfilelist_js.min.js
1 lines (1 loc) · 6.16 KB
/
getfilelist_js.min.js
1
"use strict";!function(r){let GetFileList;GetFileList=function(){function GetFileList(){this.obj={}}GetFileList.prototype.getFolderTree=function(resource){return new Promise((resolve,reject)=>{this.obj={resource:resource},init.call(this,err=>{err?reject(err):this.obj.method?getFromAllFolders.call(this,(err,folderTree)=>{err?reject(err):resolve(folderTree)}):getFolderTreeRecursively.call(this,(err,folderTree)=>{err?reject(err):resolve(folderTree)})})})},GetFileList.prototype.getFileList=function(resource){return new Promise((resolve,reject)=>{this.obj={resource:resource},init.call(this,err=>{err?reject(err):this.obj.method?getFromAllFolders.call(this,(err,folderTree)=>{err?reject(err):getFilesFromFolder.call(this,folderTree).then(res=>{resolve(res)}).catch(err=>{reject(err)})}):getFolderTreeRecursively.call(this,(err,folderTree)=>{err?reject(err):getFilesFromFolder.call(this,folderTree).then(res=>{resolve(res)}).catch(err=>{reject(err)})})})})};const init=function(callback){const rootId="root"==this.obj.resource.id.toLowerCase();if("apiKey"in this.obj.resource&&!("accessToken"in this.obj.resource)&&rootId)return void callback("All folders in Google Drive cannot be retrieved using API key. Please use OAuth2.");const endpoint="https://www.googleapis.com/drive/v3/files/"+this.obj.resource.id,[apiKey,accessToken]=checkTokens.call(this),chkAuth=!(!apiKey&&!accessToken),qs={supportsAllDrives:!0,fields:"createdTime,id,mimeType,modifiedTime,name,owners,parents,shared,webContentLink,webViewLink,driveId"};let params={method:"GET"};accessToken?params.headers=new Headers({Authorization:"Bearer "+accessToken}):apiKey&&(qs.key=apiKey);const query="?"+Object.keys(qs).map(e=>encodeURIComponent(e)+"="+encodeURIComponent(qs[e])).join("&");fetch(endpoint+query,params).then(res=>res.json()).then(val=>{"error"in val&&callback(val),this.obj.searchedFolder=val,this.obj.method=(chkAuth||rootId)&&!this.obj.searchedFolder.shared,callback(null)}).catch(err=>{callback(err)})},checkTokens=function(){let apiKey="",accessToken="";return"apiKey"in this.obj.resource&&"accessToken"in this.obj.resource||!("apiKey"in this.obj.resource)&&"accessToken"in this.obj.resource?accessToken=this.obj.resource.accessToken:"apiKey"in this.obj.resource&&!("accessToken"in this.obj.resource)?apiKey=this.obj.resource.apiKey:"apiKey"in this.obj.resource||"accessToken"in this.obj.resource||callback("Please use apiKey or accessToken"),[apiKey,accessToken]},getFolderTreeRecursively=function(callback){let folderTr={search:this.obj.searchedFolder.id,temp:[]};getAllfoldersRecursively.call(this,this.obj.searchedFolder.id,[],folderTr).then(value=>{const res=getDlFoldersS.call(this,value);callback(null,res)}).catch(err=>{callback(err,null)})},getAllfoldersRecursively=async function(id,parents,folders){const q="'"+id+"' in parents and mimeType='application/vnd.google-apps.folder' and trashed=false",fields="files(id,mimeType,name,parents,size),nextPageToken",files=await getListLoop.call(this,q,fields,[]),temp=files.map(e=>({name:e.name,id:e.id,parent:e.parents[0],tree:parents.concat(id)}));if(temp.length>0){folders.temp.push(temp);for(let i=0;i<temp.length;i++)await getAllfoldersRecursively.call(this,temp[i].id,temp[i].tree,folders)}return folders},getList=function(ptoken,q,fields){return new Promise((resolve,reject)=>{const endpoint="https://www.googleapis.com/drive/v3/files",[apiKey,accessToken]=checkTokens.call(this),qs={q:q,fields:fields,orderBy:"name",pageSize:1e3,pageToken:ptoken||"",includeItemsFromAllDrives:!0,supportsAllDrives:!0};this.obj.searchedFolder.driveId&&(qs.driveId=this.obj.searchedFolder.driveId,qs.corpora="drive");let params={method:"GET"};accessToken?params.headers=new Headers({Authorization:"Bearer "+accessToken}):apiKey&&(qs.key=apiKey);const query="?"+Object.keys(qs).map(e=>encodeURIComponent(e)+"="+encodeURIComponent(qs[e])).join("&");fetch(endpoint+query,params).then(res=>res.json()).then(val=>{"error"in val?reject(val):resolve(val)}).catch(err=>{reject(err)})})},getFromAllFolders=function(callback){const q="mimeType='application/vnd.google-apps.folder' and trashed=false",fields="files(id,mimeType,name,parents,size),nextPageToken";getListLoop.call(this,q,fields,[]).then(files=>{let tr={search:this.obj.searchedFolder.id,temp:[]};const value=createFolderTreeID.call(this,files,this.obj.searchedFolder.id,[],tr),res=getDlFoldersS.call(this,value);callback(null,res)}).catch(err=>{callback(err,null)})},createFolderTreeID=function(fm,id,parents,fls){const temp=fm.reduce((ar,e,i)=>{if("parents"in e&&e.parents.length>0&&e.parents[0]==id){const t={name:e.name,id:e.id,parent:e.parents[0],tree:parents.concat(id)};ar.push(t)}return ar},[]);if(temp.length>0){fls.temp.push(temp);for(let i=0;i<temp.length;i++)createFolderTreeID(fm,temp[i].id,temp[i].tree,fls)}return fls},getFilesFromFolder=async function(folderTree){const e=this.obj;let f={searchedFolder:e.searchedFolder,folderTree:folderTree,fileList:[]};const fields=e.resource.fields?(~e.resource.fields.indexOf("nextPageToken")||(e.resource.fields+=",nextPageToken"),e.resource.fields):"files(createdTime,description,id,mimeType,modifiedTime,name,owners,parents,permissions,shared,size,webContentLink,webViewLink),nextPageToken";for(let i=0;i<folderTree.folders.length;i++){const id=folderTree.folders[i],q="'"+id+"' in parents and mimeType != 'application/vnd.google-apps.folder' and trashed=false",fm=await getListLoop.call(this,q,fields,[]);let fe={files:[]};fe.folderTree=folderTree.id[i],fe.files=fe.files.concat(fm),f.fileList.push(fe)}return f.totalNumberOfFolders=f.folderTree.folders.length,f.totalNumberOfFiles=f.fileList.reduce((c,f)=>c+=f.files.length,0),f},getListLoop=async function(q,fields,list){let NextPageToken="";do{const res=await getList.call(this,NextPageToken,q,fields);Array.prototype.push.apply(list,res.files),NextPageToken=res.nextPageToken}while(NextPageToken);return list},getDlFoldersS=function(fr){let fT={id:[],names:[],folders:[]};fT.id.push([fr.search]),fT.names.push(this.obj.searchedFolder.name),fT.folders.push(fr.search);for(let i=0;i<fr.temp.length;i++){let e=fr.temp[i];for(let j=0;j<e.length;j++){let f=e[j];fT.folders.push(f.id);let tmp=[];fT.id.push(tmp.concat(f.tree).concat(f.id)),fT.names.push(f.name)}}return fT};return GetFileList}(),r.GetFileList=GetFileList}(this);