Skip to content

Commit

Permalink
refactor: Use Newtonsoft.Json instead of System.Text.Json
Browse files Browse the repository at this point in the history
fix: Better re-use the HTTPClient
feat: Use Settings.settings for API keys
  • Loading branch information
Samir Boulema committed Aug 4, 2023
1 parent 0cfe44c commit d7837b2
Show file tree
Hide file tree
Showing 10 changed files with 109 additions and 56 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@
bin
obj
*.user
/src/MjmlVisualizer/Properties/Settings.Debug.settings
/src/MjmlVisualizer/Properties/Settings.settings
1 change: 1 addition & 0 deletions exclusion.dic
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
Mjml
Vsix
Newtonsoft
13 changes: 9 additions & 4 deletions src/MjmlVisualizer.Vsix/MjmlVisualizerPackage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
Expand All @@ -23,6 +24,8 @@ public MjmlVisualizerPackage()

protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
var fileNames = new List<string> { "MjmlVisualizer.dll", "Newtonsoft.Json.dll" };

try
{
await base.InitializeAsync(cancellationToken, progress);
Expand All @@ -46,11 +49,13 @@ protected override async Task InitializeAsync(CancellationToken cancellationToke
var documentsFolderFullName = documentsFolderFullNameObject.ToString();
var destinationFolderFullName = Path.Combine(documentsFolderFullName, "Visualizers");

var sourceFileFullName = Path.Combine(sourceFolderFullName, "MjmlVisualizer.dll");
var destinationFileFullName = Path.Combine(destinationFolderFullName, "MjmlVisualizer.dll");

CopyFileIfNewerVersion(sourceFileFullName, destinationFileFullName);
foreach (var fileName in fileNames)
{
var sourceFileFullName = Path.Combine(sourceFolderFullName, fileName);
var destinationFileFullName = Path.Combine(destinationFolderFullName, fileName);

CopyFileIfNewerVersion(sourceFileFullName, destinationFileFullName);
}
}
catch (Exception ex)
{
Expand Down
2 changes: 1 addition & 1 deletion src/MjmlVisualizer/MjmlVisualizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ protected override void Show(IDialogVisualizerService windowService, IVisualizer
{
var debugObject = (objectProvider as IVisualizerObjectProvider3).GetDeserializableObject();

var response = new MjmlRepository().GenerateHTML(debugObject.ToObject<string>());
var response = MjmlRepository.GenerateHTML(debugObject.ToObject<string>()).Result;

if (response == null)
{
Expand Down
49 changes: 22 additions & 27 deletions src/MjmlVisualizer/MjmlVisualizer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,44 +34,20 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualStudio.DebuggerVisualizers, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\Program Files\Microsoft Visual Studio\2022\Preview\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.DebuggerVisualizers.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Drawing.Design" />
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Text.Encodings.Web, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Text.Encodings.Web.7.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
</Reference>
<Reference Include="System.Text.Json, Version=7.0.0.3, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Text.Json.7.0.3\lib\net462\System.Text.Json.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq" />
Expand All @@ -89,6 +65,11 @@
<Compile Include="Models\ResponseBody.cs" />
<Compile Include="Models\RequestBody.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
<Compile Include="Repositories\MjmlRepository.cs" />
<Compile Include="ViewModels\MjmlVisualizerViewModel.cs" />
<Compile Include="Windows\MjmlVisualizerWindow.xaml.cs">
Expand All @@ -101,6 +82,10 @@
</None>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<Page Include="Styles\TabItemStyle.xaml">
Expand All @@ -121,4 +106,14 @@
</Page>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

<Target Name="CopySettings" BeforeTargets="BeforeBuild">
<Message Text="Copying Settings" />
<Copy SourceFiles="Properties/Settings.Debug.settings"
DestinationFiles="Properties/Settings.settings"
Condition="'$(Configuration)' == 'Debug'" />
<Copy SourceFiles="Properties/Settings.Release.settings"
DestinationFiles="Properties/Settings.settings"
Condition="'$(Configuration)' == 'Release'" />
</Target>
</Project>
6 changes: 3 additions & 3 deletions src/MjmlVisualizer/Models/ResponseBody.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
using System.Text.Json.Serialization;
using Newtonsoft.Json;

namespace MjmlVisualizer.Models
{
public class ResponseBody
{
[JsonPropertyName("mjml")]
[JsonProperty("mjml")]
public string MJML { get; set; } = string.Empty;

[JsonPropertyName("html")]
[JsonProperty("html")]
public string HTML { get; set; } = string.Empty;
}
}
44 changes: 44 additions & 0 deletions src/MjmlVisualizer/Properties/Settings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions src/MjmlVisualizer/Properties/Settings.Release.settings
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="MjmlVisualizer.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="MJMLUserName" Type="System.String" Scope="Application">
<Value Profile="(Default)">#{MJML_USERNAME}#</Value>
</Setting>
<Setting Name="MJMLPassword" Type="System.String" Scope="Application">
<Value Profile="(Default)">#{MJML_PASSWORD}#</Value>
</Setting>
</Settings>
</SettingsFile>
26 changes: 14 additions & 12 deletions src/MjmlVisualizer/Repositories/MjmlRepository.cs
Original file line number Diff line number Diff line change
@@ -1,40 +1,42 @@
using MjmlVisualizer.Models;
using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace MjmlVisualizer.Repositories
{
public class MjmlRepository
public static class MjmlRepository
{
private const string _apiURL = "https://api.mjml.io/v1/render";
private const string _userName = "#{MJML_USERNAME}#";
private const string _password = "#{MJML_PASSWORD}#";
private readonly HttpClient _httpClient;
private static readonly HttpClient _httpClient;

public MjmlRepository()
static MjmlRepository()
{
var userName = Properties.Settings.Default.MJMLUserName;
var password = Properties.Settings.Default.MJMLPassword;

_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.UTF8.GetBytes($"{_userName}:{_password}")));
Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}")));
}

public ResponseBody GenerateHTML(string mjml)
public static async Task<ResponseBody> GenerateHTML(string mjml)
{
var requestBody = new StringContent(JsonSerializer.Serialize(new RequestBody(mjml)));
var requestBody = new StringContent(JsonConvert.SerializeObject(new RequestBody(mjml)));

var response = _httpClient.PostAsync(_apiURL, requestBody).Result;
var response = await _httpClient.PostAsync(_apiURL, requestBody);

if (!response.IsSuccessStatusCode)
{
return null;
}

var stream = response.Content.ReadAsStringAsync().Result;
var result = JsonSerializer.Deserialize<ResponseBody>(stream);
var json = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<ResponseBody>(json);

return result;
}
Expand Down
10 changes: 1 addition & 9 deletions src/MjmlVisualizer/packages.config
Original file line number Diff line number Diff line change
@@ -1,12 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Bcl.AsyncInterfaces" version="7.0.0" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
<package id="System.Memory" version="4.5.5" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net48" />
<package id="System.Text.Encodings.Web" version="7.0.0" targetFramework="net48" />
<package id="System.Text.Json" version="7.0.3" targetFramework="net48" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net48" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
</packages>

0 comments on commit d7837b2

Please sign in to comment.