< Summary

Information
Class: Services.EmailRoutingServices.AppRuntimeSettingsPaths
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/EmailRoutingServices/AppRuntimeSettingsWriter.cs
Line coverage
62%
Covered lines: 5
Uncovered lines: 3
Coverable lines: 8
Total lines: 56
Line coverage: 62.5%
Branch coverage
50%
Covered branches: 3
Total branches: 6
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ResolvePath(...)50%8662.5%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/EmailRoutingServices/AppRuntimeSettingsWriter.cs

#LineLine coverage
 1using Microsoft.Extensions.Configuration;
 2using Newtonsoft.Json;
 3using Newtonsoft.Json.Linq;
 4
 5namespace Services.EmailRoutingServices;
 6
 7/// <summary>
 8/// Путь к overlay-файлу настроек (writable в Docker). Основной appsettings.json в образе read-only.
 9/// </summary>
 10public static class AppRuntimeSettingsPaths
 11{
 12    public const string DefaultRelativePath = "data/appsettings.runtime.json";
 13    public const string ConfigKey = "RuntimeSettings:FilePath";
 14    public const string EnvVar = "ST2_RUNTIME_SETTINGS_PATH";
 15
 16    public static string ResolvePath(string contentRootPath, IConfiguration configuration)
 17    {
 418        var configured = configuration[ConfigKey];
 419        if (string.IsNullOrWhiteSpace(configured))
 420            configured = Environment.GetEnvironmentVariable(EnvVar);
 21
 422        if (!string.IsNullOrWhiteSpace(configured))
 23        {
 024            return Path.IsPathRooted(configured)
 025                ? configured
 026                : Path.Combine(contentRootPath, configured);
 27        }
 28
 429        return Path.Combine(contentRootPath, DefaultRelativePath);
 30    }
 31}
 32
 33public static class AppRuntimeSettingsWriter
 34{
 35    public static async Task SaveAsync(
 36        string contentRootPath,
 37        IConfiguration configuration,
 38        Action<JObject> mutate,
 39        CancellationToken cancellationToken = default)
 40    {
 41        var path = AppRuntimeSettingsPaths.ResolvePath(contentRootPath, configuration);
 42        var directory = Path.GetDirectoryName(path);
 43        if (!string.IsNullOrEmpty(directory))
 44            Directory.CreateDirectory(directory);
 45
 46        JObject root;
 47        if (File.Exists(path))
 48            root = JObject.Parse(await File.ReadAllTextAsync(path, cancellationToken));
 49        else
 50            root = new JObject();
 51
 52        mutate(root);
 53
 54        await File.WriteAllTextAsync(path, root.ToString(Formatting.Indented), cancellationToken);
 55    }
 56}