Skip to content

Commit d6801b8

Browse files
author
o.nadymov
committed
ValidateSmsBody: Custom validation for SmsTraffic.
1 parent 29fe934 commit d6801b8

File tree

6 files changed

+63
-18
lines changed

6 files changed

+63
-18
lines changed

src/Providers/Spoleto.SMS.GetSms/Providers/GetSmsProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public override async Task<SmsSendingResult> SendAsync(SmsMessage message, Cance
202202
#endif
203203

204204
// Validate:
205-
phoneNumbers.ForEach(number => ValidateDataForSMS(number, getSmsMessage.Body, getSmsMessage.IsAllowSendToForeignNumbers));
205+
phoneNumbers.ForEach(number => ValidateDataForSMS(number, getSmsMessage));
206206

207207
var smsList = phoneNumbers
208208
.Select(x => new Dictionary<string, string>()

src/Providers/Spoleto.SMS.SmsTraffic/Models/SmsTrafficMessage.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
{
33
public record SmsTrafficMessage : SmsMessage
44
{
5-
public SmsTrafficMessage(string body, string? from, string to, bool isAllowSendToForeignNumbers = false, SmsTrafficMessageData? providerData = null)
5+
public SmsTrafficMessage(string? body, string? from, string to, bool isAllowSendToForeignNumbers = false, SmsTrafficMessageData? providerData = null)
66
: base(body, from, to, isAllowSendToForeignNumbers)
77
{
88
SmsTrafficProviderData = providerData;
99
}
1010

11-
public SmsTrafficMessage(string body, string? from, List<string> listOfTo, bool isAllowSendToForeignNumbers = false, SmsTrafficMessageData? providerData = null)
11+
public SmsTrafficMessage(string? body, string? from, List<string> listOfTo, bool isAllowSendToForeignNumbers = false, SmsTrafficMessageData? providerData = null)
1212
: base(body, from, listOfTo, isAllowSendToForeignNumbers)
1313
{
1414
SmsTrafficProviderData = providerData;
@@ -23,6 +23,19 @@ public SmsTrafficMessage(string body, string? from, List<string> listOfTo, bool
2323
/// Additional data for the message.
2424
/// </summary>
2525
public SmsTrafficMessageData? SmsTrafficProviderData { get; }
26+
27+
protected override void Validate()
28+
{
29+
if (SmsTrafficProviderData?.IndividualMessages == true
30+
&& Body != null)
31+
{
32+
throw new Exception($"The SMS body is not empty but <{nameof(SmsTrafficProviderData.IndividualMessages)}> flag is set.");
33+
}
34+
else if (Body == null)
35+
{
36+
throw new ArgumentNullException(nameof(Body));
37+
}
38+
}
2639
}
2740
}
2841

src/Providers/Spoleto.SMS.SmsTraffic/Providers/SmsTrafficProvider.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ public async Task<SmsSendingResult> SendAsync(SmsTrafficMessage message, Cancell
199199
#endif
200200

201201
// Validate:
202-
phoneNumbers.ForEach(number => ValidateDataForSMS(number, message.Body, message.IsAllowSendToForeignNumbers));
202+
phoneNumbers.ForEach(number => ValidateDataForSMS(number, message));
203203

204204
var requestObject = ConvertToRequestObject(message);
205205
var json = JsonHelper.ToJson(requestObject);
@@ -515,11 +515,26 @@ protected override SmsTrafficMessage CreateMessage(SmsMessage originalMessage)
515515
return message;
516516
}
517517

518+
protected override void ValidateSmsMessage(SmsMessage smsMessage)
519+
{
520+
if (smsMessage is SmsTrafficMessage message)
521+
{
522+
if (message.SmsTrafficProviderData?.IndividualMessages == true
523+
&& smsMessage.Body != null)
524+
{
525+
throw new Exception($"The SMS body is not empty but <{nameof(message.SmsTrafficProviderData.IndividualMessages)}> flag is set.");
526+
}
527+
}
528+
529+
base.ValidateSmsMessage(smsMessage);
530+
}
531+
518532
private SmsTrafficRequest ConvertToRequestObject(SmsTrafficMessage smsTrafficMessage)
519533
{
520534
var additionalData = smsTrafficMessage.SmsTrafficProviderData;
521535
var rus = additionalData?.Rus.ToString() ?? Utf8Code;
522-
var message = rus == Utf8Code ? smsTrafficMessage.Body : System.Web.HttpUtility.UrlEncode(smsTrafficMessage.Body, _windows1251Encoding);
536+
var message = string.IsNullOrEmpty(smsTrafficMessage.Body) ? null
537+
: rus == Utf8Code ? smsTrafficMessage.Body : System.Web.HttpUtility.UrlEncode(smsTrafficMessage.Body, _windows1251Encoding);
523538
var isToGroup = smsTrafficMessage.To.Any(char.IsLetter);
524539

525540
return new SmsTrafficRequest

src/Providers/Spoleto.SMS.Smsc/Providers/SmscProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ public override SmsSendingResult Send(SmsMessage message)
9292
// Validate:
9393
#if NET5_0_OR_GREATER
9494
smscMessage.To.Split(smscMessage.PhoneNumberSeparator, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
95-
.ForEach(number => ValidateDataForSMS(number, smscMessage.Body, smscMessage.IsAllowSendToForeignNumbers));
95+
.ForEach(number => ValidateDataForSMS(number, smscMessage));
9696
#else
9797
smscMessage.To.Split(smscMessage.PhoneNumberSeparator)
98-
.ForEach(number => ValidateDataForSMS(number, smscMessage.Body, smscMessage.IsAllowSendToForeignNumbers));
98+
.ForEach(number => ValidateDataForSMS(number, smscMessage));
9999
#endif
100100

101101
var result = send_sms(smscMessage.To, smscMessage.Body, sender: smscMessage.From);
@@ -114,10 +114,10 @@ public override async Task<SmsSendingResult> SendAsync(SmsMessage message, Cance
114114
// Validate:
115115
#if NET5_0_OR_GREATER
116116
smscMessage.To.Split(smscMessage.PhoneNumberSeparator, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
117-
.ForEach(number => ValidateDataForSMS(number, smscMessage.Body, smscMessage.IsAllowSendToForeignNumbers));
117+
.ForEach(number => ValidateDataForSMS(number, smscMessage));
118118
#else
119119
smscMessage.To.Split(smscMessage.PhoneNumberSeparator)
120-
.ForEach(number => ValidateDataForSMS(number, smscMessage.Body, smscMessage.IsAllowSendToForeignNumbers));
120+
.ForEach(number => ValidateDataForSMS(number, smscMessage));
121121
#endif
122122

123123
var result = await send_smsAsync(smscMessage.To, smscMessage.Body, sender: smscMessage.From).ConfigureAwait(false);

src/Spoleto.SMS/Models/SmsMessage.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ public record SmsMessage : ISmsMessage
1010
/// </summary>
1111
public SmsMessage(string body, string? from, string to, bool isAllowSendToForeignNumbers = false, List<SmsProviderData>? providerData = null)
1212
{
13-
Body = body ?? throw new ArgumentNullException(nameof(body));
13+
Body = body;
1414
To = to ?? throw new ArgumentNullException(nameof(to));
1515
IsAllowSendToForeignNumbers = isAllowSendToForeignNumbers;
1616
From = from;
1717
ProviderData = providerData ?? [];
18+
19+
Validate();
1820
}
1921

2022
/// <summary>
@@ -25,7 +27,7 @@ public SmsMessage(string body, string? from, List<string> listOfTo, bool isAllow
2527
if (listOfTo == null)
2628
throw new ArgumentNullException(nameof(listOfTo));
2729

28-
Body = body ?? throw new ArgumentNullException(nameof(body));
30+
Body = body;
2931
To =
3032
#if NET5_0_OR_GREATER
3133
string.Join(PhoneNumberSeparator, listOfTo);
@@ -35,6 +37,8 @@ public SmsMessage(string body, string? from, List<string> listOfTo, bool isAllow
3537
IsAllowSendToForeignNumbers = isAllowSendToForeignNumbers;
3638
From = from;
3739
ProviderData = providerData ?? [];
40+
41+
Validate();
3842
}
3943

4044
/// <summary>
@@ -82,5 +86,13 @@ public SmsMessage WithProviderData(string name, object value)
8286
/// </summary>
8387
/// <param name="from">The sender phone number or another ID.</param>
8488
public void SetFrom(string from) => From = from;
89+
90+
protected virtual void Validate()
91+
{
92+
if (Body == null)
93+
{
94+
throw new ArgumentNullException(nameof(Body));
95+
}
96+
}
8597
}
8698
}

src/Spoleto.SMS/Providers/SmsProviderBase.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,11 @@ public virtual bool CanSend(string phoneNumber, bool isAllowSendToForeignNumbers
4343
/// <inheritdoc/>
4444
public abstract Task<SmsStatusResult> GetStatusAsync(string id, string? phoneNumber, CancellationToken cancellationToken = default);
4545

46-
protected void ValidateDataForSMS(string phoneNumber, string smsMessage, bool isAllowSendToForeignNumbers = false)
46+
protected void ValidateDataForSMS(string phoneNumber, SmsMessage smsMessage)
4747
{
48-
ValidatePhoneNumber(phoneNumber, isAllowSendToForeignNumbers);
49-
50-
if (string.IsNullOrWhiteSpace(smsMessage))
51-
{
52-
throw new SmsBodyIsNullException("The SMS body is empty.");
53-
}
48+
ValidatePhoneNumber(phoneNumber, smsMessage.IsAllowSendToForeignNumbers);
49+
50+
ValidateSmsMessage(smsMessage);
5451
}
5552

5653
protected virtual void ValidatePhoneNumber(string phoneNumber, bool isAllowSendToForeignNumbers = false)
@@ -64,6 +61,14 @@ protected virtual void ValidatePhoneNumber(string phoneNumber, bool isAllowSendT
6461
}
6562
}
6663

64+
protected virtual void ValidateSmsMessage(SmsMessage smsMessage)
65+
{
66+
if (string.IsNullOrWhiteSpace(smsMessage.Body))
67+
{
68+
throw new SmsBodyIsNullException("The SMS body is empty.");
69+
}
70+
}
71+
6772
protected static string CleanPhoneNumber(string phoneNumber)
6873
{
6974
phoneNumber = phoneNumber.Replace("(", "").Replace(")", "").Replace(" ", "").Replace("-", "").Replace("+", "");

0 commit comments

Comments
 (0)