public IHttpActionResult Post(EmailAccountEntityModel entityModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            //create a new email account
            var emailAccount = new EmailAccount()
            {
                Id       = entityModel.Id,
                Email    = entityModel.Email,
                UserName = entityModel.UserName,
                FromName = entityModel.FromName,
                Host     = entityModel.Host,
                UseSsl   = entityModel.UseSsl,
                Port     = entityModel.Port,
                UseDefaultCredentials = entityModel.UseDefaultCredentials,
                Password = _cryptographyService.Encrypt(entityModel.Password)
            };

            //if this is the first account, we'll set it as default
            emailAccount.IsDefault = _emailAccountService.Count() == 0;

            //save it
            _emailAccountService.Insert(emailAccount);

            VerboseReporter.ReportSuccess("Successfully saved email account", "post_emailaccount");
            return(RespondSuccess(new {
                EmailAccount = emailAccount.ToEntityModel()
            }));
        }
        public static EmailAccountEntityModel ToEntityModel(this EmailAccount emailAccount)
        {
            var model = new EmailAccountEntityModel()
            {
                Id                    = emailAccount.Id,
                Email                 = emailAccount.Email,
                UserName              = emailAccount.UserName,
                FromName              = emailAccount.FromName,
                IsDefault             = emailAccount.IsDefault,
                Host                  = emailAccount.Host,
                UseSsl                = emailAccount.UseSsl,
                Port                  = emailAccount.Port,
                UseDefaultCredentials = emailAccount.UseDefaultCredentials
            };

            return(model);
        }
        public IHttpActionResult Put(EmailAccountEntityModel entityModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }
            //get the account
            var emailAccount = _emailAccountService.Get(entityModel.Id);

            if (emailAccount == null)
            {
                return(NotFound());
            }

            emailAccount.FromName              = entityModel.FromName;
            emailAccount.Host                  = entityModel.Host;
            emailAccount.IsDefault             = entityModel.IsDefault;
            emailAccount.Port                  = entityModel.Port;
            emailAccount.UseDefaultCredentials = entityModel.UseDefaultCredentials;
            emailAccount.UseSsl                = entityModel.UseSsl;
            emailAccount.UserName              = entityModel.UserName;
            emailAccount.Email                 = entityModel.Email;

            //we'll change password if it's provided
            if (!string.IsNullOrEmpty(entityModel.Password))
            {
                emailAccount.Password = _cryptographyService.Encrypt(entityModel.Password);
            }
            //save it
            _emailAccountService.Update(emailAccount);

            //if this is a default account now, update the previous one
            if (emailAccount.IsDefault)
            {
                var oldDefaultEmailAccount = _emailAccountService.FirstOrDefault(x => x.IsDefault && x.Id != emailAccount.Id);
                if (oldDefaultEmailAccount != null)
                {
                    oldDefaultEmailAccount.IsDefault = false;
                    _emailAccountService.Update(emailAccount);
                }
            }
            VerboseReporter.ReportSuccess("Successfully updated email account", "put_emailaccount");
            return(RespondSuccess(new {
                EmailAccount = emailAccount.ToEntityModel()
            }));
        }
        public IHttpActionResult TestEmail(EmailAccountEntityModel entityModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            const string contextName  = "post_testemail";
            var          emailAccount = new EmailAccount()
            {
                Id       = entityModel.Id,
                Email    = entityModel.Email,
                UserName = entityModel.UserName,
                FromName = entityModel.FromName,
                Host     = entityModel.Host,
                UseSsl   = entityModel.UseSsl,
                Port     = entityModel.Port,
                UseDefaultCredentials = entityModel.UseDefaultCredentials,
            };

            if (entityModel.Id != 0 && string.IsNullOrEmpty(entityModel.Password))
            {
                //a saved account is being tested, we'll need to retrieve the password from database to use appropriate password
                var savedEmailAccount = _emailAccountService.Get(entityModel.Id);
                if (savedEmailAccount != null)
                {
                    emailAccount.Password = savedEmailAccount.Password;
                }
            }
            else
            {
                emailAccount.Password = _cryptographyService.Encrypt(entityModel.Password);
            }

            var result = _emailSender.SendTestEmail(entityModel.TestEmail, emailAccount);

            return(result ? RespondSuccess("Successfully sent test email", contextName) : RespondFailure());
        }