public OperationResult <Model.BusinessEntities.PetitionEmailVote> ConfirmEmailVoteRequest(string hash)
        {
            OperationResult <Model.BusinessEntities.PetitionEmailVote> result;

            try
            {
                using (var db = new EDEntities())
                {
                    var emailVote = db.PetitionEmailVotes.SingleOrDefault(p => p.Hash == hash);

                    if (emailVote == default(PetitionEmailVote))
                    {
                        result = OperationResult <Model.BusinessEntities.PetitionEmailVote> .Fail(-3, "Петиція не знайдена.");

                        return(result);
                    }

                    if (emailVote.IsConfirmed)
                    {
                        result = OperationResult <Model.BusinessEntities.PetitionEmailVote> .Fail(-2, "Ви вже проголосували за цю петицію.");

                        return(result);
                    }

                    emailVote.IsConfirmed = true;
                    db.SaveChanges();

                    var emailVoteBusiness = new Model.BusinessEntities.PetitionEmailVote(emailVote);
                    emailVoteBusiness.Petition = new Model.BusinessEntities.Petition(db.Petitions.SingleOrDefault(p => p.ID == emailVote.PetitionID));
                    result = OperationResult <Model.BusinessEntities.PetitionEmailVote> .Success(1, "Ви успішно проголосували за петицію.", emailVoteBusiness);
                }
            }
            catch (Exception ex)
            {
                result = OperationResult <Model.BusinessEntities.PetitionEmailVote> .Fail(-1, ex.Message);
            }

            return(result);
        }
        public OperationResult <Model.BusinessEntities.PetitionEmailVote> CreateEmailVoteRequest(EmailVote vote)
        {
            OperationResult <Model.BusinessEntities.PetitionEmailVote> emailVoteRequestResult;

            Func <EDEntities, OperationResult <Model.BusinessEntities.PetitionEmailVote> > procedure = (db) =>
            {
                OperationResult <Model.BusinessEntities.PetitionEmailVote> result;

                var emailVote = db.PetitionEmailVotes.SingleOrDefault(v => v.PetitionID == vote.ID && v.Email == vote.Email);

                if (emailVote != null)
                {
                    var votedPetition = db.Petitions.SingleOrDefault(p => p.ID == vote.ID);
                    result = emailVote.IsConfirmed
                                                ? OperationResult <Model.BusinessEntities.PetitionEmailVote> .Fail(
                        int.Parse(PetitionVoteOperationResult.AlreadyVotedCode),
                        PetitionVoteOperationResult.AlreadyVotedMessage)
                                                : OperationResult <Model.BusinessEntities.PetitionEmailVote> .Success(
                        int.Parse(PetitionVoteOperationResult.WaitingConfirmationCode),
                        string.Format(PetitionVoteOperationResult.WaitingConfirmationMessage, emailVote.Email),
                        new Model.BusinessEntities.PetitionEmailVote(emailVote, votedPetition));

                    return(result);
                }

                emailVote = new PetitionEmailVote
                {
                    PetitionID  = vote.ID,
                    Email       = vote.Email,
                    CreatedDate = DateTime.Now,
                    IsConfirmed = false,
                    Hash        = HashGenerator.Generate()
                };

                db.PetitionEmailVotes.Add(emailVote);
                db.SaveChanges();

                var petition        = new Model.BusinessEntities.Petition(db.Petitions.SingleOrDefault(p => p.ID == emailVote.PetitionID));
                var clientEmailVote =
                    new Model.BusinessEntities.PetitionEmailVote()
                {
                    ID          = emailVote.ID,
                    Petition    = petition,
                    Hash        = emailVote.Hash,
                    Email       = emailVote.Email,
                    CreatedDate = emailVote.CreatedDate,
                    IsConfirmed = emailVote.IsConfirmed
                };

                result = OperationResult <Model.BusinessEntities.PetitionEmailVote> .Success(
                    int.Parse(PetitionVoteOperationResult.EmailVoteRequestCreatedCode),
                    string.Format(PetitionVoteOperationResult.EmailVoteRequestCreatedMessage, emailVote.Email),
                    clientEmailVote);

                return(result);
            };

            emailVoteRequestResult = DbExecuter.Execute(procedure);

            return(emailVoteRequestResult);
        }
        public OperationResult<Model.BusinessEntities.PetitionEmailVote> ConfirmEmailVoteRequest(string hash)
        {
            OperationResult<Model.BusinessEntities.PetitionEmailVote> result;

            try
            {
                using (var db = new EDEntities())
                {
                    var emailVote = db.PetitionEmailVotes.SingleOrDefault(p => p.Hash == hash);

                    if (emailVote == default(PetitionEmailVote))
                    {
                        result = OperationResult<Model.BusinessEntities.PetitionEmailVote>.Fail(-3, "Петиція не знайдена.");
                        return result;
                    }

                    if (emailVote.IsConfirmed)
                    {
                        result = OperationResult<Model.BusinessEntities.PetitionEmailVote>.Fail(-2, "Ви вже проголосували за цю петицію.");
                        return result;
                    }

                    emailVote.IsConfirmed = true;
                    db.SaveChanges();

                    var emailVoteBusiness = new Model.BusinessEntities.PetitionEmailVote(emailVote);
                    emailVoteBusiness.Petition = new Model.BusinessEntities.Petition(db.Petitions.SingleOrDefault(p => p.ID == emailVote.PetitionID));
                    result = OperationResult<Model.BusinessEntities.PetitionEmailVote>.Success(1, "Ви успішно проголосували за петицію.", emailVoteBusiness);
                }
            }
            catch (Exception ex)
            {
                result = OperationResult<Model.BusinessEntities.PetitionEmailVote>.Fail(-1, ex.Message);
            }

            return result;
        }
        public OperationResult<Model.BusinessEntities.PetitionEmailVote> CreateEmailVoteRequest(EmailVote vote)
        {
            OperationResult<Model.BusinessEntities.PetitionEmailVote> emailVoteRequestResult;

            Func<EDEntities, OperationResult<Model.BusinessEntities.PetitionEmailVote>> procedure = (db) =>
            {
                OperationResult<Model.BusinessEntities.PetitionEmailVote> result;

                var emailVote = db.PetitionEmailVotes.SingleOrDefault(v => v.PetitionID == vote.ID && v.Email == vote.Email);

                if (emailVote != null)
                {
                    var votedPetition = db.Petitions.SingleOrDefault(p => p.ID == vote.ID);
                    result = emailVote.IsConfirmed
                        ? OperationResult<Model.BusinessEntities.PetitionEmailVote>.Fail(
                            int.Parse(PetitionVoteOperationResult.AlreadyVotedCode),
                            PetitionVoteOperationResult.AlreadyVotedMessage)
                        : OperationResult<Model.BusinessEntities.PetitionEmailVote>.Success(
                            int.Parse(PetitionVoteOperationResult.WaitingConfirmationCode),
                            string.Format(PetitionVoteOperationResult.WaitingConfirmationMessage, emailVote.Email),
                            new Model.BusinessEntities.PetitionEmailVote(emailVote, votedPetition));
                    return result;
                }

                emailVote = new PetitionEmailVote
                {
                    PetitionID = vote.ID,
                    Email = vote.Email,
                    CreatedDate = DateTime.Now,
                    IsConfirmed = false,
                    Hash = HashGenerator.Generate()
                };

                db.PetitionEmailVotes.Add(emailVote);
                db.SaveChanges();

                var petition = new Model.BusinessEntities.Petition(db.Petitions.SingleOrDefault(p => p.ID == emailVote.PetitionID));
                var clientEmailVote =
                    new Model.BusinessEntities.PetitionEmailVote()
                    {
                        ID = emailVote.ID,
                        Petition = petition,
                        Hash = emailVote.Hash,
                        Email = emailVote.Email,
                        CreatedDate = emailVote.CreatedDate,
                        IsConfirmed = emailVote.IsConfirmed
                    };

                result = OperationResult<Model.BusinessEntities.PetitionEmailVote>.Success(
                    int.Parse(PetitionVoteOperationResult.EmailVoteRequestCreatedCode),
                    string.Format(PetitionVoteOperationResult.EmailVoteRequestCreatedMessage, emailVote.Email),
                    clientEmailVote);

                return result;
            };

            emailVoteRequestResult = DbExecuter.Execute(procedure);

            return emailVoteRequestResult;
        }