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); }
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); } } } }