コード例 #1
0
        public DomainOperationVo <int> DailyEntry(Guid giveawayId, Guid participantId)
        {
            GiveawayParticipant existing = repository.GetParticipantById(giveawayId, participantId);

            if (existing == null)
            {
                return(new DomainOperationVo <int>(DomainActionPerformed.None, 0));
            }

            bool entryAlreadyExists = existing.Entries.Any(x => x.Type == GiveawayEntryType.Daily && x.Date.ToLocalTime().Date == DateTime.Today.ToLocalTime().Date);

            if (entryAlreadyExists)
            {
                return(new DomainOperationVo <int>(DomainActionPerformed.None, 0));
            }

            existing.Entries.Add(new GiveawayEntry
            {
                Date   = DateTime.Now,
                Type   = GiveawayEntryType.Daily,
                Points = 1
            });

            repository.UpdateParticipant(giveawayId, existing);

            int countDailyEntries = existing.Entries.Where(x => x.Type == GiveawayEntryType.Daily).Sum(x => x.Points);

            return(new DomainOperationVo <int>(DomainActionPerformed.Create, countDailyEntries));
        }
コード例 #2
0
        private bool IsOptionMandatory(GiveawayParticipant participant, KeyValuePair <GiveawayEntryType, int> entrySum)
        {
            switch (entrySum.Key)
            {
            case GiveawayEntryType.LoginOrEmail:
                return(true);

            case GiveawayEntryType.EmailConfirmed:
                return(entrySum.Value > 0);

            case GiveawayEntryType.ReferralCode:
                return(participant.Entries.Any(x => x.Type == GiveawayEntryType.ReferralCode));

            case GiveawayEntryType.Daily:
                return(participant.Entries.Any(x => x.Type == GiveawayEntryType.Daily && x.Date.ToLocalTime().Date == DateTime.Today.ToLocalTime().Date));

            case GiveawayEntryType.FacebookShare:
                return(participant.Entries.Any(x => x.Type == GiveawayEntryType.FacebookShare));

            case GiveawayEntryType.TwitterShare:
                return(participant.Entries.Any(x => x.Type == GiveawayEntryType.TwitterShare));

            default:
                return(false);
            }
        }
コード例 #3
0
        private void SetEntryOptions(GiveawayParticipationViewModel vm, GiveawayParticipant participant)
        {
            Dictionary <GiveawayEntryType, int> groupedEntries = participant.Entries.GroupBy(x => x.Type).Select(x => new { EntryType = x.Key, EntryCount = x.Sum(y => y.Points) }).ToDictionary(x => x.EntryType, y => y.EntryCount);

            List <GiveawayEntryType> entryOptionsList = Enum.GetValues(typeof(GiveawayEntryType)).Cast <GiveawayEntryType>().ToList();

            foreach (GiveawayEntryType entryType in entryOptionsList)
            {
                KeyValuePair <GiveawayEntryType, int> entrySum = groupedEntries.FirstOrDefault(x => x.Key == entryType);

                GiveawayEntryOptionViewModel existing = vm.EntryOptions.FirstOrDefault(x => x.Type == entryType);
                if (existing != null)
                {
                    existing.Type        = entryType;
                    existing.Points      = entrySum.Value;
                    existing.IsMandatory = IsOptionMandatory(participant, entrySum);
                }
                else
                {
                    vm.EntryOptions.Add(new GiveawayEntryOptionViewModel
                    {
                        Type        = entryType,
                        Name        = entryType.ToUiInfo().Description,
                        Points      = entrySum.Value,
                        IsMandatory = IsOptionMandatory(participant, entrySum)
                    });
                }
            }
        }
コード例 #4
0
        public void AddParticipant(Guid giveawayId, GiveawayParticipant participant)
        {
            participant.Id = Guid.NewGuid();

            FilterDefinition <Giveaway> filter = Builders <Giveaway> .Filter.Where(x => x.Id == giveawayId);

            UpdateDefinition <Giveaway> add = Builders <Giveaway> .Update.AddToSet(c => c.Participants, participant);

            Context.AddCommand(() => DbSet.UpdateOneAsync(filter, add));
        }
コード例 #5
0
        public void DeclareNotWinner(Guid giveawayId, Guid participantId)
        {
            GiveawayParticipant participant = repository.GetParticipantById(giveawayId, participantId);

            if (participant != null)
            {
                participant.IsWinner = false;

                repository.UpdateParticipant(giveawayId, participant);
            }
        }
コード例 #6
0
        public void UpdateParticipantShortUrl(Guid giveawayId, string email, string shortUrl)
        {
            GiveawayParticipant existing = repository.GetParticipantByEmail(giveawayId, email);

            if (existing != null)
            {
                existing.ShortUrl = shortUrl;

                repository.UpdateParticipant(giveawayId, existing);
            }
        }
コード例 #7
0
        public DomainOperationVo <GiveawayParticipant> AddParticipant(Guid giveawayId, string email, bool gdprConsent, bool wantNotifications, string referalCode, string referrer, GiveawayEntryType?entryType)
        {
            GiveawayParticipant participant;

            IQueryable <GiveawayParticipant> existing = repository.GetParticipants(giveawayId);
            bool exists = existing.Any(x => x.Email == email);

            if (exists)
            {
                participant = existing.First(x => x.Email == email);

                repository.UpdateParticipant(giveawayId, participant);

                return(new DomainOperationVo <GiveawayParticipant>(DomainActionPerformed.Update, participant));
            }
            else
            {
                participant = new GiveawayParticipant
                {
                    Email             = email,
                    GdprConsent       = gdprConsent,
                    WantNotifications = wantNotifications
                };

                participant.Entries.Add(new GiveawayEntry
                {
                    Type   = GiveawayEntryType.LoginOrEmail,
                    Points = 1
                });

                participant.ReferralCode = referalCode;

                repository.AddParticipant(giveawayId, participant);

                if (!string.IsNullOrWhiteSpace(referrer))
                {
                    GiveawayParticipant referrerParticipant = repository.GetParticipantByReferralCode(giveawayId, referrer);
                    if (referrerParticipant != null)
                    {
                        referrerParticipant.Entries.Add(new GiveawayEntry
                        {
                            Type   = entryType ?? GiveawayEntryType.ReferralCode,
                            Points = 1
                        });

                        repository.UpdateParticipant(giveawayId, referrerParticipant);
                    }
                }

                return(new DomainOperationVo <GiveawayParticipant>(DomainActionPerformed.Create, participant));
            }
        }
コード例 #8
0
        public void ConfirmParticipant(Guid giveawayId, string referralCode)
        {
            GiveawayParticipant existing = repository.GetParticipantByReferralCode(giveawayId, referralCode);

            if (existing != null && !existing.Entries.Any(x => x.Type == GiveawayEntryType.EmailConfirmed))
            {
                existing.Entries.Add(new GiveawayEntry
                {
                    Type   = GiveawayEntryType.EmailConfirmed,
                    Points = 1
                });

                repository.UpdateParticipant(giveawayId, existing);
            }
        }
コード例 #9
0
        public void UpdateParticipant(Guid giveawayId, GiveawayParticipant participant)
        {
            FilterDefinition <Giveaway> filter = Builders <Giveaway> .Filter.And(
                Builders <Giveaway> .Filter.Eq(x => x.Id, giveawayId),
                Builders <Giveaway> .Filter.ElemMatch(x => x.Participants, x => x.Id == participant.Id));

            UpdateDefinition <Giveaway> update = Builders <Giveaway> .Update
                                                 .Set(c => c.Participants[-1].Email, participant.Email)
                                                 .Set(c => c.Participants[-1].GdprConsent, participant.GdprConsent)
                                                 .Set(c => c.Participants[-1].WantNotifications, participant.WantNotifications)
                                                 .Set(c => c.Participants[-1].ShortUrl, participant.ShortUrl)
                                                 .Set(c => c.Participants[-1].IsWinner, participant.IsWinner)
                                                 .Set(c => c.Participants[-1].Entries, participant.Entries);

            Context.AddCommand(() => DbSet.UpdateOneAsync(filter, update));
        }
コード例 #10
0
        public void PickAllWinners(Guid giveawayId)
        {
            Task <GiveawayBasicInfo> task = Task.Run(async() => await repository.GetBasicGiveawayById(giveawayId));

            task.Wait();

            GiveawayBasicInfo basicInfo = task.Result;

            List <GiveawayParticipant> allParticipants = repository.GetParticipants(giveawayId).ToList();
            List <GiveawayParticipant> winners         = allParticipants.Where(x => x.IsWinner).ToList();
            List <GiveawayParticipant> nonWinners      = allParticipants.Where(x => !x.IsWinner).ToList();

            var allEntries = (from p in nonWinners
                              from e in p.Entries
                              select new
            {
                Participant = p,
                Entry = e
            }).ToList();

            int winnersToSelect = basicInfo.WinnerAmount - winners.Count;

            if (allParticipants.Count < winnersToSelect)
            {
                winnersToSelect = allParticipants.Count;
            }

            if (winnersToSelect > 0)
            {
                Random rand = new Random(DateTime.Now.ToString().GetHashCode());

                for (int i = 0; i < winnersToSelect; i++)
                {
                    int index = rand.Next(0, allEntries.Count);

                    GiveawayParticipant winner = allEntries.ElementAt(index).Participant;

                    winner.IsWinner = true;

                    repository.UpdateParticipant(giveawayId, winner);

                    allEntries = allEntries.Except(allEntries.Where(x => x.Participant.Id == winner.Id)).ToList();
                }
            }

            repository.UpdateGiveawayStatus(giveawayId, GiveawayStatus.Ended);
        }
コード例 #11
0
        public void PickSingleWinner(Guid giveawayId)
        {
            List <GiveawayParticipant> nonWinners = repository.GetParticipants(giveawayId).Where(x => !x.IsWinner).ToList();

            if (nonWinners.Any())
            {
                Random rand = new Random(DateTime.Now.ToString().GetHashCode());

                int index = rand.Next(0, nonWinners.Count);

                GiveawayParticipant winner = nonWinners.ElementAt(index);

                winner.IsWinner = true;

                repository.UpdateParticipant(giveawayId, winner);
            }
        }
コード例 #12
0
        public OperationResultVo GetGiveawayParticipantInfo(Guid currentUserId, Guid giveawayId, string email)
        {
            try
            {
                GiveawayBasicInfo existing = giveawayDomainService.GetGiveawayBasicInfoById(giveawayId);

                if (existing == null)
                {
                    return(new OperationResultVo(false, "Giveaway not found!"));
                }

                GiveawayParticipant participant = giveawayDomainService.GetParticipantByEmail(giveawayId, email);

                if (participant == null)
                {
                    return(new OperationResultVo(false, "No participant found for that email!"));
                }

                GiveawayParticipationViewModel vm = mapper.Map <GiveawayParticipationViewModel>(existing);

                SetViewModelState(currentUserId, vm);

                vm.EntryCount = participant.Entries.Sum(x => x.Points);

                vm.ShareUrl = participant.ShortUrl;

                vm.EmailConfirmed = participant.Entries.Any(x => x.Type == GiveawayEntryType.EmailConfirmed);

                SetImagesToShow(vm, false);

                SetEntryOptions(vm, participant);

                vm.ParticipantId = participant.Id;

                return(new OperationResultVo <GiveawayParticipationViewModel>(vm));
            }
            catch (Exception ex)
            {
                return(new OperationResultVo(ex.Message));
            }
        }
コード例 #13
0
        public GiveawayParticipant GetParticipantById(Guid giveawayId, Guid participantId)
        {
            GiveawayParticipant model = DbSet.AsQueryable().Where(x => x.Id == giveawayId).SelectMany(x => x.Participants).FirstOrDefault(x => x.Id == participantId);

            return(model);
        }
コード例 #14
0
        public GiveawayParticipant GetParticipantByReferralCode(Guid giveawayId, string referralCode)
        {
            GiveawayParticipant model = DbSet.AsQueryable().Where(x => x.Id == giveawayId).SelectMany(x => x.Participants).FirstOrDefault(x => x.ReferralCode.Equals(referralCode));

            return(model);
        }
コード例 #15
0
        public GiveawayParticipant GetParticipantByEmail(Guid giveawayId, string email)
        {
            GiveawayParticipant model = DbSet.AsQueryable().Where(x => x.Id == giveawayId).SelectMany(x => x.Participants).FirstOrDefault(x => x.Email.Equals(email));

            return(model);
        }
コード例 #16
0
        public GiveawayParticipant GetParticipantByEmail(Guid giveawayId, string email)
        {
            GiveawayParticipant model = repository.GetParticipantByEmail(giveawayId, email);

            return(model);
        }