Skip to content

Commit

Permalink
Changes
Browse files Browse the repository at this point in the history
  • Loading branch information
firesharkstudios committed Nov 19, 2019
1 parent 60422ee commit 8b66e4c
Show file tree
Hide file tree
Showing 19 changed files with 105 additions and 917 deletions.
2 changes: 1 addition & 1 deletion Butterfly.Message.Aws/Butterfly.Message.Aws.csproj
Expand Up @@ -12,7 +12,7 @@
<Authors>Kent Johnson</Authors>
<Copyright>Copyright 2017-2019 Fireshark Studios, LLC</Copyright>
<Description>Implementation of Butterfly.Message for AWS Simple Email Service</Description>
<Version>2.0.6</Version>
<Version>2.0.7</Version>
<PackageReleaseNotes>Various improvements and bug fixes</PackageReleaseNotes>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(MSBuildProjectName).xml</DocumentationFile>
<LangVersion>7.1</LangVersion>
Expand Down
2 changes: 1 addition & 1 deletion Butterfly.Message.Twilio/Butterfly.Message.Twilio.csproj
Expand Up @@ -12,7 +12,7 @@
<Authors>Kent Johnson</Authors>
<Copyright>Copyright 2017-2019 Fireshark Studios, LLC</Copyright>
<Description>Implementation of Butterfly.Message for Twilio SMS</Description>
<Version>2.0.6</Version>
<Version>2.0.7</Version>
<PackageReleaseNotes>Various improvements and bug fixes</PackageReleaseNotes>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(MSBuildProjectName).xml</DocumentationFile>
<LangVersion>7.1</LangVersion>
Expand Down
2 changes: 1 addition & 1 deletion Butterfly.Message/Butterfly.Message.csproj
Expand Up @@ -11,7 +11,7 @@
<Company>Fireshark Studios, LLC</Company>
<Product>Butterfly.Message</Product>
<Copyright>Copyright 2017-2019 Fireshark Studios, LLC</Copyright>
<Version>2.0.6</Version>
<Version>2.0.7</Version>
<PackageReleaseNotes>Various improvements and bug fixes</PackageReleaseNotes>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(MSBuildProjectName).xml</DocumentationFile>
<LangVersion>7.1</LangVersion>
Expand Down
109 changes: 10 additions & 99 deletions Butterfly.Message/SendMessageQueueManager.cs
Expand Up @@ -32,29 +32,15 @@ public class SendMessageQueueManager {
protected readonly SendMessageEngine textSendMessageEngine;

protected readonly string sendMessageTableName;
protected readonly string sendVerifyTableName;
protected readonly int verifyCodeExpiresSeconds;

protected readonly SendMessage verifyEmailSendMessage;
protected readonly SendMessage verifyTextSendMessage;
protected readonly string verifyCodeFormat;

protected readonly static EmailFieldValidator EMAIL_FIELD_VALIDATOR = new EmailFieldValidator("email", false, true);
protected readonly static PhoneFieldValidator PHONE_FIELD_VALIDATOR = new PhoneFieldValidator("phone", false);

protected readonly static Random RANDOM = new Random();

public SendMessageQueueManager(IDatabase database, IMessageSender emailMessageSender = null, IMessageSender textMessageSender = null, string sendMessageTableName = "send_message", string sendVerifyTableName = "send_verify", int verifyCodeExpiresSeconds = 3600, SendMessage verifyEmailSendMessage = null, SendMessage verifyTextSendMessage = null, string verifyCodeFormat = "###-###") {
public SendMessageQueueManager(IDatabase database, IMessageSender emailMessageSender = null, IMessageSender textMessageSender = null, string sendMessageTableName = "send_message") {
this.database = database;
this.emailSendMessageEngine = emailMessageSender == null ? null : new SendMessageEngine(SendMessageType.Email, emailMessageSender, database, sendMessageTableName);
this.textSendMessageEngine = textMessageSender == null ? null : new SendMessageEngine(SendMessageType.Text, textMessageSender, database, sendMessageTableName);
this.sendMessageTableName = sendMessageTableName;
this.sendVerifyTableName = sendVerifyTableName;
this.verifyCodeExpiresSeconds = verifyCodeExpiresSeconds;

this.verifyEmailSendMessage = verifyEmailSendMessage;
this.verifyTextSendMessage = verifyTextSendMessage;
this.verifyCodeFormat = verifyCodeFormat;
}

public void Start() {
Expand All @@ -67,90 +53,6 @@ public class SendMessageQueueManager {
this.textSendMessageEngine?.Stop();
}

public async Task SendVerifyCodeAsync(string contact) {
logger.Debug($"SendVerifyCodeAsync():contact={contact}");

// Scrub contact
string scrubbedContact = Validate(contact);
logger.Debug($"SendVerifyCodeAsync():scrubbedContact={scrubbedContact}");

// Generate code and expires at
int digits = this.verifyCodeFormat.Count(x => x=='#');
int min = (int)Math.Pow(10, digits - 1);
int max = (int)Math.Pow(10, digits) - 1;
int code = RANDOM.Next(0, max - min) + min;
logger.Debug($"SendVerifyCodeAsync():digits={digits},min={min},max={max},code={code}");
DateTime expiresAt = DateTime.Now.AddSeconds(this.verifyCodeExpiresSeconds);

// Insert/update database
string id = await this.database.SelectValueAsync<string>($"SELECT id FROM {this.sendVerifyTableName}", new {
contact = scrubbedContact
});

using (ITransaction transaction = await this.database.BeginTransactionAsync()) {
if (id == null) {
await transaction.InsertAsync<string>(this.sendVerifyTableName, new {
contact = scrubbedContact,
verify_code = code,
expires_at = expiresAt,
});
}
else {
await transaction.UpdateAsync(this.sendVerifyTableName, new {
id,
verify_code = code,
expires_at = expiresAt,
});
}

// Send message
var sendMessageType = DetectSendMessageType(scrubbedContact);
SendMessage sendMessage = null;
switch (sendMessageType) {
case SendMessageType.Email:
if (this.verifyEmailSendMessage == null) throw new Exception("Server must be configured with verify email send message");
sendMessage = this.verifyEmailSendMessage;
break;
case SendMessageType.Text:
if (this.verifyTextSendMessage == null) throw new Exception("Server must be configured with verify text send message");
sendMessage = this.verifyTextSendMessage;
break;
}
var evaluatedSendMessage = sendMessage.Evaluate(new {
contact = scrubbedContact,
code = code.ToString(this.verifyCodeFormat)
});
await this.Queue(transaction, evaluatedSendMessage);

await transaction.CommitAsync();
}
}

public async Task<string> VerifyAsync(string contact, int code) {
logger.Debug($"VerifyAsync():contact={contact},code={code}");
string scrubbedContact = Validate(contact);
Dict result = await this.database.SelectRowAsync($"SELECT verify_code, expires_at FROM {this.sendVerifyTableName}", new {
contact = scrubbedContact
});
int verifyCode = result.GetAs("verify_code", -1);
if (code == -1 || code!=verifyCode) throw new Exception("Invalid contact and/or verify code");

int expiresAtUnix = result.GetAs("expires_at", -1);
if (DateTimeX.FromUnixTimestamp(expiresAtUnix) < DateTime.Now) throw new Exception("Expired verify code");

return scrubbedContact;
}

protected static string Validate(string value) {
logger.Debug($"Validate():value={value}");
if (value.Contains("@")) {
return EMAIL_FIELD_VALIDATOR.Validate(value);
}
else {
return PHONE_FIELD_VALIDATOR.Validate(value);
}
}

/// <summary>
///
/// </summary>
Expand Down Expand Up @@ -302,5 +204,14 @@ protected class SendMessageEngine {
}
}
}
protected static string Validate(string value) {
logger.Debug($"Validate():value={value}");
if (value.Contains("@")) {
return EMAIL_FIELD_VALIDATOR.Validate(value);
}
else {
return PHONE_FIELD_VALIDATOR.Validate(value);
}
}
}
}
10 changes: 1 addition & 9 deletions docfx_project/api/.manifest
Expand Up @@ -49,15 +49,14 @@
"Butterfly.Message.SendMessageFileParser.evaluatorByExtension": "Butterfly.Message.SendMessageFileParser.yml",
"Butterfly.Message.SendMessageFileParser.Parse(System.String)": "Butterfly.Message.SendMessageFileParser.yml",
"Butterfly.Message.SendMessageQueueManager": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.#ctor(Butterfly.Db.IDatabase,Butterfly.Message.IMessageSender,Butterfly.Message.IMessageSender,System.String,System.String,System.Int32,Butterfly.Message.SendMessage,Butterfly.Message.SendMessage,System.String)": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.#ctor(Butterfly.Db.IDatabase,Butterfly.Message.IMessageSender,Butterfly.Message.IMessageSender,System.String)": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.database": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.DetectSendMessageType(System.String)": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.EMAIL_FIELD_VALIDATOR": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.emailSendMessageEngine": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.logger": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.PHONE_FIELD_VALIDATOR": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.Queue(Butterfly.Db.ITransaction,Butterfly.Message.SendMessage[])": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.RANDOM": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.SendMessageEngine": "Butterfly.Message.SendMessageQueueManager.SendMessageEngine.yml",
"Butterfly.Message.SendMessageQueueManager.SendMessageEngine.#ctor(Butterfly.Message.SendMessageType,Butterfly.Message.IMessageSender,Butterfly.Db.IDatabase,System.String)": "Butterfly.Message.SendMessageQueueManager.SendMessageEngine.yml",
"Butterfly.Message.SendMessageQueueManager.SendMessageEngine.cancellationTokenSource": "Butterfly.Message.SendMessageQueueManager.SendMessageEngine.yml",
Expand All @@ -71,17 +70,10 @@
"Butterfly.Message.SendMessageQueueManager.SendMessageEngine.started": "Butterfly.Message.SendMessageQueueManager.SendMessageEngine.yml",
"Butterfly.Message.SendMessageQueueManager.SendMessageEngine.Stop": "Butterfly.Message.SendMessageQueueManager.SendMessageEngine.yml",
"Butterfly.Message.SendMessageQueueManager.sendMessageTableName": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.SendVerifyCodeAsync(System.String)": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.sendVerifyTableName": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.Start": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.Stop": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.textSendMessageEngine": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.Validate(System.String)": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.VerifyAsync(System.String,System.Int32)": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.verifyCodeExpiresSeconds": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.verifyCodeFormat": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.verifyEmailSendMessage": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageQueueManager.verifyTextSendMessage": "Butterfly.Message.SendMessageQueueManager.yml",
"Butterfly.Message.SendMessageType": "Butterfly.Message.SendMessageType.yml",
"Butterfly.Message.SendMessageType.Email": "Butterfly.Message.SendMessageType.yml",
"Butterfly.Message.SendMessageType.Text": "Butterfly.Message.SendMessageType.yml",
Expand Down
2 changes: 0 additions & 2 deletions docfx_project/api/Butterfly.Message.BaseMessageSender.yml
Expand Up @@ -33,9 +33,7 @@ items:
content: 'public abstract class BaseMessageSender : object, IMessageSender'
content.vb: >-
Public MustInherit Class BaseMessageSender
Inherits Object
Implements IMessageSender
inheritance:
- System.Object
Expand Down
1 change: 0 additions & 1 deletion docfx_project/api/Butterfly.Message.ScribanEvaluator.yml
Expand Up @@ -29,7 +29,6 @@ items:
content: 'public static class ScribanEvaluator : object'
content.vb: >-
Public Module ScribanEvaluator
Inherits Object
inheritance:
- System.Object
Expand Down
1 change: 0 additions & 1 deletion docfx_project/api/Butterfly.Message.SendMessage.yml
Expand Up @@ -43,7 +43,6 @@ items:
content: 'public class SendMessage : object'
content.vb: >-
Public Class SendMessage
Inherits Object
inheritance:
- System.Object
Expand Down
Expand Up @@ -30,7 +30,6 @@ items:
content: 'public class SendMessageFileParser : object'
content.vb: >-
Public Class SendMessageFileParser
Inherits Object
inheritance:
- System.Object
Expand Down
Expand Up @@ -30,15 +30,14 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: SendMessageEngine
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 200
startLine: 102
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
syntax:
content: 'protected class SendMessageEngine : object'
content.vb: >-
Protected Class SendMessageEngine
Inherits Object
inheritance:
- System.Object
Expand Down Expand Up @@ -66,7 +65,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: sendMessageType
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 201
startLine: 103
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -99,7 +98,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: sendMessageSender
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 202
startLine: 104
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -132,7 +131,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: database
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 203
startLine: 105
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -165,7 +164,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: sendMessageTableName
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 204
startLine: 106
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -198,7 +197,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: cancellationTokenSource
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 206
startLine: 108
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -229,7 +228,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: .ctor
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 208
startLine: 110
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -268,7 +267,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: started
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 215
startLine: 117
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -299,7 +298,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: Start
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 217
startLine: 119
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -329,7 +328,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: Stop
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 223
startLine: 125
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -359,7 +358,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: Queue
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 228
startLine: 130
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down Expand Up @@ -411,7 +410,7 @@ items:
repo: https://github.com/firesharkstudios/butterfly-message.git
id: Pulse
path: ../Butterfly.Message/SendMessageQueueManager.cs
startLine: 243
startLine: 145
assemblies:
- Butterfly.Message
namespace: Butterfly.Message
Expand Down

0 comments on commit 8b66e4c

Please sign in to comment.