Пример #1
0
        public async Task <ActionResult> CreateItem(AddItemDto addItemDto)
        {
            var itemToAdd = _mapper.Map <Entities.Item>(addItemDto);
            await _beachBuddyRepository.AddItem(itemToAdd);

            await _beachBuddyRepository.Save();

            var itemToReturn = _mapper.Map <ItemDto>(itemToAdd);

            return(CreatedAtRoute("GetItem", new { itemId = itemToReturn.Id }, itemToReturn));
        }
Пример #2
0
        public async Task sendNotification(RequestedItem requestedItem,
                                           NotificationType notificationType,
                                           string notificationTitle,
                                           string notificationMessage,
                                           bool dataOnly)
        {
            var devices = await _beachBuddyRepository.GetDevices();

            Dictionary <string, string> data;

            if (dataOnly)
            {
                data = new Dictionary <string, string>
                {
                    { "notificationType", notificationType.ToString() },
                    { "updateOnly", "true" }
                };
            }
            else
            {
                data = new Dictionary <string, string>
                {
                    { "notificationType", notificationType.ToString() },
                    { "updateOnly", "false" },
                    { "itemId", $"{requestedItem.Id}" },
                    { "name", $"{requestedItem.Name}" },
                    { "count", $"{requestedItem.Count}" },
                    { "sentByUserId", $"{requestedItem.RequestedByUserId}" }
                };
            }

            var deviceList = devices.ToList();
            var results    = await SendFcmNotification(deviceList, notificationTitle, notificationMessage, dataOnly, data);

            for (var i = 0; i < results.Count; i++)
            {
                var response = results[i];
                var device   = deviceList[i];
                if (response.IsSuccess)
                {
                    _logger.LogDebug($"Message was sent!");
                    // Woohoo!
                }
                else
                {
                    _logger.LogWarning(response.Exception.InnerException,
                                       $"Error sending notification to device {device.DeviceToken}");
                    if (response.Exception.MessagingErrorCode.HasValue &&
                        response.Exception.MessagingErrorCode == MessagingErrorCode.Unregistered)
                    {
                        // the token has been unregistered, must delete the device record
                        _beachBuddyRepository.DeleteDevice(device);
                        await _beachBuddyRepository.Save();

                        _logger.LogDebug($"Device {device.DeviceToken} has been unregistered");
                    }
                }
            }
        }
Пример #3
0
        public async Task <ActionResult> CreateRequestedItem(AddRequestedItemDto requestedItemDto)
        {
            var requestedByUserId = requestedItemDto.RequestedByUserId;

            if (requestedByUserId != Guid.Empty && await _beachBuddyRepository.UserExists(requestedByUserId) == false)
            {
                return(NotFound("User was not found."));
            }

            var itemToAdd = _mapper.Map <Entities.RequestedItem>(requestedItemDto);

            itemToAdd.CreatedDateTime   = DateTimeOffset.UtcNow;
            itemToAdd.CompletedDateTime = null;

            await _beachBuddyRepository.AddRequestedItem(itemToAdd);

            await _beachBuddyRepository.Save();

            var itemToReturn = _mapper.Map <RequestedItemDto>(itemToAdd);

            return(Ok(itemToReturn));
        }
Пример #4
0
        public async Task <ActionResult> UpdateScore(Guid scoreId, UpdateScoreDto updateScoreDto)
        {
            var scoreToUpdate = await _beachBuddyRepository.GetScore(scoreId);

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

            if (updateScoreDto.WinCount < 0)
            {
                return(BadRequest("You can't be that bad! Win count must be greater than 0."));
            }

            _mapper.Map(updateScoreDto, scoreToUpdate);
            _beachBuddyRepository.UpdateScore(scoreToUpdate);
            await _beachBuddyRepository.Save();

            await _notificationService.sendNotification(null, NotificationType.ScoreUpdated, null, null, true);

            return(NoContent());
        }
Пример #5
0
        public async Task <ActionResult> CreateDevice(AddDeviceDto addDeviceDto)
        {
            var itemToAdd = _mapper.Map <Device>(addDeviceDto);

            if (await _beachBuddyRepository.GetDevice(itemToAdd.DeviceToken) == null)
            {
                await _beachBuddyRepository.AddDevice(itemToAdd);

                await _beachBuddyRepository.Save();
            }

            return(NoContent());
        }
Пример #6
0
        public async Task <IActionResult> UpdateUser(Guid userId, UpdateUserDto updateUserDto)
        {
            var userToUpdate = await _beachBuddyRepository.GetUser(userId);

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

            _mapper.Map(updateUserDto, userToUpdate);
            _beachBuddyRepository.UpdateUser(userToUpdate);
            await _beachBuddyRepository.Save();

            return(NoContent());
        }
Пример #7
0
        public async Task MessageReceived(string fromNumber, string toNumber, string text, List <RemoteFile> files)
        {
            _logger.LogInformation($"New Incoming SMS from {fromNumber}: {text}");

            var users = await _beachBuddyRepository.GetUsers(new UserResourceParameters()
            {
                PhoneNumber = fromNumber
            });

            var userWhoSentMessage = users.FirstOrDefault();

            if (userWhoSentMessage == null)
            {
                await _twilioService.SendSms(fromNumber, "Sorry, I don't know who you are.");

                return;
            }

            var words = text.Split(" ");
            var firstWordOfMessage = words[0].ToLower();

            var firstChar = firstWordOfMessage.ToCharArray()[0];

            if (firstChar == '+' || firstChar == '-')
            {
                await ProcessScoreUpdate(text, userWhoSentMessage, fromNumber, toNumber);

                return;
            }

            string secondWordOfMessage = null;

            if (words.Length >= 2)
            {
                secondWordOfMessage = text.Split(" ")[1].ToLower();
            }

            switch (firstWordOfMessage.ToLower())
            {
            case "done":
                _backgroundTaskQueue.QueueSunscreenReminderForUser(userWhoSentMessage.Id);
                await _twilioService.SendSms(fromNumber, "Great! I'll let you know once it's dry and then again when it's time to reapply. ⏱");

                return;

            case "refresh":
                await _notificationService.sendNotification(null, NotificationType.DashboardPulledToRefresh, null, null, true);

                return;

            case "remove":
                await RemoveItems(fromNumber, toNumber, text, firstWordOfMessage);

                // Send data notification so app will update
                await _notificationService.sendNotification(null, NotificationType.RequestedItemRemoved, null, null, true);

                return;

            case "list":
                await ShowAllItems(fromNumber);

                return;

            case "h":
                await ShowHelp(fromNumber);

                return;

            case "nukefromorbit":
                await RemoveItems(fromNumber, toNumber, text, firstWordOfMessage, true);

                // Send data notification so app will update
                await _notificationService.sendNotification(null, NotificationType.RequestedItemRemoved, null, null, true);

                return;

            case "bal":
                await GetBalance(fromNumber);

                return;

            case "add":
                if (secondWordOfMessage != null && secondWordOfMessage == "game")
                {
                    var gameName = text.Substring("add game".Length).Trim();
                    await AddGame(gameName, fromNumber);

                    return;
                }

                break;

            case "leaderboard":
                await ShowLeaderBoard(fromNumber);

                return;
            }

            var requestedItemToSave = new RequestedItem();

            // Check if there is a quantity
            if (int.TryParse(firstWordOfMessage, out var quantity))
            {
                text = text.Substring(firstWordOfMessage.Length).Trim();
            }
            else
            {
                quantity = 1;
            }

            if (string.IsNullOrWhiteSpace(text))
            {
                await _twilioService.SendSms(fromNumber,
                                             $"Sorry, I didn't detect anything to add to the list.");

                return;
            }

            requestedItemToSave.Id                = Guid.NewGuid();
            requestedItemToSave.Count             = quantity;
            requestedItemToSave.CreatedDateTime   = DateTimeOffset.UtcNow;
            requestedItemToSave.RequestedByUserId = userWhoSentMessage.Id;
            requestedItemToSave.RequestedByUser   = userWhoSentMessage;
            requestedItemToSave.Name              = text;

            try
            {
                await _beachBuddyRepository.AddRequestedItem(requestedItemToSave);

                await _beachBuddyRepository.Save();
            }
            catch (Exception e)
            {
                _logger.LogError($"Something did not work when trying to save a requested item via Twilio: {e.Message}",
                                 e);
                await _twilioService.SendSms(fromNumber,
                                             $"Sorry, I couldn't add {text} to the list. Try again.)");

                return;
            }

            await _notificationService.sendNotification(
                await _beachBuddyRepository.GetRequestedItem(requestedItemToSave.Id),
                NotificationType.RequestedItemAdded,
                $"\"{requestedItemToSave.Name}\" added to list", $"{userWhoSentMessage.FirstName} " +
                $"added {requestedItemToSave.Count} {requestedItemToSave.Name} to the Beach List.",
                false);

            await _twilioService.SendSms(fromNumber, $"\"{text}\" was added to the list!");
        }