Skip to content

Commit 7c321e2

Browse files
allow PayoutTransaction listing to have source expanded
1 parent 18c5bce commit 7c321e2

15 files changed

+239
-71
lines changed

.github/workflows/build.yml

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@ jobs:
66

77
build:
88
name: Build lib
9-
runs-on: ubuntu-latest
9+
runs-on: ubuntu-22.04
1010
steps:
11-
- uses: actions/checkout@v3
12-
- uses: actions/setup-dotnet@v3
11+
- uses: actions/checkout@v4
12+
- uses: actions/setup-dotnet@v4
1313
with:
1414
dotnet-version: 3.1.x
1515
- name: Create NuGet package
1616
run: dotnet pack Shift4 -c Release
17+
env:
18+
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 1
1719
- name: Upload NuGet package as artifact
18-
uses: actions/upload-artifact@v3
20+
uses: actions/upload-artifact@v4
1921
with:
2022
name: nuget-package
2123
path: Shift4/bin/Release/Shift4.*.nupkg
@@ -24,34 +26,40 @@ jobs:
2426

2527
test:
2628
needs: build
29+
strategy:
30+
max-parallel: 1
31+
matrix:
32+
dotnetversion: [netcoreapp3.1, net6.0, netcoreapp7.0]
2733
env:
2834
SECRET_KEY: ${{ secrets.SECRET_KEY }}
2935
name: Run tests
30-
runs-on: ubuntu-latest
36+
runs-on: ubuntu-22.04
3137
steps:
32-
- uses: actions/checkout@v3
33-
- uses: actions/setup-dotnet@v3
38+
- uses: actions/checkout@v4
39+
- uses: actions/setup-dotnet@v4
3440
with:
3541
dotnet-version: |
3642
3.1.x
3743
6.0.x
3844
7.0.x
3945
- name: Run tests
40-
run: dotnet test
46+
run: dotnet test -p:TargetFramework=${{ matrix.dotnetversion }}
47+
env:
48+
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 1
4149

4250
nuget-publish:
4351
if: startsWith(github.event.ref, 'refs/tags/v')
4452
needs: [build, test]
4553
name: Publish package to nuget.org
46-
runs-on: ubuntu-latest
54+
runs-on: ubuntu-22.04
4755
env:
4856
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
4957
steps:
50-
- uses: actions/setup-dotnet@v3
58+
- uses: actions/setup-dotnet@v4
5159
with:
5260
dotnet-version: 3.1.x
5361
- name: Download build artifacts
54-
uses: actions/download-artifact@v3
62+
uses: actions/download-artifact@v4
5563
with:
5664
name: nuget-package
5765
- name: Publish package to nuget.org
@@ -62,9 +70,9 @@ jobs:
6270
if: startsWith(github.event.ref, 'refs/tags/v')
6371
needs: [build, test]
6472
name: Create Release
65-
runs-on: ubuntu-latest
73+
runs-on: ubuntu-22.04
6674
steps:
67-
- uses: actions/download-artifact@v3
75+
- uses: actions/download-artifact@v4
6876
with:
6977
name: nuget-package
7078
- name: Create Release
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Linq;
3+
using Shift4.Response;
4+
5+
namespace Shift4.Converters
6+
{
7+
public abstract class BaseObjectTypeConverter : JsonConverter
8+
{
9+
protected (string, BaseResponse) convertObjectType(JsonReader reader, JsonSerializer serializer) {
10+
JObject jObject = JObject.Load(reader);
11+
switch (jObject.GetValue("objectType").ToString())
12+
{
13+
case "charge":
14+
var charge = new Charge();
15+
serializer.Populate(jObject.CreateReader(), charge);
16+
return (charge.Id, charge);
17+
case "credit":
18+
var credit = new Credit();
19+
serializer.Populate(jObject.CreateReader(), credit);
20+
return (credit.Id, credit);
21+
case "dispute":
22+
var dispute = new Dispute();
23+
serializer.Populate(jObject.CreateReader(), dispute);
24+
return (dispute.Id, dispute);
25+
case "refund":
26+
var refund = new Refund();
27+
serializer.Populate(jObject.CreateReader(), refund);
28+
return (refund.Id, refund);
29+
case "subscription":
30+
var subscription = new Subscription();
31+
serializer.Populate(jObject.CreateReader(), subscription);
32+
return (subscription.Id, subscription);
33+
case "plan":
34+
var plan = new Plan();
35+
serializer.Populate(jObject.CreateReader(), plan);
36+
return (plan.Id, plan);
37+
case "customer":
38+
var customer = new Customer();
39+
serializer.Populate(jObject.CreateReader(), customer);
40+
return (customer.Id, customer);
41+
case "fraud_warning":
42+
var warning = new FraudWarning();
43+
serializer.Populate(jObject.CreateReader(), warning);
44+
return (warning.Id, warning);
45+
case "card":
46+
var card = new Card();
47+
serializer.Populate(jObject.CreateReader(), card);
48+
return (card.Id, card);
49+
case "payout":
50+
var payout = new Payout();
51+
serializer.Populate(jObject.CreateReader(), payout);
52+
return (payout.Id, payout);
53+
}
54+
return (null, null);
55+
}
56+
}
57+
}

Shift4/Converters/EventDataConverter.cs

Lines changed: 2 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
using Newtonsoft.Json;
2-
using Newtonsoft.Json.Linq;
3-
using Shift4.Response;
42
using System;
5-
using System.Collections.Generic;
6-
using System.Linq;
7-
using System.Text;
83

94
namespace Shift4.Converters
105
{
11-
public class EventDataConverter : JsonConverter
6+
public class EventDataConverter : BaseObjectTypeConverter
127
{
138

149
public override bool CanConvert(Type objectType)
@@ -18,48 +13,7 @@ public override bool CanConvert(Type objectType)
1813

1914
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
2015
{
21-
JObject jObject = JObject.Load(reader);
22-
switch (jObject.GetValue("objectType").ToString())
23-
{
24-
case "charge":
25-
var charge = new Charge();
26-
serializer.Populate(jObject.CreateReader(), charge);
27-
return charge;
28-
case "credit":
29-
var credit = new Credit();
30-
serializer.Populate(jObject.CreateReader(), credit);
31-
return credit;
32-
case "dispute":
33-
var dispute = new Dispute();
34-
serializer.Populate(jObject.CreateReader(), dispute);
35-
return dispute;
36-
case "subscription":
37-
var subscription = new Subscription();
38-
serializer.Populate(jObject.CreateReader(), subscription);
39-
return subscription;
40-
case "plan":
41-
var plan = new Plan();
42-
serializer.Populate(jObject.CreateReader(), plan);
43-
return plan;
44-
case "customer":
45-
var customer = new Customer();
46-
serializer.Populate(jObject.CreateReader(), customer);
47-
return customer;
48-
case "fraud_warning":
49-
var warning = new FraudWarning();
50-
serializer.Populate(jObject.CreateReader(), warning);
51-
return warning;
52-
case "card":
53-
var card = new Card();
54-
serializer.Populate(jObject.CreateReader(), card);
55-
return card;
56-
case "payout":
57-
var payout = new Payout();
58-
serializer.Populate(jObject.CreateReader(), payout);
59-
return payout;
60-
}
61-
62-
return null;
16+
return convertObjectType(reader, serializer).Item2;
6317
}
6418

6519
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

Shift4/Converters/ExpandConverter.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
using System;
3+
using Newtonsoft.Json;
4+
using Shift4.Request;
5+
6+
namespace Shift4.Converters
7+
{
8+
public class ExpandConverter : JsonConverter<Expand>
9+
{
10+
public override Expand ReadJson(JsonReader reader, Type objectType, Expand existingValue, bool hasExistingValue, JsonSerializer serializer)
11+
{
12+
return null;
13+
}
14+
15+
public override void WriteJson(JsonWriter writer, Expand value, JsonSerializer serializer)
16+
{
17+
if (value == null || value.Paths.Count == 0) {
18+
return;
19+
}
20+
writer.WriteStartArray();
21+
value.Paths.ForEach(path => {
22+
writer.WriteValue(path);
23+
});
24+
writer.WriteEndArray();
25+
}
26+
}
27+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
using Shift4.Response;
4+
5+
namespace Shift4.Converters
6+
{
7+
public class ExpandableConverter<T> : BaseObjectTypeConverter where T: BaseResponse
8+
{
9+
public override bool CanConvert(Type objectType) => objectType.IsInstanceOfType(typeof(Expandable<T>));
10+
11+
12+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
13+
{
14+
if (reader.TokenType == JsonToken.String)
15+
{
16+
// Case: JSON contains a string
17+
return new Expandable<T> { Id = reader.Value.ToString() };
18+
}
19+
else if (reader.TokenType == JsonToken.StartObject)
20+
{
21+
var (id, deserializedObject) = convertObjectType(reader, serializer);
22+
return new Expandable<T> { ExpandedObject = (T)deserializedObject, Id = id};
23+
}
24+
25+
throw new JsonSerializationException("Unexpected token type");
26+
27+
}
28+
29+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
30+
{
31+
}
32+
}
33+
}

Shift4/Internal/ApiClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class ApiClient : IApiClient
1717
private string _privateAuthToken;
1818
private IHttpClient _client;
1919
private IFileExtensionToMimeMapper _fileExtensionToMimeMapper;
20-
private string _sdkVersion = "3.7.0";
20+
private string _sdkVersion = "3.8.0";
2121

2222
public ApiClient(IHttpClient httpClient, ISecretKeyProvider secretKeyProvider, IFileExtensionToMimeMapper fileExtensionToMimeMapper)
2323
{

Shift4/Request/Expand.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Collections.Generic;
2+
using Org.BouncyCastle.Asn1.Mozilla;
3+
4+
namespace Shift4.Request
5+
{
6+
public class Expand {
7+
public List<string> Paths {get; set; }
8+
9+
public Expand() {
10+
Paths = new List<string>();
11+
}
12+
13+
public Expand add(string path){
14+
Paths.Add(path);
15+
return this;
16+
}
17+
}
18+
}

Shift4/Request/PayoutTransactionListRequest.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using Newtonsoft.Json;
22
using Newtonsoft.Json.Linq;
3+
using Shift4.Converters;
34
using System;
45
using System.Collections.Generic;
6+
using System.Dynamic;
57
using System.Linq;
68
using System.Text;
79

@@ -14,5 +16,18 @@ public class PayoutTransactionListRequest : ListRequest
1416

1517
[JsonProperty("source")]
1618
public String Source { get; set; }
19+
20+
[JsonProperty("expand")]
21+
[JsonConverter(typeof(ExpandConverter))]
22+
public Expand Expand { get; }
23+
24+
public PayoutTransactionListRequest() {
25+
Expand = new Expand();
26+
}
27+
28+
public PayoutTransactionListRequest expandSource() {
29+
this.Expand.add("source");
30+
return this;
31+
}
1732
}
1833
}

Shift4/Response/Event.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class Event : BaseResponse
1616

1717
[JsonProperty("data")]
1818
[JsonConverter(typeof(EventDataConverter))]
19-
public object Data { get; set; }
19+
public BaseResponse Data { get; set; }
2020

2121
[JsonProperty("log")]
2222
public string Log { get; set; }

Shift4/Response/Expandable.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Shift4.Response
2+
{
3+
public class Expandable<T>
4+
{
5+
public string Id { get; set;}
6+
public T ExpandedObject {get; set;}
7+
8+
public bool Expanded {
9+
get {
10+
return ExpandedObject != null;
11+
}
12+
}
13+
}
14+
}

Shift4/Response/FraudWarning.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Shift4.Response
1111
{
1212
public class FraudWarning : BaseResponse
1313
{
14-
14+
1515
[JsonProperty("id")]
1616
public String Id { get; set; }
1717

Shift4/Response/PayoutTransaction.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ public class PayoutTransaction : BaseResponse
2929
public string Currency { get; set; }
3030

3131
[JsonProperty("source")]
32-
public string Source { get; set; }
32+
[JsonConverter(typeof(ExpandableConverter<BaseResponse>))]
33+
public Expandable<BaseResponse> Source { get; set; }
3334

3435
[JsonProperty("payout")]
3536
public string Payout { get; set; }

Shift4/Shift4.csproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<PropertyGroup>
1010
<PackageId>Shift4</PackageId>
11-
<Version>3.7.0</Version>
11+
<Version>3.8.0</Version>
1212
<Authors>Shift4</Authors>
1313
<Copyright>©2024 Shift4. All rights reserved.</Copyright>
1414
<Company>Shift4</Company>
@@ -33,4 +33,9 @@
3333
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
3434
</ItemGroup>
3535

36+
<PropertyGroup>
37+
<InvariantGlobalization>true</InvariantGlobalization>
38+
</PropertyGroup>
39+
40+
3641
</Project>

0 commit comments

Comments
 (0)