Exemplo n.º 1
0
        private async Task <string> GetOrCreateRootFolderIdAsync()
        {
            _logger.LogInformation($"Access app root '{_config.RootFolderName}' in '{_config.StorageRoot}'");
            var isTeamDrive = false;
            var pathItems   = _config.StorageRoot.Split(new[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries);

            if (pathItems[0].ToLower() != "root")
            {
                isTeamDrive = true;
                var tdReq = new TeamdrivesResource.ListRequest(_driveService)
                {
                    Fields = "teamDrives(id,name)", QuotaUser = QuotaUser
                };
                var tds = await tdReq.ExecuteAsync();

                var td = tds.TeamDrives.FirstOrDefault(x => x.Name == pathItems[0]);
                if (td == null)
                {
                    throw new ApplicationException($"TeamDrive '{pathItems[0]}' not found");
                }
                pathItems[0] = td.Id;
                _logger.LogInformation($"TeamDrive id: {pathItems[0]}");
            }

            //todo: add nested path parsing
            var baseRoot = pathItems[0];

            var rootFolder = await GetFilesAsync(x => x.Name == _config.RootFolderName && x.Parents.Contains(baseRoot));

            if (rootFolder.Count(x => x.IsDirectory) > 1)
            {
                throw new InvalidOperationException($"More than one {_config.RootFolderName} folders exists in the drive root.");
            }
            var rootId = rootFolder.FirstOrDefault(x => x.IsDirectory)?.Id;

            if (!rootFolder.Any(x => x.IsDirectory))
            {
                var file = new File
                {
                    Name     = _config.RootFolderName,
                    MimeType = GoogleDriveFolderMime,
                    Parents  = new List <string> {
                        baseRoot
                    }
                };
                var createRequest = new FilesResource.CreateRequest(_driveService, file)
                {
                    QuotaUser = QuotaUser, SupportsTeamDrives = _config.SupportsTeamDrives
                };
                rootId = (await createRequest.ExecuteAsync()).Id;
                _logger.LogInformation($"New app root {_config.RootFolderName} created in '{_config.StorageRoot}'");
            }

            _logger.LogInformation($"Root Id : {rootId}");

            if (!isTeamDrive)
            {
                await ShareWithAccountsAsync(rootId, _config.ShareWithAccount);
            }

            return(rootId);
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            //refer to https://developers.google.com/drive/api/v3/quickstart/dotnet to get this json file
            string           credPath = @"c:\orbit-y-drive-service.json";
            GoogleCredential credential;

            using (var stream = new FileStream(credPath, FileMode.Open, FileAccess.Read))
            {
                credential = GoogleCredential.FromStream(stream).CreateScoped(Scopes);
            }

            DriveService service = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName       = ApplicationName,
            });

            string teamDrivePageToken = null;
            string teamDriveID        = null;

            do
            {
                TeamdrivesResource.ListRequest teamDriveList = service.Teamdrives.List();
                teamDriveList.Fields    = "nextPageToken, teamDrives(kind, id, name)";
                teamDriveList.PageToken = teamDrivePageToken;
                var result     = teamDriveList.Execute();
                var teamDrives = result.TeamDrives;

                if (teamDrives != null && teamDrives.Count > 0)
                {
                    foreach (TeamDrive drive in teamDrives)
                    {
                        if (drive.Name == TeamDriveName)
                        {
                            teamDriveID = drive.Id;
                            break;
                        }
                    }
                }
                teamDrivePageToken = result.NextPageToken;
            } while (teamDrivePageToken != null && teamDriveID == null);

            if (teamDriveID == null)
            {
                WriteLogEntry("Team drive not found", null);
                StopService();
                return;
            }

            string rootFolderPageToken = null;
            string rootFolderId        = "";

            do
            {
                FilesResource.ListRequest rootFolderRequest = service.Files.List();
                rootFolderRequest.Fields                = "nextPageToken, files(id, name, parents, mimeType)";
                rootFolderRequest.PageToken             = rootFolderPageToken;
                rootFolderRequest.SupportsTeamDrives    = true;
                rootFolderRequest.IncludeTeamDriveItems = true;
                rootFolderRequest.Corpora               = "teamDrive";
                rootFolderRequest.TeamDriveId           = teamDriveID;
                rootFolderRequest.Q = "parents='" + teamDriveID + "' and trashed=false and name='" + RootFolderName + "'";

                var result = rootFolderRequest.Execute();
                var files  = result.Files;
                if (files != null && files.Count == 1)
                {
                    var file = files[0];
                    if (file.MimeType == "application/vnd.google-apps.folder")
                    {
                        rootFolderId = file.Id;
                        break;
                    }
                }
                rootFolderPageToken = result.NextPageToken;
            } while (rootFolderPageToken != null && rootFolderId == null);

            if (rootFolderId == "")
            {
                WriteLogEntry("Error finding Root Folder. This can be caused by a duplicate folder, no folder, or execution error etc.", null);
                StopService();
                return;
            }

            string recordFolderPageToken = null;
            List <Google.Apis.Drive.v3.Data.File> recordFolders = new List <Google.Apis.Drive.v3.Data.File>();

            do
            {
                FilesResource.ListRequest recordFoldersRequest = service.Files.List();
                recordFoldersRequest.Fields                = "nextPageToken, files(id, name, parents, mimeType)";
                recordFoldersRequest.PageToken             = recordFolderPageToken;
                recordFoldersRequest.SupportsTeamDrives    = true;
                recordFoldersRequest.IncludeTeamDriveItems = true;
                recordFoldersRequest.Corpora               = "teamDrive";
                recordFoldersRequest.TeamDriveId           = teamDriveID;
                recordFoldersRequest.Q = "parents='" + rootFolderId + "' and trashed=false";

                var result = recordFoldersRequest.Execute();
                var files  = result.Files;

                if (files != null && files.Count > 0)
                {
                    foreach (Google.Apis.Drive.v3.Data.File file in files)
                    {
                        if (file.MimeType == "application/vnd.google-apps.folder")
                        {
                            recordFolders.Add(file);
                        }
                        else
                        {
                            //file found. shouldnt happen - delete
                            TrashDriveObject(service, file.Id);
                        }
                    }
                }
                recordFolderPageToken = result.NextPageToken;
            } while (recordFolderPageToken != null);

            if (recordFolders.Count != 0)
            {
                foreach (Google.Apis.Drive.v3.Data.File recordFolder in recordFolders)
                {
                    string addOnEmail = "";
                    if (isAddOnFinished(service, teamDriveID, recordFolder.Id, ref addOnEmail))
                    {
                        string recordNumber = recordFolder.Name;
                        if (isValidRecordNumber(recordNumber) == false && isValidSubawardNumber(recordNumber) == false)
                        {
                            SendErrorEmail(addOnEmail, "Record number " + recordNumber + " does not exist in ORBiT.");
                            TrashDriveObject(service, recordFolder.Id);
                            continue;
                        }

                        string EFilesFolder = GetEFilesFolder(recordNumber);
                        if (EFilesFolder == "")
                        {
                            SendErrorEmail(addOnEmail, "Could not find an EFiles folder. Record number is " + recordNumber);
                            TrashDriveObject(service, recordFolder.Id);
                            continue;
                        }

                        string        filePageToken = null;
                        List <string> lstSavedFiles = new List <string>();
                        do
                        {
                            FilesResource.ListRequest filesRequest = service.Files.List();
                            filesRequest.Fields                = "nextPageToken, files(id, name, parents, mimeType)";
                            filesRequest.PageToken             = filePageToken;
                            filesRequest.SupportsTeamDrives    = true;
                            filesRequest.IncludeTeamDriveItems = true;
                            filesRequest.Corpora               = "teamDrive";
                            filesRequest.TeamDriveId           = teamDriveID;
                            filesRequest.Q = "parents='" + recordFolder.Id + "' and trashed=false";

                            var  result   = filesRequest.Execute();
                            var  files    = result.Files;
                            bool stopFlag = false;

                            foreach (Google.Apis.Drive.v3.Data.File file in files)
                            {
                                var fileInfo = service.Files.Get(file.Id);
                                if (file.MimeType == "application/vnd.google-apps.folder")
                                {
                                    //folder found - shouldnt happen - trash folder
                                    TrashDriveObject(service, file.Id);
                                }
                                else
                                {
                                    if (file.Name == FlagFileName || file.Name == TempFileName)
                                    {
                                        continue;
                                    }
                                    else
                                    {
                                        using (MemoryStream ms = new MemoryStream())
                                        {
                                            fileInfo.Download(ms);
                                            string filenameToSave = getUniqueFilename(EFilesFolder, file.Name);
                                            try
                                            {
                                                using (FileStream fs = new FileStream(EFilesFolder + filenameToSave, FileMode.Create, System.IO.FileAccess.Write))
                                                {
                                                    try
                                                    {
                                                        fs.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
                                                    }
                                                    catch (Exception e)
                                                    {
                                                        string message = "Error saving file to Y Drive. Record Number: " + recordNumber + ", file name: " +
                                                                         file.Name;
                                                        WriteLogEntry(message, e);

                                                        if (lstSavedFiles.Count > 0)
                                                        {
                                                            message += "<br /><br />";
                                                            message += "The following files were saved successfully:<br /><ul>";
                                                            for (int i = 0; i < lstSavedFiles.Count; i++)
                                                            {
                                                                message += "<li>" + lstSavedFiles[i] + "</li>";
                                                            }
                                                            message += "</ul>";
                                                        }

                                                        SendErrorEmail(addOnEmail, message);

                                                        stopFlag = true;
                                                        ms.Close();
                                                        break;
                                                    }

                                                    lstSavedFiles.Add(filenameToSave);
                                                }
                                                ms.Close();
                                            }
                                            catch (Exception e)
                                            {
                                                WriteLogEntry("Error writing to filestream. File name is " + filenameToSave, e);

                                                string message = "Error saving file to Y Drive. Record Number: " + recordNumber + ", file name: " +
                                                                 file.Name;
                                                if (lstSavedFiles.Count > 0)
                                                {
                                                    message += "<br /><br />";
                                                    message += "The following files were saved successfully:<br /><ul>";
                                                    for (int i = 0; i < lstSavedFiles.Count; i++)
                                                    {
                                                        message += "<li>" + lstSavedFiles[i] + "</li>";
                                                    }
                                                    message += "</ul>";
                                                }

                                                SendErrorEmail(addOnEmail, message);

                                                stopFlag = true;
                                                break;
                                            }
                                        }
                                    }
                                }
                            }

                            if (stopFlag == true)
                            {
                                break;
                            }

                            filePageToken = result.NextPageToken;
                        } while (filePageToken != null);

                        TrashDriveObject(service, recordFolder.Id);
                    }
                }
            }
        }