Skip to content

Commit d3d9577

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

30 files changed

+306
-204
lines changed

.github/workflows/build.yml

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,52 +6,85 @@ 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
2224
if-no-files-found: error
2325
retention-days: 30
2426

25-
test:
27+
test31:
2628
needs: build
2729
env:
2830
SECRET_KEY: ${{ secrets.SECRET_KEY }}
29-
name: Run tests
30-
runs-on: ubuntu-latest
31+
name: Run tests 3.1.x
32+
runs-on: ubuntu-22.04
33+
steps:
34+
- uses: actions/checkout@v4
35+
- uses: actions/setup-dotnet@v4
36+
with:
37+
dotnet-version: 3.1.x
38+
- name: Run tests 3.1.x
39+
run: dotnet test -p:TargetFramework=netcoreapp3.1
40+
env:
41+
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 1
42+
43+
test60:
44+
needs: [build, test31]
45+
env:
46+
SECRET_KEY: ${{ secrets.SECRET_KEY }}
47+
name: Run tests 6.0.x
48+
runs-on: ubuntu-22.04
3149
steps:
32-
- uses: actions/checkout@v3
33-
- uses: actions/setup-dotnet@v3
50+
- uses: actions/checkout@v4
51+
- uses: actions/setup-dotnet@v4
3452
with:
35-
dotnet-version: |
36-
3.1.x
37-
6.0.x
38-
7.0.x
39-
- name: Run tests
40-
run: dotnet test
53+
dotnet-version: 6.0.x
54+
- name: Run tests 6.0.x
55+
run: dotnet test -p:TargetFramework=net6.0
56+
env:
57+
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 1
58+
59+
test70:
60+
needs: [build, test31, test60]
61+
env:
62+
SECRET_KEY: ${{ secrets.SECRET_KEY }}
63+
name: Run tests 7.0.x
64+
runs-on: ubuntu-22.04
65+
steps:
66+
- uses: actions/checkout@v4
67+
- uses: actions/setup-dotnet@v4
68+
with:
69+
dotnet-version: 7.0.x
70+
- name: Run tests 7.0.x
71+
run: dotnet test -p:TargetFramework=netcoreapp7.0
72+
env:
73+
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 1
4174

4275
nuget-publish:
4376
if: startsWith(github.event.ref, 'refs/tags/v')
44-
needs: [build, test]
77+
needs: [build, test31, test60, test70]
4578
name: Publish package to nuget.org
46-
runs-on: ubuntu-latest
79+
runs-on: ubuntu-22.04
4780
env:
4881
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
4982
steps:
50-
- uses: actions/setup-dotnet@v3
83+
- uses: actions/setup-dotnet@v4
5184
with:
5285
dotnet-version: 3.1.x
5386
- name: Download build artifacts
54-
uses: actions/download-artifact@v3
87+
uses: actions/download-artifact@v4
5588
with:
5689
name: nuget-package
5790
- name: Publish package to nuget.org
@@ -60,11 +93,11 @@ jobs:
6093
6194
create-release:
6295
if: startsWith(github.event.ref, 'refs/tags/v')
63-
needs: [build, test]
96+
needs: [build, test31, test60, test70]
6497
name: Create Release
65-
runs-on: ubuntu-latest
98+
runs-on: ubuntu-22.04
6699
steps:
67-
- uses: actions/download-artifact@v3
100+
- uses: actions/download-artifact@v4
68101
with:
69102
name: nuget-package
70103
- 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 BaseIdResponse 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;
17+
case "credit":
18+
var credit = new Credit();
19+
serializer.Populate(jObject.CreateReader(), credit);
20+
return credit;
21+
case "dispute":
22+
var dispute = new Dispute();
23+
serializer.Populate(jObject.CreateReader(), dispute);
24+
return dispute;
25+
case "refund":
26+
var refund = new Refund();
27+
serializer.Populate(jObject.CreateReader(), refund);
28+
return refund;
29+
case "subscription":
30+
var subscription = new Subscription();
31+
serializer.Populate(jObject.CreateReader(), subscription);
32+
return subscription;
33+
case "plan":
34+
var plan = new Plan();
35+
serializer.Populate(jObject.CreateReader(), plan);
36+
return plan;
37+
case "customer":
38+
var customer = new Customer();
39+
serializer.Populate(jObject.CreateReader(), customer);
40+
return customer;
41+
case "fraud_warning":
42+
var warning = new FraudWarning();
43+
serializer.Populate(jObject.CreateReader(), warning);
44+
return warning;
45+
case "card":
46+
var card = new Card();
47+
serializer.Populate(jObject.CreateReader(), card);
48+
return card;
49+
case "payout":
50+
var payout = new Payout();
51+
serializer.Populate(jObject.CreateReader(), payout);
52+
return payout;
53+
}
54+
return 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);
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: BaseIdResponse
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 deserializedObject = convertObjectType(reader, serializer);
22+
return new Expandable<T> { ExpandedObject = (T)deserializedObject };
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/BaseIdResponse.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Linq;
3+
using System;
4+
using Shift4.Converters;
5+
6+
namespace Shift4.Response
7+
{
8+
public abstract class BaseIdResponse: BaseResponse
9+
{
10+
[JsonProperty("id")]
11+
public string Id { get; set; }
12+
13+
[JsonProperty("created")]
14+
[JsonConverter(typeof(DateConverter))]
15+
public DateTime Created { get; set; }
16+
}
17+
}

0 commit comments

Comments
 (0)