diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Controllers/BoardController.cs b/src/Services/e-sender/O2NextGen.ESender.Api/Controllers/BoardController.cs index c7ac334a..07f2cb37 100644 --- a/src/Services/e-sender/O2NextGen.ESender.Api/Controllers/BoardController.cs +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Controllers/BoardController.cs @@ -43,7 +43,7 @@ public async Task Detail(long id) [HttpPost] [Route("id")] [ValidateAntiForgeryToken] - public async Task Edit(long id, MailRequestViewModel model) + public async Task Edit(long id, EmailRequestViewModel model) { var certificate = await _emailSenderService.GetByIdAsync(id, CancellationToken.None); if (certificate == null) @@ -65,7 +65,7 @@ public IActionResult Create() [HttpPost] [Route("")] - public async Task CreateReally(MailRequestViewModel model) + public async Task CreateReally(EmailRequestViewModel model) { var emailRequest = await _emailSenderService.AddAsync(model.ToModel(), CancellationToken.None); await _emailSender.Send(model.To, model.Subject, model.Body); diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Controllers/EmailSenderController.cs b/src/Services/e-sender/O2NextGen.ESender.Api/Controllers/EmailSenderController.cs index fb7109b1..af4be29f 100644 --- a/src/Services/e-sender/O2NextGen.ESender.Api/Controllers/EmailSenderController.cs +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Controllers/EmailSenderController.cs @@ -50,7 +50,7 @@ public async Task GetByIdAsync(long id, CancellationToken ct) [HttpPut] [Route("id")] - public async Task UpdateAsync(long id, [FromBody]MailRequestViewModel model, CancellationToken ct) + public async Task UpdateAsync(long id, [FromBody]EmailRequestViewModel model, CancellationToken ct) { var certificate = await _emailSenderService.UpdateAsync(model.ToModel(), ct); return Ok(certificate.ToViewModel()); @@ -59,7 +59,7 @@ public async Task UpdateAsync(long id, [FromBody]MailRequestViewM [HttpPost] [HttpPut] [Route("")] - public async Task AddAsync([FromBody]MailRequestViewModel model, CancellationToken ct) + public async Task AddAsync([FromBody]EmailRequestViewModel model, CancellationToken ct) { var emailRequest = await _emailSenderService.AddAsync(model.ToModel(), ct); await _emailSender.Send(model.To, model.Subject, model.Body); diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Extensions/KeyGenerator.cs b/src/Services/e-sender/O2NextGen.ESender.Api/Extensions/KeyGenerator.cs new file mode 100644 index 00000000..865b3241 --- /dev/null +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Extensions/KeyGenerator.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; + +namespace O2NextGen.ESender.Api.Extensions +{ + public static class KeyGenerator + { + // private const string ValidChars = "abcdefghjkmnprstwxz2345789"; // Letters and numbers that are not easily mixed with others when reading + private const string ValidChars = "ABCDEFHJKLMNPRSTUWXYZ012345789"; + private static readonly Dictionary ValidCharLookup = new Dictionary(); + private static readonly Random Rnd = new Random(); + + static KeyGenerator() + { + // Set up a quick lookup dictionary for all valid characters + foreach (var c in ValidChars.ToUpperInvariant()) + ValidCharLookup.Add(c, true); + } + + public static string Generate(int length) + { + var ret = new char[length]; + for (var i = 0; i < length; i++) + { + int c; + lock (Rnd) + { + c = Rnd.Next(0, ValidChars.Length); + } + + ret[i] = ValidChars[c]; + } + + return new string(ret); + } + + public static bool Validate(int maxLength, string key) + { + if (key.Length > maxLength) + return false; + + foreach (var c in key.ToUpperInvariant()) + if (!ValidCharLookup.ContainsKey(c)) + return false; + return true; + } + } +} \ No newline at end of file diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Extensions/UnixDateExtensions.cs b/src/Services/e-sender/O2NextGen.ESender.Api/Extensions/UnixDateExtensions.cs new file mode 100644 index 00000000..d88f3a27 --- /dev/null +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Extensions/UnixDateExtensions.cs @@ -0,0 +1,20 @@ +using System; + +namespace O2NextGen.ESender.Api.Extensions +{ + public static class UnixDateExtensions + { + private static readonly DateTime UnixEpoch = + new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime(); + + public static DateTime ConvertToDateTime(this long seconds, bool isSeconds = true) + { + return isSeconds ? UnixEpoch.AddSeconds(seconds) : UnixEpoch.AddMinutes(seconds); + } + + public static long ConvertToUnixTime(this DateTime datetime, bool isSeconds = true) + { + return isSeconds ? (long)(datetime - UnixEpoch).TotalSeconds : (long)(datetime - UnixEpoch).TotalMinutes; + } + } +} \ No newline at end of file diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Mappings/BaseMappings.cs b/src/Services/e-sender/O2NextGen.ESender.Api/Mappings/BaseMappings.cs new file mode 100644 index 00000000..83a77898 --- /dev/null +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Mappings/BaseMappings.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using O2NextGen.ESender.Api.Extensions; +using O2NextGen.ESender.Api.Models; +using O2NextGen.ESender.Business.Models; + +namespace O2NextGen.ESender.Api.Mappings +{ + public class BaseMappings + where TViewModel : class, IViewModel + where TModel : class, IBaseModel + { + public TViewModel ToViewModel(TModel model) + { + if (model == null) + return null; + + var returnViewModel = Activator.CreateInstance(); + + returnViewModel.Id = model.Id; + returnViewModel.ExternalId = model.ExternalId; + returnViewModel.AddedDate = model.AddedDate; + returnViewModel.ModifiedDate = model.ModifiedDate; + returnViewModel.DeletedDate = model.DeletedDate; + returnViewModel.IsDeleted = model.IsDeleted; + + return returnViewModel; + } + + public TModel ToServiceModel(TViewModel viewModel) + { + //Todo: return not null + if (viewModel == null) + return null; + + var model = Activator.CreateInstance(); + + model.Id = viewModel.Id; + model.ExternalId = viewModel.ExternalId; + model.AddedDate = viewModel.AddedDate ?? default(long); + model.ModifiedDate = viewModel.ModifiedDate ?? default(long); + model.DeletedDate = viewModel.DeletedDate ?? DateTime.Now.ConvertToUnixTime(); + model.IsDeleted = viewModel.IsDeleted ?? default(bool); + + return model; + } + + public IReadOnlyCollection ToViewModel(IReadOnlyCollection models) + { + if (models.Count == 0) + { + return Array.Empty(); + } + + var subscription = new TViewModel[models.Count]; + var i = 0; + foreach (var model in models) + { + subscription[i] = ToViewModel(model); + ++i; + } + + return new ReadOnlyCollection(subscription); + } + } +} \ No newline at end of file diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Mappings/EmailRequestMappings.cs b/src/Services/e-sender/O2NextGen.ESender.Api/Mappings/EmailRequestMappings.cs index e2b0e6b8..c7871f8e 100644 --- a/src/Services/e-sender/O2NextGen.ESender.Api/Mappings/EmailRequestMappings.cs +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Mappings/EmailRequestMappings.cs @@ -8,15 +8,23 @@ namespace O2NextGen.ESender.Api.Mappings { public static class EmailRequestMappings { - public static MailRequestViewModel ToViewModel(this EmailRequest model) + private static readonly + BaseMappings BaseMappings; + + static EmailRequestMappings() + { + BaseMappings = + new BaseMappings(); + } + + public static EmailRequestViewModel ToViewModel(this EmailRequestModel model) { if (model == null) return null; - var viewModel = new MailRequestViewModel(); + var viewModel = BaseMappings.ToViewModel(model); //Bindings - viewModel.Id = model.Id; viewModel.From = model.From; viewModel.To = model.To; viewModel.Subject = model.Subject; @@ -25,32 +33,31 @@ public static MailRequestViewModel ToViewModel(this EmailRequest model) return viewModel; } - public static EmailRequest ToModel(this MailRequestViewModel requestViewModel) + public static EmailRequestModel ToModel(this EmailRequestViewModel viewModel) { - if (requestViewModel == null) + if (viewModel == null) return null; - var model = new EmailRequest(); + var model = BaseMappings.ToServiceModel(viewModel); //Bindings - model.Id = requestViewModel.Id; - model.From = requestViewModel.From; - model.To = requestViewModel.To; - model.Subject = requestViewModel.Subject; - model.Body = requestViewModel.Body; + model.From = viewModel.From; + model.To = viewModel.To; + model.Subject = viewModel.Subject; + model.Body = viewModel.Body; return model; } - public static IReadOnlyCollection ToViewModel( - this IReadOnlyCollection models) + public static IReadOnlyCollection ToViewModel( + this IReadOnlyCollection models) { if (models.Count == 0) { - return Array.Empty(); + return Array.Empty(); } - var subscription = new MailRequestViewModel[models.Count]; + var subscription = new EmailRequestViewModel[models.Count]; var i = 0; foreach (var model in models) { @@ -58,7 +65,23 @@ public static IReadOnlyCollection ToViewModel( ++i; } - return new ReadOnlyCollection(subscription); + return new ReadOnlyCollection(subscription); + } + + public static IReadOnlyCollection ToModel( + this IReadOnlyCollection models) + { + if (models.Count == 0) return Array.Empty(); + + var subscription = new EmailRequestModel[models.Count]; + var i = 0; + foreach (var model in models) + { + subscription[i] = ToModel(model); + ++i; + } + + return new ReadOnlyCollection(subscription); } } } \ No newline at end of file diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Models/EmailRequestViewModel.cs b/src/Services/e-sender/O2NextGen.ESender.Api/Models/EmailRequestViewModel.cs new file mode 100644 index 00000000..79cb5e9e --- /dev/null +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Models/EmailRequestViewModel.cs @@ -0,0 +1,27 @@ +using System; +namespace O2NextGen.ESender.Api.Models +{ + public interface IViewModel + { + long Id { get; set; } + string ExternalId { get; set; } + long? ModifiedDate { get; set; } + long? AddedDate { get; set; } + long? DeletedDate { get; set; } + bool? IsDeleted { get; set; } + } + public class EmailRequestViewModel: IViewModel + { + public long Id { get; set; } + public string ExternalId { get; set; } + public long? ModifiedDate { get; set; } + public long? AddedDate { get; set; } + public long? DeletedDate { get; set; } + public bool? IsDeleted { get; set; } + public string From { get; set; } + public string To { get; set; } + public string Body { get; set; } + public string Subject { get; set; } + } +} + diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Models/MailRequestViewModel.cs b/src/Services/e-sender/O2NextGen.ESender.Api/Models/MailRequestViewModel.cs deleted file mode 100644 index 23b38665..00000000 --- a/src/Services/e-sender/O2NextGen.ESender.Api/Models/MailRequestViewModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -namespace O2NextGen.ESender.Api.Models -{ - public class MailRequestViewModel - { - public long Id { get; set; } - public string From { get; set; } - public string To { get; set; } - public string Body { get; set; } - public string Subject { get; set; } - } -} - diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Create.cshtml b/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Create.cshtml index ae9c83ec..01a33fac 100644 --- a/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Create.cshtml +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Create.cshtml @@ -1,4 +1,4 @@ -@model MailRequestViewModel +@model EmailRequestViewModel
diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Detail.cshtml b/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Detail.cshtml index d4e189e3..fed1dda1 100644 --- a/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Detail.cshtml +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Detail.cshtml @@ -1,5 +1,5 @@  -@model MailRequestViewModel +@model EmailRequestViewModel diff --git a/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Index.cshtml b/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Index.cshtml index f5349c98..a8621047 100644 --- a/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Index.cshtml +++ b/src/Services/e-sender/O2NextGen.ESender.Api/Views/Board/Index.cshtml @@ -1,4 +1,4 @@ -@model IEnumerable +@model IEnumerable

E-Sender Service

Administration board v1.0.0.0