public ActionResult Index(InviteCommand command)
        {
            //TODO: validate
            try
            {
                var loggedInMember = _members.FindLoggedInMember();

                var invite = new Invitation();
                invite.FullName = command.FullName;
                invite.Email = command.Email;
                invite.LinkedIn = command.LinkedIn;
                invite.GitHub = command.GitHub;
                invite.Testimonial = command.Testimonial;
                invite.VouchedBy = loggedInMember.Id;

                _session.Store(invite);

                loggedInMember.AddInvitation(invite.Id);

                _session.SaveChanges();

                //TODO: publish event
                _email.SendInvitationToGroup(invite, loggedInMember.UserName);
                invite.Pending();
             				_session.SaveChanges(); //in the short run, this will give us a heads up if the mandril send is failing

                return RedirectToAction("Ok");
            }
            catch (Exception)
            {
                ModelState.AddModelError("", "error");
                return View(command);
            }
        }
        public void WehnPendingIsCalledStatusIsSetToPending()
        {
            var sut = new Invitation();

            sut.Pending();

            Assert.AreEqual(Invitation.Statuses.Pending, sut.Status);
        }
        public void CannotSetToPendingTwice()
        {
            var sut = new Invitation();

            sut.Pending();

            Assert.Throws<ApplicationException>(sut.Pending, "pending twice");
        }
        public void WhenAcceptIsCalledStatusIsSetToAccepted()
        {
            var sut = new Invitation();

            sut.Pending();
            sut.Accept();

            Assert.AreEqual(Invitation.Statuses.Accepted, sut.Status);
        }
 public void SendInvitationToGroup(Invitation invitation, string vouched)
 {
     var api = new MandrillApi(_configuration.MadrillApiKey);
     var result = api.SendMessage(
         new EmailMessage()
         {
             to =
                 new List<EmailAddress>()
                 {
                     new EmailAddress {email = _configuration.MadrillOriginTarget}
                 },
             subject = invitation.FullName
         },
         "devlink-submit-invitation",
         new List<TemplateContent>()
         {
             new TemplateContent() {name = "candidate", content = invitation.FullName},
             new TemplateContent() {name = "linkedin", content = invitation.LinkedIn},
             new TemplateContent() {name = "github", content = invitation.GitHub},
             new TemplateContent() {name = "vouchedby", content = vouched},
             new TemplateContent() {name = "testimonal", content = invitation.Testimonial}
         });
 }
        public void WorksProperly()
        {
            var notification = new Mock<IEmailNotificationService>();
            var authentication = new Mock<IAuthentication>();

            using (var store = NewDocumentStore())
            {
                string token;

                using (var session = store.OpenSession())
                {
                    var member = new Member();
                    member.UserName = "******";
                    session.Store(member);

                    var invitation = new Invitation
                    {
                        FullName = "jane.doe",
                        Email = "*****@*****.**",
                        GitHub = "github/janedoe",
                        LinkedIn = "linkedin/janedoe",
                        Testimonial = "awesome",
                        VouchedBy = member.Id,
                        Status = Invitation.Statuses.Pending
                    };
                    token = invitation.Token;
                    session.Store(invitation);

                    member.AddInvitation(invitation.Id);

                    session.SaveChanges();
                }

                using (var session = store.OpenSession())
                {
                    var command = new InvitationAcceptanceController.InvitationAcceptanceCommand
                    {
                        Password = "******",
                        Token = token,
                        UserName = "******"
                    };

                    var sut = new InvitationAcceptanceController(session, notification.Object, authentication.Object);
                    sut.Index(command);
                }

                using (var session = store.OpenSession())
                {
                    var john = session.Load<Member>(Member.FormatId("john.doe"));
                    var jane = session
                        .Include<Member>(x => x.Identifiers)
                        .Load<Member>(Member.FormatId("jane.doe"));
                    var identifiers = session.Load<Identifier>(jane.Identifiers).ToList();

                    var invitation = session.Load<Invitation>(Invitation.FormatId(token));

                    Assert.AreEqual(0, john.Invitations.Count);
                    Assert.AreEqual(2, identifiers.Count);
                    Assert.AreEqual(Invitation.Statuses.Accepted, invitation.Status);

                    notification.Verify(x => x.SendAcceptanceNotificationToGroup(It.IsAny<Member>()), Times.Once);
                    authentication.Verify(x => x.Login(Member.FormatId("jane.doe")), Times.Once);
                }
            }
        }