コード例 #1
0
        public async Task <OssBucket> GetBucketAsync(bool tryToCreate = false)
        {
            if (!IsAuthenticated)
            {
                return(AnonymousBucket);
            }

            dynamic profile = await GetProfileAsync();

            var userId = profile.userId;

            // an OSS bucket must have a unique name, so it should be generated in a way,
            // so it a Forge user gets registered into several deployments it will not cause
            // name collisions. So use client ID (as a salt) to generate bucket name.
            var userHash  = Crypto.GenerateHashString(_forgeConfig.ClientId + userId);
            var bucketKey = $"{GetBucketPrefix()}-{userId.Substring(0, 3)}-{userHash}".ToLowerInvariant();

            var bucket = new OssBucket(_forgeOSS, bucketKey, _logger);

            if (tryToCreate)
            {
                // TODO: VERY INEFFECTIVE!!!!!
                try
                {
                    await bucket.CreateAsync();
                }
                catch (ApiException e) when(e.ErrorCode == StatusCodes.Status409Conflict)
                {
                    // means - the bucket already exists
                }
            }

            return(bucket);
        }
コード例 #2
0
        public async Task EnsureSvfAsync(OssBucket ossBucket, string hash)
        {
            var localNames = GetLocalNames(hash);
            var ossNames   = GetOssNames(hash);

            using var tempFile = new TempFile();
            await ossBucket.DownloadFileAsync(ossNames.ModelView, tempFile.Name);

            // extract SVF from the archive
            ZipFile.ExtractToDirectory(tempFile.Name, localNames.SvfDir, overwriteFiles: true); // TODO: non-default encoding is not supported
        }
コード例 #3
0
        public UserResolver(ResourceProvider resourceProvider, IForgeOSS forgeOSS, IBucketKeyProvider bucketKeyProvider,
                            LocalCache localCache, ILogger <UserResolver> logger, ProfileProvider profileProvider)
        {
            _forgeOSS          = forgeOSS;
            _localCache        = localCache;
            _logger            = logger;
            _bucketKeyProvider = bucketKeyProvider;
            _profileProvider   = profileProvider;

            AnonymousBucket = new OssBucket(_forgeOSS, _bucketKeyProvider.AnonymousBucketKey, logger);
        }
コード例 #4
0
        public UserResolver(ResourceProvider resourceProvider, IForgeOSS forgeOSS,
                            IOptions <ForgeConfiguration> forgeConfiguration, LocalCache localCache, ILogger <UserResolver> logger, IConfiguration configuration)
        {
            _forgeOSS      = forgeOSS;
            _localCache    = localCache;
            _logger        = logger;
            _configuration = configuration;
            _forgeConfig   = forgeConfiguration.Value;

            AnonymousBucket = new OssBucket(_forgeOSS, resourceProvider.BucketKey, logger);

            _lazyProfile = new Lazy <Task <dynamic> >(async() => await _forgeOSS.GetProfileAsync(Token));
        }
コード例 #5
0
        /// <summary>
        /// Ensure that project attributes are cached locally.
        /// </summary>
        public async Task EnsureAttributesAsync(OssBucket ossBucket, bool ensureDir = true)
        {
            // ensure the directory exists
            if (ensureDir)
            {
                Directory.CreateDirectory(Project.LocalAttributes.BaseDir);
            }

            // download metadata and thumbnail
            await Task.WhenAll(
                ossBucket.EnsureFileAsync(Project.OssAttributes.Metadata, Project.LocalAttributes.Metadata),
                ossBucket.EnsureFileAsync(Project.OssAttributes.Thumbnail, Project.LocalAttributes.Thumbnail)
                );
        }
コード例 #6
0
        /// <summary>
        /// Ensure the project is cached locally.
        /// </summary>
        public async Task EnsureLocalAsync(OssBucket ossBucket)
        {
            // make sure that there are no leftovers from previous incarnations of the project
            DeleteLocal();

            await EnsureAttributesAsync(ossBucket, ensureDir : true);


            // download ZIP with SVF model
            // NOTE: this step is impossible without having project metadata,
            // because file/dir names depends on hash of initial project state

            await EnsureViewablesAsync(ossBucket, Metadata.Hash, ensureDir : true);
        }
コード例 #7
0
        /// <summary>
        /// Ensure that project attributes are cached locally.
        /// </summary>
        public async Task EnsureAttributesAsync(OssBucket ossBucket, bool ensureDir = true)
        {
            // ensure the directory exists
            var localAttributes = Project.LocalAttributes;

            if (ensureDir)
            {
                Directory.CreateDirectory(localAttributes.BaseDir);
            }

            // download metadata and thumbnail
            var ossAttributes = Project.OssAttributes;
            await Task.WhenAll(
                ossBucket.EnsureFileAsync(ossAttributes.Metadata, localAttributes.Metadata),
                ossBucket.EnsureFileAsync(ossAttributes.Thumbnail, localAttributes.Thumbnail),
                ossBucket.EnsureFileAsync(ossAttributes.DrawingsList, localAttributes.DrawingsList)
                );
        }
コード例 #8
0
        public async Task <OssBucket> GetBucketAsync(bool tryToCreate = false)
        {
            var bucket = new OssBucket(_forgeOSS, await _bucketKeyProvider.GetBucketKeyAsync(), _logger);

            if (tryToCreate)
            {
                // TODO: VERY INEFFECTIVE!!!!!
                try
                {
                    await bucket.CreateAsync();
                }
                catch (ApiException e) when(e.ErrorCode == StatusCodes.Status409Conflict)
                {
                    // means - the bucket already exists
                }
            }

            return(bucket);
        }
コード例 #9
0
        /// <summary>
        /// Ensure the project viewables are cached locally.
        /// </summary>
        /// <param name="ossBucket">OSS bucket.</param>
        /// <param name="hash">Parameters hash.</param>
        /// <param name="ensureDir">Create local dir if necessary.</param>
        public async Task EnsureViewablesAsync(OssBucket ossBucket, string hash, bool ensureDir = true)
        {
            var localNames = GetLocalNames(hash);

            // create the "hashed" dir
            if (ensureDir)
            {
                Directory.CreateDirectory(localNames.BaseDir);
            }

            OSSObjectNameProvider ossNames = GetOssNames(hash);

            using var tempFile = new TempFile();
            await Task.WhenAll(
                ossBucket.DownloadFileAsync(ossNames.ModelView, tempFile.Name),
                ossBucket.DownloadFileAsync(ossNames.Parameters, localNames.Parameters),
                ossBucket.DownloadFileAsync(ossNames.Bom, localNames.BOM)
                );

            // extract SVF from the archive
            ZipFile.ExtractToDirectory(tempFile.Name, localNames.SvfDir, overwriteFiles: true); // TODO: non-default encoding is not supported
        }