public async Task <IActionResult> Test(
            TestTemplateViewModel model,
            [FromServices] IEmailQueueBlobStore blobStore,
            [FromServices] IEmailQueueSender emailSender,
            CancellationToken cancellationToken)
        {
            if (ModelState.IsValid)
            {
                var token = EmailQueueToken.Create(model.ApplicationId);
                var param = new EmailMessageParams
                {
                    ApplicationId = model.ApplicationId,
                    TemplateId    = model.TemplateId,
                    To            = new List <string> {
                        model.EmailAddress
                    },
                    Culture = model.Language,
                    Data    = JObject.Parse(model.SampleData).ToObject <Dictionary <string, object> >()
                };

                await blobStore.AddAsync(token, param, cancellationToken);

                await emailSender.SendAsync(token, cancellationToken);

                Response.StatusCode = (int)HttpStatusCode.Accepted;
                return(RedirectToAction(nameof(Details), new { id = model.TemplateId }));
            }

            // TODO: reload translations
            return(View(model));
        }
Ejemplo n.º 2
0
        public void DecodeBytes_ShouldDeserializeValidByteArray()
        {
            // arrange
            var original = EmailQueueToken.Create(Application1);
            var bytes    = original.EncodeBytes();

            // act
            var decoded = EmailQueueToken.DecodeBytes(bytes);

            // assert
            Assert.Equal(original.TimeStamp, decoded.TimeStamp);
            Assert.Equal(original.RequestId, decoded.RequestId);
        }
Ejemplo n.º 3
0
        public void EncodeBytes_ShouldReturnByteArrayOfCorrectLength()
        {
            // arrange
            int expected = ExpectedByteLength;
            int actual;
            var token = EmailQueueToken.Create(Application1);

            // act
            actual = token.EncodeBytes().Length;

            // assert
            Assert.Equal(expected, actual);
        }
Ejemplo n.º 4
0
        public void DecodeBytes_ShouldDeserializeValidString()
        {
            // arrange
            var original = EmailQueueToken.Create(Application1);
            var base64   = original.EncodeString();

            // act
            var decoded = EmailQueueToken.DecodeString(base64);

            // assert
            Assert.Equal(original.TimeStamp, decoded.TimeStamp);
            Assert.Equal(original.ApplicationId, decoded.ApplicationId);
            Assert.Equal(original.RequestId, decoded.RequestId);
        }
Ejemplo n.º 5
0
        public async Task ProcessMessage_Should_CompleteMessage_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _receiver.Verify(t => t.CompleteAsync(message, token), Times.Once());
        }
Ejemplo n.º 6
0
        public async Task ProcessMessage_ShouldNot_SendEmail_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _transport.Verify(t => t.SendAsync(It.IsAny <SenderParams>()), Times.Never());
        }
Ejemplo n.º 7
0
        public async Task <IActionResult> Post(
            [FromForm] PostEmailRequest args,
            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var applicationId = User.GetApplicationId();

            // the token will be used by both the processing engine and the
            // client to track this request from start to finish
            var token = EmailQueueToken.Create(applicationId);

            _logger.LogInformation("Sending email using token {0}", token);

            if (ModelState.IsValid)
            {
                // create an object that we then store as a BLOB (emails run
                // the risk of being too large to fit in the queue, so BLOB
                // storage is the best option)
                var message = BuildMessage(args);
                message.ApplicationId = applicationId;
                await _blobStore.AddAsync(token, message, cancellationToken);

                // now we can let the back-end processor know that there's a
                // new message that it has to process
                await _sender.SendAsync(token, cancellationToken);

                // log that we queued the message for processing
                await _logWriter.TryLogProcessAttemptAsync(token, 0, ProcessingStatus.Pending, token.TimeStamp, token.TimeStamp, null, cancellationToken);

                // all done - let the client know that we've accepted their
                // request, and what the tracking token is
                Response.StatusCode = (int)HttpStatusCode.Accepted;
                return(Json(new
                {
                    Token = token.EncodeString()
                }));
            }
            else
            {
                return(BadRequest(ModelState));
            }
        }
Ejemplo n.º 8
0
        public async Task ProcessMessage_ShouldNot_LogMessageSent_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _logWriter.Verify(t => t.TryLogSentMessageAsync(
                                  It.IsAny <EmailQueueToken>(),
                                  It.IsAny <SentEmailInfo>(),
                                  token),
                              Times.Never());
        }
Ejemplo n.º 9
0
        public async Task ProcessMessage_Should_MoveMessageToPoisonQueue_IfMaxDequeueReached()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage
            {
                Token        = EmailQueueToken.Create(Guid.NewGuid()),
                DequeueCount = 10
            };

            _transport.Setup(t => t.SendAsync(It.IsAny <SenderParams>()))
            .ThrowsAsync(new Exception("Could not send email"));

            _blobStore.Setup(b => b.GetAsync(message.Token, token))
            .ReturnsAsync(new EmailMessageParams());

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _receiver.Verify(r => r.MoveToPoisonQueueAsync(message, token));
            _blobStore.Verify(r => r.MoveToPoisonStoreAsync(message.Token, token));
        }