// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschränkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using FluentFTP; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using MongoDB.Driver; using MongoDB.Driver.GridFS; using Squidex.Assets; using Squidex.Assets.ImageSharp; using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Assets.DomainObject; using Squidex.Domain.Apps.Entities.Assets.Queries; using Squidex.Domain.Apps.Entities.History; using Squidex.Domain.Apps.Entities.Search; using Squidex.Hosting; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; namespace Squidex.Config.Domain { public static class AssetServices { public static void AddSquidexAssets(this IServiceCollection services, IConfiguration config) { services.Configure(config, "assets"); if (config.GetValue("assets:deleteRecursive")) { services.AddTransientAs() .As(); } if (config.GetValue("assets:deletePermanent")) { services.AddTransientAs() .As(); } services.AddTransientAs() .AsSelf(); services.AddTransientAs() .AsSelf(); services.AddSingletonAs() .AsSelf(); services.AddSingletonAs() .AsSelf(); services.AddTransientAs() .As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As().As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As(); } public static void AddSquidexAssetInfrastructure(this IServiceCollection services, IConfiguration config) { config.ConfigureByOption("assetStore:type", new Alternatives { ["Default"] = () => { services.AddSingletonAs() .AsOptional(); }, ["Folder"] = () => { var path = config.GetRequiredValue("assetStore:folder:path"); services.AddSingletonAs(c => new FolderAssetStore(path, c.GetRequiredService>())) .As(); }, ["GoogleCloud"] = () => { var bucketName = config.GetRequiredValue("assetStore:googleCloud:bucket"); services.AddSingletonAs(c => new GoogleCloudAssetStore(bucketName)) .As(); }, ["AzureBlob"] = () => { var connectionString = config.GetRequiredValue("assetStore:azureBlob:connectionString"); var containerName = config.GetRequiredValue("assetStore:azureBlob:containerName"); services.AddSingletonAs(c => new AzureBlobAssetStore(connectionString, containerName)) .As(); }, ["AmazonS3"] = () => { var amazonS3Options = config.GetSection("assetStore:amazonS3").Get(); services.AddSingletonAs(c => new AmazonS3AssetStore(amazonS3Options)) .As(); }, ["MongoDb"] = () => { var mongoConfiguration = config.GetRequiredValue("assetStore:mongoDb:configuration"); var mongoDatabaseName = config.GetRequiredValue("assetStore:mongoDb:database"); var mongoGridFsBucketName = config.GetRequiredValue("assetStore:mongoDb:bucket"); services.AddSingletonAs(c => { var mongoClient = Singletons.GetOrAdd(mongoConfiguration, s => new MongoClient(s)); var mongoDatabase = mongoClient.GetDatabase(mongoDatabaseName); var gridFsbucket = new GridFSBucket(mongoDatabase, new GridFSBucketOptions { BucketName = mongoGridFsBucketName }); return new MongoGridFsAssetStore(gridFsbucket); }) .As(); }, ["Ftp"] = () => { var serverHost = config.GetRequiredValue("assetStore:ftp:serverHost"); var serverPort = config.GetOptionalValue("assetStore:ftp:serverPort", 21); var username = config.GetRequiredValue("assetStore:ftp:username"); var password = config.GetRequiredValue("assetStore:ftp:password"); var path = config.GetOptionalValue("assetStore:ftp:path", "/"); services.AddSingletonAs(c => { var factory = new Func(() => new FtpClient(serverHost, serverPort, username, password)); return new FTPAssetStore(factory, path, c.GetRequiredService>()); }) .As(); } }); services.AddSingletonAs() .As(); services.AddSingletonAs(c => new DelegateInitializer( c.GetRequiredService().GetType().Name, c.GetRequiredService().InitializeAsync)) .As(); } } }