Skip to content
This repository was archived by the owner on Nov 25, 2023. It is now read-only.

Commit 7ef4792

Browse files
authored
Merge pull request #112 from Invvard/fix/graphql-parsing-and-requesting
Fix/graphql parsing and requesting
2 parents 3e1cd08 + 4e39858 commit 7ef4792

File tree

7 files changed

+97
-89
lines changed

7 files changed

+97
-89
lines changed

src/InvvardDev.EZLayoutDisplay.Desktop/Service/Design/LayoutService.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,17 @@ namespace InvvardDev.EZLayoutDisplay.Desktop.Service.Design
88
{
99
public class LayoutService : ILayoutService
1010
{
11-
public async Task<ErgodoxLayout> GetLayoutInfo(string layoutHashId, string layoutRevisionId)
11+
public async Task<ErgodoxLayout> GetLayoutInfo(string layoutHashId, string geometry, string layoutRevisionId)
1212
{
1313
Debug.WriteLine("Layout retrieved.");
1414

15-
var layoutInfo = new ErgodoxLayout();
16-
layoutInfo.Title = "Layout title v1.0";
15+
var layoutInfo = new ErgodoxLayout {Title = "Layout title v1.0"};
1716

1817
return await new Task<ErgodoxLayout>(() => layoutInfo);
1918
}
2019

2120
/// <inheritdoc />
22-
public async Task<ErgodoxLayout> GetErgodoxLayout(string layoutHashId, string layoutRevisionId)
21+
public async Task<ErgodoxLayout> GetErgodoxLayout(string layoutHashId, string geometry, string layoutRevisionId)
2322
{
2423
Debug.WriteLine("Layout retrieved.");
2524

src/InvvardDev.EZLayoutDisplay.Desktop/Service/Implementation/LayoutService.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,39 +26,39 @@ public class LayoutService : ILayoutService
2626
};
2727

2828
private readonly string GetLayoutBody =
29-
"{{\"operationName\":\"getLayout\",\"variables\":{{\"hashId\":\"{0}\",\"revisionId\":\"{1}\"}},\"query\":\"query getLayout($hashId: String!, $revisionId: String!) {{\\n Layout(hashId: $hashId, revisionId: $revisionId) {{\\n ...LayoutData\\n }}\\n}}\\n\\nfragment LayoutData on Layout {{\\n geometry\\n hashId\\n title\\n tags {{\\n id\\n hashId\\n name\\n }}\\n revision {{\\n ...RevisionData\\n }}\\n}}\\n\\nfragment RevisionData on Revision {{\\n hashId\\n model\\n title\\n swatch\\n hexUrl\\n zipUrl\\n qmkVersion\\n qmkUptodate\\n config\\n layers {{\\n hashId\\n keys\\n position\\n title\\n color\\n}}\\n}}\\n\"}}";
29+
"{{\"operationName\":\"getLayout\",\"variables\":{{\"hashId\":\"{0}\",\"geometry\":\"{1}\",\"revisionId\":\"{2}\"}},\"query\":\"query getLayout($hashId: String!, $revisionId: String!, $geometry: String) {{\\n Layout(hashId: $hashId, geometry: $geometry, revisionId: $revisionId) {{\\n ...LayoutData\\n }}\\n}}\\n\\nfragment LayoutData on Layout {{\\n geometry\\n hashId\\n title\\n tags {{\\n id\\n hashId\\n name\\n }}\\n revision {{\\n ...RevisionData\\n }}\\n}}\\n\\nfragment RevisionData on Revision {{\\n hashId\\n model\\n title\\n swatch\\n hexUrl\\n zipUrl\\n qmkVersion\\n qmkUptodate\\n config\\n layers {{\\n hashId\\n keys\\n position\\n title\\n color\\n}}\\n}}\\n\"}}";
3030

3131
private readonly string GetLayoutInfoRequestBody =
32-
"{{\"operationName\":\"getLayout\",\"variables\":{{\"hashId\":\"{0}\",\"revisionId\":\"{1}\"}},\"query\":\"query getLayout($hashId: String!, $revisionId: String!) {{\\n Layout(hashId: $hashId, revisionId: $revisionId) {{\\n ...LayoutData\\n __typename\\n }}\\n}}\\n\\nfragment LayoutData on Layout {{\\n geometry\\n hashId\\n title\\n tags {{\\n id\\n hashId\\n name\\n }}\\n revision {{\\n hashId\\n title\\n hexUrl\\n model\\n zipUrl\\n qmkVersion\\n qmkUptodate\\n layers {{\\n position\\n title\\n }}\\n }}\\n __typename\\n}}\\n\"}}";
32+
"{{\"operationName\":\"getLayout\",\"variables\":{{\"hashId\":\"{0}\",\"geometry\":\"{1}\",\"revisionId\":\"{2}\"}},\"query\":\"query getLayout($hashId: String!, $revisionId: String!, $geometry: String) {{\\n Layout(hashId: $hashId, geometry: $geometry, revisionId: $revisionId) {{\\n ...LayoutData\\n }}\\n}}\\n\\nfragment LayoutData on Layout {{\\n geometry\\n hashId\\n title\\n tags {{\\n id\\n hashId\\n name\\n }}\\n revision {{\\n hashId\\n title\\n hexUrl\\n model\\n zipUrl\\n qmkVersion\\n qmkUptodate\\n layers {{\\n position\\n title\\n }}\\n }}\\n}}\\n\"}}";
3333

3434
private const string GetLayoutRequestUri = "https://oryx.zsa.io/graphql";
3535

3636
#region ILayoutService implementation
3737

3838
/// <inheritdoc />
39-
public async Task<ErgodoxLayout> GetLayoutInfo(string layoutHashId, string layoutRevisionId)
39+
public async Task<ErgodoxLayout> GetLayoutInfo(string layoutHashId, string geometry, string layoutRevisionId)
4040
{
4141
Logger.TraceMethod();
4242
Logger.DebugInputParam(nameof(layoutHashId), layoutHashId);
4343
Logger.DebugInputParam(nameof(layoutRevisionId), layoutRevisionId);
4444

4545
ValidateLayoutHashId(layoutHashId);
4646

47-
var info = await QueryData(layoutHashId, layoutRevisionId, GetLayoutInfoRequestBody);
47+
var info = await QueryData(layoutHashId, geometry, layoutRevisionId, GetLayoutInfoRequestBody);
4848

4949
return info;
5050
}
5151

5252
/// <inheritdoc />
53-
public async Task<ErgodoxLayout> GetErgodoxLayout(string layoutHashId, string layoutRevisionId)
53+
public async Task<ErgodoxLayout> GetErgodoxLayout(string layoutHashId, string geometry, string layoutRevisionId)
5454
{
5555
Logger.TraceMethod();
5656
Logger.DebugInputParam(nameof(layoutHashId), layoutHashId);
5757
Logger.DebugInputParam(nameof(layoutRevisionId), layoutRevisionId);
5858

5959
ValidateLayoutHashId(layoutHashId);
6060

61-
var layout = await QueryData(layoutHashId, layoutRevisionId, GetLayoutBody);
61+
var layout = await QueryData(layoutHashId, geometry, layoutRevisionId, GetLayoutBody);
6262

6363
return layout;
6464
}
@@ -94,9 +94,9 @@ public bool SupportsGeometry(string geometry)
9494

9595
#region Private methods
9696

97-
private async Task<ErgodoxLayout> QueryData(string layoutHashId, string layoutRevisionId, string graphQlQuery)
97+
private async Task<ErgodoxLayout> QueryData(string layoutHashId, string geometry, string layoutRevisionId, string graphQlQuery)
9898
{
99-
var requestBody = string.Format(graphQlQuery, layoutHashId, layoutRevisionId);
99+
var requestBody = string.Format(graphQlQuery, layoutHashId, geometry, layoutRevisionId);
100100

101101
var layout = await HttpClientCall(requestBody);
102102

src/InvvardDev.EZLayoutDisplay.Desktop/Service/Interface/ILayoutService.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,19 @@ public interface ILayoutService
1010
/// Gets the <see cref="ErgodoxLayout"/> basic info.
1111
/// </summary>
1212
/// <param name="layoutHashId">The layout hash ID to get.</param>
13+
/// <param name="geometry">The keyboard geometry to get.</param>
1314
/// <param name="layoutRevisionId">The layout revision ID to get.</param>
1415
/// <returns>The <see cref="ErgodoxLayout"/>.</returns>
15-
Task<ErgodoxLayout> GetLayoutInfo(string layoutHashId, string layoutRevisionId);
16+
Task<ErgodoxLayout> GetLayoutInfo(string layoutHashId, string geometry, string layoutRevisionId);
1617

1718
/// <summary>
1819
/// Gets the <see cref="ErgodoxLayout"/>.
1920
/// </summary>
2021
/// <param name="layoutHashId">The layout hash ID to get.</param>
22+
/// <param name="geometry">The keyboard geometry to get.</param>
2123
/// <param name="layoutRevisionId">The layout revision ID to get.</param>
2224
/// <returns>The <see cref="ErgodoxLayout"/>.</returns>
23-
Task<ErgodoxLayout> GetErgodoxLayout(string layoutHashId, string layoutRevisionId);
25+
Task<ErgodoxLayout> GetErgodoxLayout(string layoutHashId, string geometry, string layoutRevisionId);
2426

2527
/// <summary>
2628
/// Transforms an <see cref="ErgodoxLayout"/> into a <see cref="EZLayout"/>.

src/InvvardDev.EZLayoutDisplay.Desktop/ViewModel/DisplayLayoutViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,15 +332,15 @@ private async Task PopulateLayoutTemplates(string geometry)
332332
{
333333
Logger.TraceMethod();
334334

335-
foreach (var t in _ezLayout.EZLayers)
335+
foreach (var ezLayer in _ezLayout.EZLayers)
336336
{
337337
if (!(await LoadLayoutDefinition(geometry) is List<KeyTemplate> layoutTemplate)) break;
338338

339339
if (layoutTemplate.Count == 0) return;
340340

341341
for (int j = 0 ; j < layoutTemplate.Count ; j++)
342342
{
343-
layoutTemplate[j].EZKey = t.EZKeys[j];
343+
layoutTemplate[j].EZKey = ezLayer.EZKeys[j];
344344
}
345345

346346
_layoutTemplates.Add(layoutTemplate);

src/InvvardDev.EZLayoutDisplay.Desktop/ViewModel/SettingsViewModel.cs

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class SettingsViewModel : ViewModelBase
4343
private ICommand _cancelSettingsCommand;
4444

4545
private string _currentLayoutHashId;
46+
private string _currentGeometry;
4647
private string _currentLayoutRevisionId;
4748
private string _layoutTitle;
4849
private string _keyboardModel;
@@ -52,7 +53,6 @@ public class SettingsViewModel : ViewModelBase
5253
private string _hexFileUri;
5354
private string _sourcesZipUri;
5455
private bool _layoutIsCompiled;
55-
private string _keyboardGeometry;
5656

5757
private string _altModifierLabel;
5858
private string _ctrlModifierLabel;
@@ -227,6 +227,12 @@ public string CurrentLayoutHashId
227227
set => Set(ref _currentLayoutHashId, value);
228228
}
229229

230+
public string CurrentGeometry
231+
{
232+
get => _currentGeometry;
233+
set => Set(ref _currentGeometry, value);
234+
}
235+
230236
public string CurrentLayoutRevisionId
231237
{
232238
get => _currentLayoutRevisionId;
@@ -349,12 +355,12 @@ private void OpenTagSearchUrl(string tag)
349355
{
350356
Logger.TraceRelayCommand();
351357

352-
if (string.IsNullOrWhiteSpace(tag) || string.IsNullOrWhiteSpace(_keyboardGeometry))
358+
if (string.IsNullOrWhiteSpace(tag))
353359
{
354360
return;
355361
}
356362

357-
var tagSearchUri = string.Format(TagSearchBaseUri, _keyboardGeometry, tag);
363+
var tagSearchUri = string.Format(TagSearchBaseUri, CurrentGeometry, tag);
358364
_processService.StartWebUrl(tagSearchUri);
359365
}
360366

@@ -400,11 +406,11 @@ private async void UpdateErgoDoxInfo()
400406
{
401407
Logger.TraceMethod();
402408

403-
(CurrentLayoutHashId, CurrentLayoutRevisionId) = ExtractLayoutUrlIds(LayoutUrlContent);
409+
ExtractLayoutUrlIds(LayoutUrlContent);
404410

405411
try
406412
{
407-
var layoutInfo = await _layoutService.GetLayoutInfo(CurrentLayoutHashId, CurrentLayoutRevisionId);
413+
var layoutInfo = await _layoutService.GetLayoutInfo(CurrentLayoutHashId, CurrentGeometry, CurrentLayoutRevisionId);
408414
Logger.Debug("LayoutInfo = {@value0}", layoutInfo);
409415

410416
ClearLayoutInfo();
@@ -445,8 +451,7 @@ private void ClearLayoutInfo()
445451
LayoutTitle = "";
446452
KeyboardModel = "";
447453
LayoutStatus = "";
448-
449-
_keyboardGeometry = "";
454+
450455
_layoutIsCompiled = false;
451456
}
452457

@@ -455,7 +460,6 @@ private void UpdateLayoutInfo(ErgodoxLayout layoutInfo)
455460
Logger.TraceMethod();
456461

457462
LayoutTitle = layoutInfo.Title;
458-
_keyboardGeometry = layoutInfo.Geometry;
459463

460464
if (layoutInfo.Tags?.Any() != null)
461465
{
@@ -464,7 +468,7 @@ private void UpdateLayoutInfo(ErgodoxLayout layoutInfo)
464468

465469
if (layoutInfo.Revision != null)
466470
{
467-
KeyboardModel = GetKeyBoardDescription(_keyboardGeometry, layoutInfo.Revision.Model);
471+
KeyboardModel = GetKeyBoardDescription(layoutInfo.Geometry, layoutInfo.Revision.Model);
468472
UpdateLayoutButtons(layoutInfo.Revision);
469473
LayoutStatus = !_layoutIsCompiled ? "Not compiled" : "Compiled";
470474

@@ -519,7 +523,7 @@ private async Task UpdateLayout()
519523

520524
try
521525
{
522-
var ergodoxLayout = await _layoutService.GetErgodoxLayout(CurrentLayoutHashId, CurrentLayoutRevisionId);
526+
var ergodoxLayout = await _layoutService.GetErgodoxLayout(CurrentLayoutHashId, CurrentGeometry, CurrentLayoutRevisionId);
523527
Logger.Debug("ergodoxLayout = {@value0}", ergodoxLayout);
524528

525529
var ezLayout = _layoutService.PrepareEZLayout(ergodoxLayout);
@@ -539,33 +543,35 @@ private async Task UpdateLayout()
539543
}
540544
}
541545

542-
private (string layoutHashId, string layoutRevisionId) ExtractLayoutUrlIds(string layoutUrl)
546+
private void ExtractLayoutUrlIds(string layoutUrl)
543547
{
544548
Logger.TraceMethod();
545549

546550
var layoutHashIdGroupName = "layoutHashId";
551+
var geometryGroupName = "geometry";
547552
var layoutRevisionIdGroupName = "layoutRevisionId";
548553
var pattern =
549-
$"https://configure.(?:ergodox-ez.com|zsa.io)/(?:ergodox-ez|planck-ez|moonlander)/layouts/(?<{layoutHashIdGroupName}>default|[a-zA-Z0-9]{{4,}})(?:/(?<{layoutRevisionIdGroupName}>latest|[a-zA-Z0-9]+)(?:/[0-9]{{1,2}})?)?";
550-
var layoutHashId = "default";
551-
var layoutRevisionId = "latest";
554+
$"https://configure.(?:ergodox-ez.com|zsa.io)/(?<{geometryGroupName}>ergodox-ez|planck-ez|moonlander)/layouts/(?<{layoutHashIdGroupName}>default|[a-zA-Z0-9]{{4,}})(?:/(?<{layoutRevisionIdGroupName}>latest|[a-zA-Z0-9]+)(?:/[0-9]{{1,2}})?)?";
555+
CurrentLayoutHashId = "default";
556+
CurrentGeometry = "ergodox-ez";
557+
CurrentLayoutRevisionId = "latest";
552558

553559
var regex = new Regex(pattern);
554560
var match = regex.Match(layoutUrl);
555561

556562
if (match.Success)
557563
{
558-
layoutHashId = match.Groups[layoutHashIdGroupName].Value;
559-
564+
CurrentLayoutHashId = match.Groups[layoutHashIdGroupName].Value;
565+
CurrentGeometry = match.Groups[geometryGroupName].Value;
560566
var revisionId = match.Groups[layoutRevisionIdGroupName].Value;
561-
layoutRevisionId = string.IsNullOrWhiteSpace(revisionId) ? layoutRevisionId : revisionId;
567+
CurrentLayoutRevisionId = string.IsNullOrWhiteSpace(revisionId) ? CurrentLayoutRevisionId : revisionId;
562568
}
563569

564-
Logger.Debug("Layout URL = {0}", layoutUrl);
565-
Logger.Debug("Layout Hash ID = {0}", layoutHashId);
566-
Logger.Debug("Layout Revision ID = {0}", layoutRevisionId);
567-
568-
return (layoutHashId, layoutRevisionId);
570+
Logger.Debug($"Layout URL = {layoutUrl}");
571+
Logger.Debug($"Layout URL has {(match.Success ? "": "NOT ")}been matched");
572+
Logger.Debug($"Layout Hash ID = {CurrentLayoutHashId}");
573+
Logger.Debug($"Keyboard geometry = {CurrentGeometry}");
574+
Logger.Debug($"Layout Revision ID = {CurrentLayoutRevisionId}");
569575
}
570576

571577
#endregion

src/InvvardDev.EZLayoutDisplay.Tests/Service/LayoutServiceTest.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Threading.Tasks;
5-
using InvvardDev.EZLayoutDisplay.Desktop.Model;
1+
using InvvardDev.EZLayoutDisplay.Desktop.Model;
62
using InvvardDev.EZLayoutDisplay.Desktop.Model.Enum;
73
using InvvardDev.EZLayoutDisplay.Desktop.Service.Implementation;
84
using InvvardDev.EZLayoutDisplay.Desktop.Service.Interface;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using System.Threading.Tasks;
99
using Xunit;
1010

1111
namespace InvvardDev.EZLayoutDisplay.Tests.Service
@@ -32,24 +32,25 @@ private static ErgodoxLayout InitializeDataTree()
3232
}
3333

3434
[ Theory ]
35-
[ InlineData("EOEb", true) ]
36-
[ InlineData("default", true) ]
37-
[ InlineData("test", false) ]
38-
public async Task GetLayoutInfo(string layoutHashId, bool exist)
35+
[ InlineData("EOEb", "ergodox-ez", "ergodox-ez", true) ]
36+
[ InlineData("EOEb", "planck-ez", "ergodox-ez", true) ]
37+
[ InlineData("default", "ergodox-ez", "ergodox-ez", true) ]
38+
[ InlineData("default", "moonlander", "moonlander", true) ]
39+
[ InlineData("test", "ergodox-ez", "ergodox-ez", false) ]
40+
public async Task GetLayoutInfo(string layoutHashId, string geometry, string expectedGeometry, bool exist)
3941
{
4042
// Arrange
4143
ILayoutService layoutService = new LayoutService();
42-
43-
// Act
4444
ErgodoxLayout response = null;
4545

46+
// Act
4647
if (exist)
4748
{
48-
response = await layoutService.GetLayoutInfo(layoutHashId, "latest");
49+
response = await layoutService.GetLayoutInfo(layoutHashId, geometry, "latest");
4950
}
5051
else
5152
{
52-
await Assert.ThrowsAsync<ArgumentException>(() => layoutService.GetLayoutInfo(layoutHashId, "latest"));
53+
await Assert.ThrowsAsync<ArgumentException>(() => layoutService.GetLayoutInfo(layoutHashId, geometry, "latest"));
5354
}
5455

5556
// Assert
@@ -60,6 +61,7 @@ public async Task GetLayoutInfo(string layoutHashId, bool exist)
6061
Assert.NotNull(response.Revision);
6162
Assert.False(string.IsNullOrWhiteSpace(response.HashId));
6263
Assert.False(string.IsNullOrWhiteSpace(response.Title));
64+
Assert.Equal(expectedGeometry, response.Geometry);
6365
}
6466
}
6567

@@ -77,11 +79,11 @@ public async Task GetErgodoxLayout(string layoutHashId, bool exist)
7779

7880
if (exist)
7981
{
80-
response = await layoutService.GetErgodoxLayout(layoutHashId, "latest");
82+
response = await layoutService.GetErgodoxLayout(layoutHashId, "ergodox-ez", "latest");
8183
}
8284
else
8385
{
84-
await Assert.ThrowsAsync<ArgumentException>(() => layoutService.GetErgodoxLayout(layoutHashId, "latest"));
86+
await Assert.ThrowsAsync<ArgumentException>(() => layoutService.GetErgodoxLayout(layoutHashId, "ergodox-ez", "latest"));
8587
}
8688

8789
// Assert
@@ -114,10 +116,9 @@ public void PrepareEZLayout_OneLayer_ManyKeys()
114116
GlowColor = "",
115117
Code = "KC_TRANSPARENT"
116118
});
117-
EZLayout ezLayoutResult;
118119

119120
// Act
120-
ezLayoutResult = layoutService.PrepareEZLayout(ergodoxLayout);
121+
var ezLayoutResult = layoutService.PrepareEZLayout(ergodoxLayout);
121122

122123
// Assert
123124
Assert.Single(ezLayoutResult.EZLayers);
@@ -168,10 +169,9 @@ public void PrepareEZLayout_TwoLayer_ManyKeys()
168169
GlowColor = "",
169170
Code = "KC_SPACE"
170171
});
171-
EZLayout ezLayoutResult;
172172

173173
// Act
174-
ezLayoutResult = layoutService.PrepareEZLayout(ergodoxLayout);
174+
var ezLayoutResult = layoutService.PrepareEZLayout(ergodoxLayout);
175175

176176
// Assert
177177
Assert.Equal(2, ezLayoutResult.EZLayers.Count);
@@ -200,7 +200,7 @@ public async Task GetErgodoxLayout_HashIdNull()
200200
ILayoutService layoutService = new LayoutService();
201201

202202
// Act
203-
await Assert.ThrowsAsync<ArgumentNullException>(() => layoutService.GetErgodoxLayout("", ""));
203+
await Assert.ThrowsAsync<ArgumentNullException>(() => layoutService.GetErgodoxLayout("", "", ""));
204204
}
205205

206206
[ Theory ]

0 commit comments

Comments
 (0)