Skip to content

allow PayoutTransaction listing to have source expanded #19

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 21 additions & 13 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@ jobs:

build:
name: Build lib
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 3.1.x
- name: Create NuGet package
run: dotnet pack Shift4 -c Release
env:
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 1
- name: Upload NuGet package as artifact
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: nuget-package
path: Shift4/bin/Release/Shift4.*.nupkg
Expand All @@ -24,34 +26,40 @@ jobs:

test:
needs: build
strategy:
max-parallel: 1
matrix:
dotnetversion: [netcoreapp3.1, net6.0, netcoreapp7.0]
env:
SECRET_KEY: ${{ secrets.SECRET_KEY }}
name: Run tests
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: |
3.1.x
6.0.x
7.0.x
- name: Run tests
run: dotnet test
run: dotnet test -p:TargetFramework=${{ matrix.dotnetversion }}
env:
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 1

nuget-publish:
if: startsWith(github.event.ref, 'refs/tags/v')
needs: [build, test]
name: Publish package to nuget.org
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
steps:
- uses: actions/setup-dotnet@v3
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 3.1.x
- name: Download build artifacts
uses: actions/download-artifact@v3
uses: actions/download-artifact@v4
with:
name: nuget-package
- name: Publish package to nuget.org
Expand All @@ -62,9 +70,9 @@ jobs:
if: startsWith(github.event.ref, 'refs/tags/v')
needs: [build, test]
name: Create Release
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v4
with:
name: nuget-package
- name: Create Release
Expand Down
57 changes: 57 additions & 0 deletions Shift4/Converters/BaseObjectTypeConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Shift4.Response;

namespace Shift4.Converters
{
public abstract class BaseObjectTypeConverter : JsonConverter
{
protected (string, BaseResponse) convertObjectType(JsonReader reader, JsonSerializer serializer) {
JObject jObject = JObject.Load(reader);
switch (jObject.GetValue("objectType").ToString())
{
case "charge":
var charge = new Charge();
serializer.Populate(jObject.CreateReader(), charge);
return (charge.Id, charge);
case "credit":
var credit = new Credit();
serializer.Populate(jObject.CreateReader(), credit);
return (credit.Id, credit);
case "dispute":
var dispute = new Dispute();
serializer.Populate(jObject.CreateReader(), dispute);
return (dispute.Id, dispute);
case "refund":
var refund = new Refund();
serializer.Populate(jObject.CreateReader(), refund);
return (refund.Id, refund);
case "subscription":
var subscription = new Subscription();
serializer.Populate(jObject.CreateReader(), subscription);
return (subscription.Id, subscription);
case "plan":
var plan = new Plan();
serializer.Populate(jObject.CreateReader(), plan);
return (plan.Id, plan);
case "customer":
var customer = new Customer();
serializer.Populate(jObject.CreateReader(), customer);
return (customer.Id, customer);
case "fraud_warning":
var warning = new FraudWarning();
serializer.Populate(jObject.CreateReader(), warning);
return (warning.Id, warning);
case "card":
var card = new Card();
serializer.Populate(jObject.CreateReader(), card);
return (card.Id, card);
case "payout":
var payout = new Payout();
serializer.Populate(jObject.CreateReader(), payout);
return (payout.Id, payout);
}
return (null, null);
}
}
}
50 changes: 2 additions & 48 deletions Shift4/Converters/EventDataConverter.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Shift4.Response;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Shift4.Converters
{
public class EventDataConverter : JsonConverter
public class EventDataConverter : BaseObjectTypeConverter
{

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

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jObject = JObject.Load(reader);
switch (jObject.GetValue("objectType").ToString())
{
case "charge":
var charge = new Charge();
serializer.Populate(jObject.CreateReader(), charge);
return charge;
case "credit":
var credit = new Credit();
serializer.Populate(jObject.CreateReader(), credit);
return credit;
case "dispute":
var dispute = new Dispute();
serializer.Populate(jObject.CreateReader(), dispute);
return dispute;
case "subscription":
var subscription = new Subscription();
serializer.Populate(jObject.CreateReader(), subscription);
return subscription;
case "plan":
var plan = new Plan();
serializer.Populate(jObject.CreateReader(), plan);
return plan;
case "customer":
var customer = new Customer();
serializer.Populate(jObject.CreateReader(), customer);
return customer;
case "fraud_warning":
var warning = new FraudWarning();
serializer.Populate(jObject.CreateReader(), warning);
return warning;
case "card":
var card = new Card();
serializer.Populate(jObject.CreateReader(), card);
return card;
case "payout":
var payout = new Payout();
serializer.Populate(jObject.CreateReader(), payout);
return payout;
}

return null;
return convertObjectType(reader, serializer).Item2;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
Expand Down
27 changes: 27 additions & 0 deletions Shift4/Converters/ExpandConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@

using System;
using Newtonsoft.Json;
using Shift4.Request;

namespace Shift4.Converters
{
public class ExpandConverter : JsonConverter<Expand>
{
public override Expand ReadJson(JsonReader reader, Type objectType, Expand existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return null;
}

public override void WriteJson(JsonWriter writer, Expand value, JsonSerializer serializer)
{
if (value == null || value.Paths.Count == 0) {
return;
}
writer.WriteStartArray();
value.Paths.ForEach(path => {
writer.WriteValue(path);
});
writer.WriteEndArray();
}
}
}
33 changes: 33 additions & 0 deletions Shift4/Converters/ExpandableConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System;
using Newtonsoft.Json;
using Shift4.Response;

namespace Shift4.Converters
{
public class ExpandableConverter<T> : BaseObjectTypeConverter where T: BaseResponse
{
public override bool CanConvert(Type objectType) => objectType.IsInstanceOfType(typeof(Expandable<T>));


public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
// Case: JSON contains a string
return new Expandable<T> { Id = reader.Value.ToString() };
}
else if (reader.TokenType == JsonToken.StartObject)
{
var (id, deserializedObject) = convertObjectType(reader, serializer);
return new Expandable<T> { ExpandedObject = (T)deserializedObject, Id = id};
}

throw new JsonSerializationException("Unexpected token type");

}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
}
}
}
2 changes: 1 addition & 1 deletion Shift4/Internal/ApiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class ApiClient : IApiClient
private string _privateAuthToken;
private IHttpClient _client;
private IFileExtensionToMimeMapper _fileExtensionToMimeMapper;
private string _sdkVersion = "3.7.0";
private string _sdkVersion = "3.8.0";

public ApiClient(IHttpClient httpClient, ISecretKeyProvider secretKeyProvider, IFileExtensionToMimeMapper fileExtensionToMimeMapper)
{
Expand Down
18 changes: 18 additions & 0 deletions Shift4/Request/Expand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Collections.Generic;
using Org.BouncyCastle.Asn1.Mozilla;

namespace Shift4.Request
{
public class Expand {
public List<string> Paths {get; set; }

public Expand() {
Paths = new List<string>();
}

public Expand add(string path){
Paths.Add(path);
return this;
}
}
}
15 changes: 15 additions & 0 deletions Shift4/Request/PayoutTransactionListRequest.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Shift4.Converters;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;

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

[JsonProperty("source")]
public String Source { get; set; }

[JsonProperty("expand")]
[JsonConverter(typeof(ExpandConverter))]
public Expand Expand { get; }

public PayoutTransactionListRequest() {
Expand = new Expand();
}

public PayoutTransactionListRequest expandSource() {
this.Expand.add("source");
return this;
}
}
}
2 changes: 1 addition & 1 deletion Shift4/Response/Event.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class Event : BaseResponse

[JsonProperty("data")]
[JsonConverter(typeof(EventDataConverter))]
public object Data { get; set; }
public BaseResponse Data { get; set; }

[JsonProperty("log")]
public string Log { get; set; }
Expand Down
14 changes: 14 additions & 0 deletions Shift4/Response/Expandable.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace Shift4.Response
{
public class Expandable<T>
{
public string Id { get; set;}
public T ExpandedObject {get; set;}

public bool Expanded {
get {
return ExpandedObject != null;
}
}
}
}
2 changes: 1 addition & 1 deletion Shift4/Response/FraudWarning.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Shift4.Response
{
public class FraudWarning : BaseResponse
{

[JsonProperty("id")]
public String Id { get; set; }

Expand Down
3 changes: 2 additions & 1 deletion Shift4/Response/PayoutTransaction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ public class PayoutTransaction : BaseResponse
public string Currency { get; set; }

[JsonProperty("source")]
public string Source { get; set; }
[JsonConverter(typeof(ExpandableConverter<BaseResponse>))]
public Expandable<BaseResponse> Source { get; set; }

[JsonProperty("payout")]
public string Payout { get; set; }
Expand Down
7 changes: 6 additions & 1 deletion Shift4/Shift4.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

<PropertyGroup>
<PackageId>Shift4</PackageId>
<Version>3.7.0</Version>
<Version>3.8.0</Version>
<Authors>Shift4</Authors>
<Copyright>©2024 Shift4. All rights reserved.</Copyright>
<Company>Shift4</Company>
Expand All @@ -33,4 +33,9 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

<PropertyGroup>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>


</Project>
Loading