Пример #1
0
 public Task <IEnumerable <string> > AddBuildTag(
     int buildId,
     Guid projectId,
     string buildTag,
     CancellationToken cancellationToken = default(CancellationToken))
 {
     BuildTags.Add(buildTag);
     return(Task.FromResult <IEnumerable <string> >(BuildTags));
 }
Пример #2
0
 public DevDataSeeder(
     ILogger <DevDataSeeder> logger,
     IOptions <AppConfig> appConfig,
     AppDbContext dbContext,
     HttpClient httpClient,
     BuildService buildService,
     BlueprintConverter blueprintConverter,
     ImageService imageService,
     BuildTags buildTags)
 {
     _logger             = logger;
     _appConfig          = appConfig.Value;
     _dbContext          = dbContext;
     _httpClient         = httpClient;
     _buildService       = buildService;
     _blueprintConverter = blueprintConverter;
     _imageService       = imageService;
     _buildTags          = buildTags;
 }
        public void ConfigureServices(IServiceCollection services)
        {
            var appConfig = _configuration.GetSection(nameof(AppConfig)).Get <AppConfig>() ?? new AppConfig();

            services.AddSingleton(Options.Create(appConfig));

            // todo: quick fix for ImageSharp.Web bug
            _environment.WebRootPath = appConfig.DataDir;

            services.AddProblemDetails();
            services.AddHttpClient();
            services.AddControllers().AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
                options.JsonSerializerOptions.Converters.Add(new PolymorphicJsonConverter <PayloadModelBase>());
                options.JsonSerializerOptions.Converters.Add(new CustomJsonStringEnumConverter(new SnakeCaseNamingPolicy()));
                options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(new SnakeCaseNamingPolicy()));
                options.JsonSerializerOptions.Converters.Add(new VersionJsonConverter());
                options.JsonSerializerOptions.Converters.Add(new HashJsonConverter());
                options.JsonSerializerOptions.IgnoreNullValues     = true;
                options.JsonSerializerOptions.PropertyNamingPolicy = new SnakeCaseNamingPolicy();
            });

            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "factorio.tech", Version = "v1"
                });

                options.AddSecurityDefinition(SecuritySchemeType.OAuth2.ToString(), new OpenApiSecurityScheme
                {
                    Type  = SecuritySchemeType.OAuth2,
                    Flows = new OpenApiOAuthFlows
                    {
                        AuthorizationCode = new OpenApiOAuthFlow
                        {
                            AuthorizationUrl = new Uri(appConfig.IdentityUri.AbsoluteUri + "connect/authorize"),
                            TokenUrl         = new Uri(appConfig.IdentityUri.AbsoluteUri + "connect/token"),
                            Scopes           = new Dictionary <string, string>
                            {
                                { "openid", "Informs the authorization server that the client is making an OpenID Connect request." },
                                { "profile", "Requests access to the user's profile information." },
                            },
                        },
                    },
                });

                options.EnableAnnotations(true, true);
                options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"));
                options.MapType(typeof(Instant), () => new OpenApiSchema {
                    Type = "string"
                });
                options.MapType(typeof(Hash), () => new OpenApiSchema {
                    Type = "string"
                });
                options.MapType(typeof(Version), () => new OpenApiSchema {
                    Type = "string"
                });
                options.MapType(typeof(AssetService.IconSize), () => new OpenApiSchema {
                    Type = "integer"
                });
                options.OperationFilter <OAuthResponsesOperationFilter>();
                options.UseAllOfToExtendReferenceSchemas();
                options.UseInlineDefinitionsForEnums();
            });

            services.AddCors(options =>
            {
                options.AddPolicy("factorio-blueprint-editor", builder =>
                                  builder.WithOrigins($"{appConfig.BlueprintEditorUri.Scheme}://{appConfig.BlueprintEditorUri.Authority}")
                                  .AllowAnyHeader()
                                  .AllowAnyMethod());

                options.AddDefaultPolicy(builder =>
                                         builder.AllowAnyHeader()
                                         .AllowAnyMethod()
                                         .AllowCredentials()
                                         .Let(b => _environment.IsProduction()
                            ? b.WithOrigins($"{appConfig.WebUri.Scheme}://{appConfig.WebUri.Authority}")
                            : b.WithOrigins($"{appConfig.WebUri.Scheme}://{appConfig.WebUri.Authority}",
                                            "https://local.factorio.tech", "http://localhost:3000")));
            });

            services.AddDbContext <AppDbContext>(options =>
            {
                options.UseNpgsql(_configuration.GetConnectionString("Postgres"), o => o.UseNodaTime());
            });

            services.AddAuthentication("Bearer").AddJwtBearer("Bearer", options =>
            {
                options.Authority = $"{appConfig.IdentityUri.Scheme}://{appConfig.IdentityUri.Authority}";

                if (!_environment.IsProduction() &&
                    (appConfig.IdentityUri.IsLoopback ||
                     appConfig.IdentityUri.Host.EndsWith("local.factorio.tech")))
                {
                    options.BackchannelHttpHandler = new HttpClientHandler
                    {
                        ClientCertificateOptions = ClientCertificateOption.Manual,
                        ServerCertificateCustomValidationCallback = (_, _, _, _) => true,
                    };
                }

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateAudience = false,
                };
            });

            services.AddAuthorization();

            services.AddApplicationInsightsTelemetry(options =>
            {
                options.ApplicationVersion = BuildInformation.Version;
            });

            services.AddSingleton <ITelemetryInitializer, CloudRoleInitializer>();
            services.AddSingleton <ITelemetryInitializer, UserInitializer>();

            if (!_environment.IsProduction())
            {
                services.AddTransient <DevDataSeeder>();
            }

            if (!_environment.IsDevelopment())
            {
                services.AddDataProtection()
                .PersistKeysToFileSystem(new DirectoryInfo(Path.Join(appConfig.ProtectedDataDir, "dataprotection")))
                .ProtectKeysWithCertificate(new X509Certificate2("/mnt/keys/certificate.pfx"));
            }

            services.AddImageSharp()
            .AddProvider <CoverProvider>()
            .AddProvider <RenderingProvider>()
            .RemoveProvider <PhysicalFileSystemProvider>()
            .Configure <PhysicalFileSystemCacheOptions>(options =>
            {
                options.CacheRoot   = appConfig.DataDir;
                options.CacheFolder = "image-cache";
            });

            services.AddTransient <FbsrClient>();
            services.AddTransient <BlueprintConverter>();
            services.AddTransient <BuildService>();
            services.AddTransient <FollowerService>();
            services.AddTransient <ImageService>();
            services.AddTransient <AssetService>();
            services.AddTransient <SlugService>();

            services.AddSingleton(BuildTags.Load());
            services.AddSingleton <IFileProvider>(new PhysicalFileProvider(appConfig.DataDir));
        }