public async Task <IActionResult> GiveCoinsReward([FromBody] RewardManualCoinsRequest request)
        {
            await _userStatisticsService.RewardCoinsToUsersAsync(request);

            return(Ok());
        }
Exemple #2
0
        public async Task RewardCoinsToUsersAsync(RewardManualCoinsRequest request)
        {
            if (request.Coins < 1)
            {
                throw new InvalidDataException("Coins");
            }

            if (request.UserIds.Count() < 1)
            {
                throw new InvalidDataException("Users");
            }

            var query = _uow.UserRepository.GetAll()
                        .Include(u => u.Devices)
                        .Include(u => u.UserSettings)
                        .AsQueryable();

            if (request.UserIds.FirstOrDefault() != -1)
            {
                query = query.Where(u => request.UserIds.Contains(u.Id));
            }

            var users = await query.ToListAsync();

            var setting = await _uow.SettingRepository.GetAll().Where(s => s.Name == SettingsConstants.LANGUAGE).FirstOrDefaultAsync();

            foreach (var user in users)
            {
                if (user.ActivatedAt.HasValue)
                {
                    var manualReward = await _uow.RewardCategoryRepository.GetAll().FirstOrDefaultAsync(r => r.Category == RewardCategoryEnum.ADMIN_MANUAL);

                    if (manualReward == null)
                    {
                        throw new Exception("Manual reward is not activated.");
                    }

                    await _uow.RewardHistoryRepository.AddAsync(new RewardHistory
                    {
                        RewardCategoryId = manualReward.Id,
                        Points           = request.Coins,
                        UserId           = user.Id,
                        CreatedAt        = DateTime.UtcNow
                    });

                    await _uow.CommitAsync();

                    await UpdateTotalCoinsAsync(user, request.Coins);

                    if (string.IsNullOrEmpty(request.Title))
                    {
                        await SendTesterCoinsRewardsNotificationAsync(user, request.Coins);
                    }
                    else
                    {
                        var title = request.Title;
                        var body  = request.Body;

                        var lang = "ES";
                        if (user.UserSettings != null)
                        {
                            var userSetting = user.UserSettings.FirstOrDefault(us => us.SettingId == setting.Id);
                            if (userSetting != null && !string.IsNullOrWhiteSpace(userSetting.Value))
                            {
                                lang = userSetting.Value;
                            }
                        }

                        switch (lang)
                        {
                        case "ES":
                            await _notificationService.SendFirebaseNotificationAsync(title, body, user.Devices);

                            break;

                        case "EN":
                            var titleEN = string.IsNullOrEmpty(request.TitleEN) ? title : request.TitleEN;
                            var bodyEN  = string.IsNullOrEmpty(request.BodyEN) ? body : request.BodyEN;
                            await _notificationService.SendFirebaseNotificationAsync(titleEN, bodyEN, user.Devices);

                            break;

                        case "IT":
                            var titleIT = string.IsNullOrEmpty(request.TitleIT) ? title : request.TitleIT;
                            var bodyIT  = string.IsNullOrEmpty(request.BodyIT) ? body : request.BodyIT;
                            await _notificationService.SendFirebaseNotificationAsync(titleIT, bodyIT, user.Devices);

                            break;

                        default:
                            break;
                        }
                    }
                }
            }
        }