public async Task <IEnumerable <ProjectDTO> > ListAsync() { var bucket = await _userResolver.GetBucketAsync(tryToCreate : true); var projectDTOs = new List <ProjectDTO>(); foreach (var projectName in await _projectService.GetProjectNamesAsync(bucket)) { // TODO: in future bad projects should not affect project listing. It's a workaround try { ProjectStorage projectStorage = await _userResolver.GetProjectStorageAsync(projectName); // TODO: expensive to do it in the loop // handle situation when project is not cached locally await projectStorage.EnsureAttributesAsync(bucket, ensureDir : true); projectDTOs.Add(_dtoGenerator.ToDTO(projectStorage)); } catch (Exception e) { // log, swallow and continue (see the comment above) _logger.LogWarning(e, $"Ignoring '{projectName}' project, which (seems) failed to adopt."); } } return(projectDTOs); }
public override async Task ProcessJobAsync(IResultSender resultSender) { using var scope = Logger.BeginScope("Project Adoption ({Id})"); Logger.LogInformation($"ProcessJob (Adopt) {Id} for project {_projectInfo.Name} started."); // Check for valid project and root names (where applicable) if ((!string.IsNullOrEmpty(_projectInfo.TopLevelAssembly) && Regex.Match(_projectInfo.TopLevelAssembly, @"[\uFFF0-\uFFFF]").Success) || Regex.Match(_projectInfo.Name, @"[\uFFF0-\uFFFF]").Success) { Logger.LogInformation($"Replacement charcters found in project name or top level assembly name for job {Id}."); throw new ProcessingException("Project name or assembly contains unsupported characters", new[] { "Please refer to https://github.com/Autodesk-Forge/forge-configurator-inventor/blob/master/README.md#project-file-zip-encoding" }); } // upload the file to OSS var bucket = await _userResolver.GetBucketAsync(tryToCreate : true); ProjectStorage projectStorage = await _userResolver.GetProjectStorageAsync(_projectInfo.Name); string ossSourceModel = projectStorage.Project.OSSSourceModel; await bucket.SmartUploadAsync(_fileName, ossSourceModel); // cleanup before adoption File.Delete(_fileName); // adopt the project bool adopted = false; FdaStatsDTO stats; string reportUrl = null; try { string signedUploadedUrl = await bucket.CreateSignedUrlAsync(ossSourceModel); (stats, reportUrl) = await ProjectWork.AdoptAsync(_projectInfo, signedUploadedUrl); adopted = true; } finally { // on any failure during adoption we consider that project adoption failed and it's not usable if (!adopted) { Logger.LogInformation($"Adoption failed. Removing '{ossSourceModel}' OSS object."); await bucket.DeleteObjectAsync(ossSourceModel); } } Logger.LogInformation($"ProcessJob (Adopt) {Id} for project {_projectInfo.Name} completed."); await resultSender.SendSuccessAsync(_dtoGenerator.ToDTO(projectStorage), stats, reportUrl); }
public override async Task ProcessJobAsync(IResultSender resultSender) { using var scope = Logger.BeginScope("Project Adoption ({Id})"); Logger.LogInformation($"ProcessJob (Adopt) {Id} for project {_projectInfo.Name} started."); // upload the file to OSS var bucket = await _userResolver.GetBucketAsync(tryToCreate : true); ProjectStorage projectStorage = await _userResolver.GetProjectStorageAsync(_projectInfo.Name); string ossSourceModel = projectStorage.Project.OSSSourceModel; await bucket.SmartUploadAsync(_fileName, ossSourceModel); // cleanup before adoption File.Delete(_fileName); // adopt the project bool adopted = false; FdaStatsDTO stats; try { string signedUploadedUrl = await bucket.CreateSignedUrlAsync(ossSourceModel); stats = await ProjectWork.AdoptAsync(_projectInfo, signedUploadedUrl); adopted = true; } catch (FdaProcessingException fpe) { await resultSender.SendErrorAsync(Id, fpe.ReportUrl); return; } finally { // on any failure during adoption we consider that project adoption failed and it's not usable if (!adopted) { Logger.LogInformation($"Adoption failed. Removing '{ossSourceModel}' OSS object."); await bucket.DeleteObjectAsync(ossSourceModel); } } Logger.LogInformation($"ProcessJob (Adopt) {Id} for project {_projectInfo.Name} completed."); await resultSender.SendSuccessAsync(_dtoGenerator.ToDTO(projectStorage), stats); }
/// <summary> /// https://jira.autodesk.com/browse/INVGEN-45256 /// </summary> /// <param name="payload">project configuration with parameters</param> /// <returns>project storage</returns> public async Task <ProjectDTO> AdoptProjectWithParametersAsync(AdoptProjectWithParametersPayload payload) { if (!await DoesProjectAlreadyExistAsync(payload.Name)) { var bucket = await _userResolver.GetBucketAsync(); var signedUrl = await TransferProjectToOssAsync(bucket, payload); await _projectWork.AdoptAsync(payload, signedUrl); } else { _logger.LogInformation($"project with name {payload.Name} already exists"); } var updateDto = (await _projectWork.DoSmartUpdateAsync(payload.Config, payload.Name)).dto; // use update hash for projectDto generation var projectDto = _dtoGenerator.ToDTO(await _userResolver.GetProjectStorageAsync(payload.Name), updateDto.Hash); return(projectDto); }