< Summary

Information
Class: Services.EmailRoutingServices.FileImapSettingsStore
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/EmailRoutingServices/ImapSettingsStore.cs
Line coverage
100%
Covered lines: 40
Uncovered lines: 0
Coverable lines: 40
Total lines: 85
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetCurrent()100%11100%
MergeWithCurrent(...)100%44100%
SaveAsync()100%11100%

File(s)

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

#LineLine coverage
 1using Microsoft.Extensions.Configuration;
 2using Microsoft.Extensions.Hosting;
 3using Microsoft.Extensions.Logging;
 4using Microsoft.Extensions.Options;
 5using Newtonsoft.Json;
 6using Newtonsoft.Json.Linq;
 7
 8namespace Services.EmailRoutingServices;
 9
 10public interface IImapSettingsStore
 11{
 12    ImapSettings GetCurrent();
 13    ImapSettings MergeWithCurrent(EmailImapSettingsInput input);
 14    Task SaveAsync(EmailImapSettingsInput input, CancellationToken cancellationToken = default);
 15}
 16
 17public class EmailImapSettingsInput
 18{
 19    public string Host { get; set; } = string.Empty;
 20    public int Port { get; set; } = 993;
 21    public string UserName { get; set; } = string.Empty;
 22    public string? Password { get; set; }
 23    public bool UseSsl { get; set; } = true;
 24    public string Folder { get; set; } = "INBOX";
 25    public int FetchLimit { get; set; } = 20;
 26}
 27
 28public class FileImapSettingsStore : IImapSettingsStore
 29{
 30    private readonly IHostEnvironment _environment;
 31    private readonly IConfiguration _configuration;
 32    private readonly IOptionsMonitor<ImapSettings> _settingsMonitor;
 33    private readonly ILogger<FileImapSettingsStore> _logger;
 34
 535    public FileImapSettingsStore(
 536        IHostEnvironment environment,
 537        IConfiguration configuration,
 538        IOptionsMonitor<ImapSettings> settingsMonitor,
 539        ILogger<FileImapSettingsStore> logger)
 40    {
 541        _environment = environment;
 542        _configuration = configuration;
 543        _settingsMonitor = settingsMonitor;
 544        _logger = logger;
 545    }
 46
 547    public ImapSettings GetCurrent() => _settingsMonitor.CurrentValue;
 48
 49    public ImapSettings MergeWithCurrent(EmailImapSettingsInput input)
 50    {
 551        var current = GetCurrent();
 552        return new ImapSettings
 553        {
 554            Host = input.Host.Trim(),
 555            Port = input.Port,
 556            UserName = input.UserName.Trim(),
 557            Password = string.IsNullOrWhiteSpace(input.Password) ? current.Password : input.Password,
 558            UseSsl = input.UseSsl,
 559            Folder = string.IsNullOrWhiteSpace(input.Folder) ? "INBOX" : input.Folder.Trim(),
 560            FetchLimit = input.FetchLimit,
 561            FetchScanLimit = current.FetchScanLimit,
 562            FetchWindowDays = current.FetchWindowDays,
 563            FetchAfterUtc = current.FetchAfterUtc
 564        };
 65    }
 66
 67    public async Task SaveAsync(EmailImapSettingsInput input, CancellationToken cancellationToken = default)
 68    {
 269        var merged = MergeWithCurrent(input);
 270        var configPath = AppRuntimeSettingsPaths.ResolvePath(_environment.ContentRootPath, _configuration);
 271        await AppRuntimeSettingsWriter.SaveAsync(
 272            _environment.ContentRootPath,
 273            _configuration,
 274            root =>
 275            {
 276                root["ImapSettings"] = JObject.FromObject(merged, JsonSerializer.Create(new JsonSerializerSettings
 277                {
 278                    NullValueHandling = NullValueHandling.Ignore
 279                }));
 280            },
 281            cancellationToken);
 82
 283        _logger.LogInformation("ImapSettings saved to {ConfigPath} for mailbox {UserName}", configPath, merged.UserName)
 284    }
 85}