Skip to content

Commit 188cb60

Browse files
committed
Code refactoring
1 parent 5ea1c22 commit 188cb60

File tree

4 files changed

+61
-72
lines changed

4 files changed

+61
-72
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Nop.Plugin.Shipping.USPS.Domain;
2+
3+
public enum TransitDaysAPI
4+
{
5+
PriorityMail,
6+
FirstClassMail,
7+
ExpressMailCommitment
8+
}

Nop.Plugin.Shipping.USPS/Domain/TransitResponse.cs

+17-17
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,11 @@
1-
using Nop.Plugin.Shipping.USPS.Domain.Extensions;
2-
3-
using System.Xml.Linq;
1+
using System.Xml.Linq;
2+
using Nop.Plugin.Shipping.USPS.Domain.Extensions;
43

54
namespace Nop.Plugin.Shipping.USPS.Domain;
65

76
public class TransitResponse
87
{
9-
public string OriginZip { get; set; }
10-
11-
public string DestinationZip { get; set; }
12-
13-
public int? Days { get; set; }
14-
15-
public string IsGuaranteed { get; set; }
16-
17-
public string Message { get; set; }
18-
19-
public string EffectiveAcceptanceDate { get; set; }
20-
21-
public string ScheduledDeliveryDate { get; set; }
22-
8+
#region Ctor
239

2410
public TransitResponse() { }
2511

@@ -37,6 +23,8 @@ public TransitResponse(XElement transit)
3723
ScheduledDeliveryDate = transit.GetValueOfXMLElement("ScheduledDeliveryDate");
3824
}
3925

26+
#endregion
27+
4028
#region Methods
4129

4230
/// <summary>
@@ -67,4 +55,16 @@ public static async Task<TransitResponse> LoadAsync(Stream stream)
6755
}
6856

6957
#endregion
58+
59+
#region Properties
60+
61+
public string OriginZip { get; set; }
62+
public string DestinationZip { get; set; }
63+
public int? Days { get; set; }
64+
public string IsGuaranteed { get; set; }
65+
public string Message { get; set; }
66+
public string EffectiveAcceptanceDate { get; set; }
67+
public string ScheduledDeliveryDate { get; set; }
68+
69+
#endregion
7070
}

Nop.Plugin.Shipping.USPS/Services/USPSHttpClient.cs

+4-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
using Microsoft.Net.Http.Headers;
2-
1+
using Microsoft.AspNetCore.DataProtection.KeyManagement;
2+
using Microsoft.Net.Http.Headers;
33
using Nop.Core;
44
using Nop.Plugin.Shipping.USPS.Domain;
55

@@ -12,13 +12,6 @@ public class USPSHttpClient
1212
private const string RATES_API_KEY_INTERNATIONAL = "IntlRateV2";
1313
private const string RATES_API_KEY_DOMESTIC = "RateV4";
1414

15-
public enum TransitDaysAPI
16-
{
17-
PriorityMail,
18-
FirstClassMail,
19-
ExpressMailCommitment
20-
}
21-
2215
#endregion
2316

2417
#region Fields
@@ -59,14 +52,9 @@ public async Task<RateResponse> GetRatesAsync(string requestString, bool isDomes
5952
return await RateResponse.LoadAsync(responseStream, isDomestic);
6053
}
6154

62-
public async Task<TransitResponse> GetTransitTimeAsync(TransitDaysAPI postageApiType, string originPostalCode, string destinationPostalCode, string username)
55+
public async Task<TransitResponse> GetTransitTimeAsync(TransitDaysAPI api, string requestString)
6356
{
64-
var responseStream = await _httpClient.GetStreamAsync($"?API={postageApiType}&XML=" +
65-
$"<{postageApiType}Request USERID=\"{username}\">" +
66-
$"<OriginZip>{originPostalCode}</OriginZip>" +
67-
$"<DestinationZip>{destinationPostalCode}</DestinationZip>" +
68-
$"</{postageApiType}Request>");
69-
57+
var responseStream = await _httpClient.GetStreamAsync($"?API={api}&XML={requestString}");
7058
return await TransitResponse.LoadAsync(responseStream);
7159
}
7260

Nop.Plugin.Shipping.USPS/Services/USPSService.cs

+32-39
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Xml.Linq;
2-
32
using Nop.Core;
43
using Nop.Core.Domain.Shipping;
54
using Nop.Plugin.Shipping.USPS.Domain;
@@ -306,6 +305,17 @@ private string CreateTrackRequest(string trackingNumber)
306305
return document.ToString(SaveOptions.DisableFormatting);
307306
}
308307

308+
private string CreateTransitTimeRequest(TransitDaysAPI postageApiType, string originPostalCode, string destinationPostalCode)
309+
{
310+
var document = new XDocument(
311+
new XElement($"{postageApiType}Request", new XAttribute("USERID", _uspsSettings.Username),
312+
new XElement("OriginZip", originPostalCode),
313+
new XElement("DestinationZip", destinationPostalCode))
314+
);
315+
316+
return document.ToString(SaveOptions.DisableFormatting);
317+
}
318+
309319
/// <summary>
310320
/// USPS country hacks
311321
/// The USPS wants the NAME of the country for international shipments rather than one of the ISO codes
@@ -400,7 +410,7 @@ private async Task<int> GetWeightAsync(GetShippingOptionRequest shippingOptionRe
400410
//get rate response
401411
var rateResponse = await _uspsHttpClient.GetRatesAsync(requestString, isDomestic);
402412

403-
return await ParseResponse(rateResponse, shippingOptionRequest);
413+
return await ParseResponseAsync(rateResponse, shippingOptionRequest);
404414
}
405415
catch (Exception ex)
406416
{
@@ -440,7 +450,7 @@ private async Task<bool> IsDomesticRequestAsync(GetShippingOptionRequest getShip
440450
return false;
441451
}
442452

443-
private async Task<(IList<ShippingOption> shippingOptions, IList<string> errors)> ParseResponse(RateResponse response, GetShippingOptionRequest request)
453+
private async Task<(IList<ShippingOption> shippingOptions, IList<string> errors)> ParseResponseAsync(RateResponse response, GetShippingOptionRequest request)
444454
{
445455
var shippingOptions = new List<ShippingOption>();
446456

@@ -485,50 +495,33 @@ bool isPostageOffered(Postage p)
485495
async Task<int?> getTransitDaysAsync(string service)
486496
{
487497
//parse out service to make request to correct API and fill Rool Element name
488-
var mailType = default(USPSHttpClient.TransitDaysAPI?);
498+
var mailType = default(TransitDaysAPI?);
499+
489500
if (service.Contains("priority", StringComparison.InvariantCultureIgnoreCase))
490-
{
491-
mailType = USPSHttpClient.TransitDaysAPI.PriorityMail;
492-
}
493-
else if (service.Contains("firstclass", StringComparison.InvariantCultureIgnoreCase) ||
494-
service.Contains("first class", StringComparison.InvariantCultureIgnoreCase))
495-
{
496-
mailType = USPSHttpClient.TransitDaysAPI.FirstClassMail;
497-
}
498-
else if (service.Contains("express", StringComparison.InvariantCultureIgnoreCase))
499-
{
500-
mailType = USPSHttpClient.TransitDaysAPI.ExpressMailCommitment;
501-
}
501+
mailType = TransitDaysAPI.PriorityMail;
502502

503-
if (mailType.HasValue)
504-
{
505-
var transitResponse = await _uspsHttpClient.GetTransitTimeAsync(mailType.Value,
506-
CommonHelper.EnsureMaximumLength(CommonHelper.EnsureNumericOnly(request.ZipPostalCodeFrom), 5),
507-
CommonHelper.EnsureMaximumLength(CommonHelper.EnsureNumericOnly(request.ShippingAddress.ZipPostalCode), 5), _uspsSettings.Username);
508-
if (transitResponse != null &&
509-
transitResponse.Days.HasValue)
510-
{
511-
var transitDays = transitResponse.Days.Value + 1; //add a day to process order.
503+
if (service.Contains("firstclass", StringComparison.InvariantCultureIgnoreCase) || service.Contains("first class", StringComparison.InvariantCultureIgnoreCase))
504+
mailType = TransitDaysAPI.FirstClassMail;
512505

513-
var today = DateTime.UtcNow.ToLocalTime();
514-
//assuming 5-day work week here and weekend order will not be shipped until monday at earliest, may want to add options to configuration to provide most accurate estimate.
515-
while (today.DayOfWeek == DayOfWeek.Friday ||
516-
today.DayOfWeek == DayOfWeek.Saturday ||
517-
today.DayOfWeek == DayOfWeek.Sunday)
518-
{
519-
today = today.AddDays(1);
520-
transitDays += 1;
521-
}
506+
if (service.Contains("express", StringComparison.InvariantCultureIgnoreCase))
507+
mailType = TransitDaysAPI.ExpressMailCommitment;
522508

523-
return transitDays;
524-
}
525-
}
509+
if (mailType is null)
510+
return null;
511+
512+
static string formatZip(string zipCode) => CommonHelper.EnsureMaximumLength(CommonHelper.EnsureNumericOnly(zipCode), 5);
526513

527-
return null;
514+
var requestString = CreateTransitTimeRequest(
515+
mailType.Value,
516+
formatZip(request.ZipPostalCodeFrom),
517+
formatZip(request.ShippingAddress.ZipPostalCode));
518+
519+
var transitResponse = await _uspsHttpClient.GetTransitTimeAsync(mailType.Value, requestString);
520+
521+
return transitResponse?.Days;
528522
}
529523
}
530524

531-
532525
private async Task<IList<ShipmentStatusEvent>> TrackAsync(string requestString)
533526
{
534527
var response = await _uspsHttpClient.GetTrackEventsAsync(requestString);

0 commit comments

Comments
 (0)