Skip to content

Commit

Permalink
Re-implement StackerSettings via IConfiguration and inject the value (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
HowardvanRooijen authored Nov 2, 2023
1 parent 037385b commit 4a89b15
Show file tree
Hide file tree
Showing 7 changed files with 159 additions and 47 deletions.
11 changes: 4 additions & 7 deletions Solutions/Stacker.Cli/BufferClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,10 @@
using System.Net.Http.Headers;
using System.Text.Json;
using System.Threading.Tasks;

using Spectre.Console;

using Stacker.Cli.Configuration;
using Stacker.Cli.Contracts.Buffer;
using Stacker.Cli.Contracts.Configuration;

namespace Stacker.Cli;

Expand All @@ -23,13 +21,13 @@ public class BufferClient : IBufferClient
private const string BaseUri = "https://api.bufferapp.com/1/";
private const string UpdateOperation = "updates/create.json";

private readonly IStackerSettingsManager settingsManager;
private readonly IHttpClientFactory httpClientFactory;
private readonly StackerSettings settings;

public BufferClient(IStackerSettingsManager settingsManager, IHttpClientFactory httpClientFactory)
public BufferClient(IHttpClientFactory httpClientFactory, StackerSettings settings)
{
this.settingsManager = settingsManager;
this.httpClientFactory = httpClientFactory;
this.settings = settings;
}

public IEnumerable<KeyValuePair<string, string>> ConvertToPayload(string content, string[] profileIds)
Expand All @@ -52,8 +50,7 @@ public async Task UploadAsync(IEnumerable<string> content, string profileId, boo
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));

StackerSettings settings = this.settingsManager.LoadSettings(nameof(StackerSettings));
string updateOperationUrl = $"{UpdateOperation}?access_token={settings.BufferAccessToken}";
string updateOperationUrl = $"{UpdateOperation}?access_token={this.settings.BufferAccessToken}";

foreach (string item in content)
{
Expand Down
17 changes: 6 additions & 11 deletions Solutions/Stacker.Cli/Commands/WordPressExportMarkdownCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;

using Spectre.Console;
using Spectre.Console.Cli;
using Spectre.IO;
Expand All @@ -37,25 +36,22 @@ namespace Stacker.Cli.Commands;
public class WordPressExportMarkdownCommand : AsyncCommand<WordPressExportMarkdownCommand.Settings>
{
private readonly IDownloadTasks downloadTasks;
private readonly IStackerSettingsManager settingsManager;
private readonly ContentItemCleaner cleanerManager;
private readonly IYamlSerializerFactory serializerFactory;
private ISerializer serializer;
private StackerSettings stackerSettings;
private StackerSettings settings;

public WordPressExportMarkdownCommand(IDownloadTasks downloadTasks, IStackerSettingsManager settingsManager, ContentItemCleaner cleanerManager, IYamlSerializerFactory serializerFactory)
public WordPressExportMarkdownCommand(IDownloadTasks downloadTasks, StackerSettings settings, ContentItemCleaner cleanerManager, IYamlSerializerFactory serializerFactory)
{
this.downloadTasks = downloadTasks;
this.settingsManager = settingsManager;
this.settings = settings;
this.cleanerManager = cleanerManager;
this.serializerFactory = serializerFactory;
}

/// <inheritdoc/>
public override async Task<int> ExecuteAsync([NotNull] CommandContext context, [NotNull] Settings settings)
{
this.stackerSettings = this.settingsManager.LoadSettings(nameof(StackerSettings));

if (!File.Exists(settings.WordPressExportFilePath.FullPath))
{
AnsiConsole.WriteLine($"File not found {settings.WordPressExportFilePath.FullPath}");
Expand Down Expand Up @@ -179,15 +175,14 @@ private List<ContentItem> LoadFeed(BlogSite blogSite)
AnsiConsole.WriteLine("Processing...");

List<ContentItem> feed = new();
StackerSettings settings = this.settingsManager.LoadSettings(nameof(StackerSettings));
List<Post> posts = blogSite.GetAllPostsInAllPublicationStates().ToList();

AnsiConsole.WriteLine($"Total Posts: {posts.Count}");

// var attachments = posts.Where(x => x.Attachments.Any());
foreach (Post post in posts)
{
User user = settings.Users.Find(u => string.Equals(u.Email, post.Author.Email, StringComparison.InvariantCultureIgnoreCase));
User user = this.settings.Users.Find(u => string.Equals(u.Email, post.Author.Email, StringComparison.InvariantCultureIgnoreCase));

if (user is null)
{
Expand Down Expand Up @@ -288,7 +283,7 @@ private bool ExecutePandoc(string inputTempHtmlFilePath, string outputTempMarkdo

private bool IsCategoryExcluded(string category)
{
return this.stackerSettings.WordPressToMarkdown.TagsToRemove.Contains(category);
return this.settings.WordPressToMarkdown.TagsToRemove.Contains(category);
}

private string GetHeaderImage(List<string> attachments)
Expand All @@ -305,7 +300,7 @@ private string GetHeaderImage(List<string> attachments)

private bool IsRelevantHost(string url)
{
return this.stackerSettings.WordPressToMarkdown.Hosts.Any(x => url.Contains(x, StringComparison.InvariantCultureIgnoreCase));
return this.settings.WordPressToMarkdown.Hosts.Any(x => url.Contains(x, StringComparison.InvariantCultureIgnoreCase));
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,11 @@
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;

using Spectre.Console;
using Spectre.Console.Cli;
using Spectre.IO;

using Stacker.Cli.Configuration;
using Stacker.Cli.Contracts.Configuration;
using Stacker.Cli.Converters;
using Stacker.Cli.Domain.Universal;
using Stacker.Cli.Domain.WordPress;
Expand All @@ -27,11 +25,11 @@ namespace Stacker.Cli.Commands;

public class WordPressExportUniversalCommand : AsyncCommand<WordPressExportUniversalCommand.Settings>
{
private readonly IStackerSettingsManager settingsManager;
private readonly StackerSettings settings;

public WordPressExportUniversalCommand(IStackerSettingsManager settingsManager)
public WordPressExportUniversalCommand(StackerSettings settings)
{
this.settingsManager = settingsManager;
this.settings = settings;
}

/// <inheritdoc/>
Expand All @@ -56,9 +54,8 @@ public override async Task<int> ExecuteAsync([NotNull] CommandContext context, [

AnsiConsole.WriteLine($"Processing...");

StackerSettings stackerSettings = this.settingsManager.LoadSettings(nameof(StackerSettings));
List<Post> posts = blogSite.GetAllPosts().ToList();
List<Post> validPosts = posts.FilterByValid(stackerSettings).ToList();
List<Post> validPosts = posts.FilterByValid(this.settings).ToList();
List<Post> promotablePosts = validPosts.FilterByPromotable().ToList();
TagToHashTagConverter hashTagConverter = new();
List<ContentItem> feed = new();
Expand All @@ -69,7 +66,7 @@ public override async Task<int> ExecuteAsync([NotNull] CommandContext context, [

foreach (Post post in promotablePosts)
{
User user = stackerSettings.Users.Find(u => string.Equals(u.Email, post.Author.Email, StringComparison.InvariantCultureIgnoreCase));
User user = this.settings.Users.Find(u => string.Equals(u.Email, post.Author.Email, StringComparison.InvariantCultureIgnoreCase));

feed.Add(new ContentItem
{
Expand Down
25 changes: 25 additions & 0 deletions Solutions/Stacker.Cli/Extensions/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,47 @@
// Copyright (c) Endjin Limited. All rights reserved.
// </copyright>

using System;
using System.IO;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

using Spectre.IO;

using Stacker.Cli.Cleaners;
using Stacker.Cli.Configuration;
using Stacker.Cli.Contracts.Buffer;
using Stacker.Cli.Contracts.Configuration;
using Stacker.Cli.Contracts.Tasks;
using Stacker.Cli.Serialization;
using Stacker.Cli.Tasks;
using Environment = System.Environment;
using Path = System.IO.Path;

namespace Stacker.Cli.Extensions;

public static class ServiceCollectionExtensions
{
public static void ConfigureDependencies(this ServiceCollection serviceCollection)
{
IConfigurationBuilder builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "endjin", "stacker", "configuration"))
.AddJsonFile("StackerSettings.json", optional: true, reloadOnChange: false);

if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("STACKER_SETTINGS_PATH")))
{
builder.AddJsonFile(Environment.GetEnvironmentVariable("STACKER_SETTINGS_PATH"), optional: false);
}

builder.AddEnvironmentVariables();

IConfigurationRoot configurationRoot = builder.Build();

StackerSettings options = new();
configurationRoot.Bind(options);

serviceCollection.AddSingleton(options);

serviceCollection.AddTransient<IAppEnvironment, FileSystemLocalProfileAppEnvironment>();
serviceCollection.AddTransient<IStackerSettingsManager, StackerSettingsManager>();

Expand Down
3 changes: 3 additions & 0 deletions Solutions/Stacker.Cli/Stacker.Cli.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@
<ItemGroup>
<PackageReference Include="Corvus.Retry" Version="1.0.7" />
<PackageReference Include="Flurl" Version="3.0.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.4" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
<PackageReference Include="NodaTime" Version="3.1.9" />
Expand Down
18 changes: 6 additions & 12 deletions Solutions/Stacker.Cli/Tasks/ContentTasks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;

using NodaTime;

using Spectre.Console;
using Spectre.IO;

using Stacker.Cli.Configuration;
using Stacker.Cli.Contracts.Buffer;
using Stacker.Cli.Contracts.Configuration;
using Stacker.Cli.Contracts.Formatters;
using Stacker.Cli.Contracts.Tasks;
using Stacker.Cli.Converters;
Expand All @@ -28,12 +26,12 @@ namespace Stacker.Cli.Tasks;
public class ContentTasks : IContentTasks
{
private readonly IBufferClient bufferClient;
private readonly IStackerSettingsManager settingsManager;
private readonly StackerSettings settings;

public ContentTasks(IBufferClient bufferClient, IStackerSettingsManager settingsManager)
public ContentTasks(IBufferClient bufferClient, StackerSettings settings)
{
this.bufferClient = bufferClient;
this.settingsManager = settingsManager;
this.settings = settings;
}

public async Task BufferContentItemsAsync<TContentFormatter>(
Expand All @@ -52,15 +50,13 @@ public async Task BufferContentItemsAsync<TContentFormatter>(

string profileKey = profilePrefix + profileName;

StackerSettings settings = this.settingsManager.LoadSettings(nameof(StackerSettings));

if (settings.BufferProfiles.TryGetValue(profileKey, out string profile))
if (this.settings.BufferProfiles.TryGetValue(profileKey, out string profile))
{
AnsiConsole.MarkupLineInterpolated($"[yellow1]Buffer Profile:[/] {profileKey} = {profile}");
AnsiConsole.MarkupLineInterpolated($"[yellow1]Loading:[/] {contentFilePath}");

IEnumerable<ContentItem> contentItems = await this.LoadContentItemsAsync(contentFilePath, publicationPeriod, fromDate, toDate, itemCount, filterByTag).ConfigureAwait(false);
IEnumerable<string> formattedContentItems = formatter.Format("social", profileName, contentItems, settings);
IEnumerable<string> formattedContentItems = formatter.Format("social", profileName, contentItems, this.settings);

await this.bufferClient.UploadAsync(formattedContentItems, profile, whatIf).ConfigureAwait(false);
}
Expand Down Expand Up @@ -115,14 +111,12 @@ public async Task<IEnumerable<ContentItem>> LoadContentItemsAsync(
}
}

StackerSettings settings = this.settingsManager.LoadSettings(nameof(StackerSettings));

foreach (ContentItem contentItem in content)
{
// Use TagAliases to convert tags into their canonical form.
contentItem.Tags = contentItem.Tags?.Select(tag =>
{
TagAliases matchedAlias = settings.TagAliases.FirstOrDefault(alias => alias.Aliases.Any(a => a == tag));
TagAliases matchedAlias = this.settings.TagAliases.FirstOrDefault(alias => alias.Aliases.Any(a => a == tag));
return matchedAlias != null ? matchedAlias.Tag : tag.Replace("-", " ").Replace(" ", string.Empty);
}).ToList();
}
Expand Down
Loading

0 comments on commit 4a89b15

Please sign in to comment.