Exemplo n.º 1
0
        public AquariumDevice AddAquariumDevice(AquariumDevice device)
        {
            var newDevice = _aquariumDao.AddAquariumDevice(device);

            //_deviceService.SetAquarium(newDevice.Id, device.AquariumId);
            return(newDevice);
        }
        public IActionResult ApplyDeviceHardware([FromBody] AquariumDevice aquariumDevice)
        {
            try
            {
                _logger.LogInformation($"POST /v1/DeviceInteraction called");
                var userId   = _accountService.GetCurrentUserId();
                var id       = _accountService.GetCurrentAquariumId();
                var aquarium = _aquariumService.GetAquariumById(id);
                if (aquarium.Device == null)
                {
                    return(BadRequest("This aquarium does not have a device"));
                }
                if (!_accountService.CanModify(userId, aquarium))
                {
                    return(BadRequest("You do not own this aquarium"));
                }



                _logger.LogInformation("Attempting to determine local ip addresses");
                var localIp      = Request.HttpContext.Connection.LocalIpAddress;
                var localPort    = Request.HttpContext.Connection.LocalPort;
                var remoteIp     = Request.HttpContext.Connection.RemoteIpAddress;
                var remotePort   = Request.HttpContext.Connection.RemotePort;
                var aquariumPort = aquariumDevice.Port;

                _logger.LogInformation($"\n" +
                                       $"- Local Ip Address: {localIp}:{localPort}" +
                                       $"- Remote Ip Address: {remoteIp}:{remotePort}" +
                                       $"- Determined Address: {remoteIp}:{aquariumPort}" +
                                       $"\n");
                //Update IP Information
                var ip   = remoteIp;
                var port = aquariumPort;
                if ($"{remoteIp}" == "::1")
                {
                    ip = localIp;
                }
                if (aquarium.Device.Address != $"{ip}" || aquarium.Device.Port != $"{port}")
                {
                    aquarium.Device.Address = $"{ip}";
                    aquarium.Device.Port    = $"{port}";
                    aquarium.Device         = _aquariumService.UpdateAquariumDevice(userId, aquarium.Device);
                    _notificationService.EmitAsync(userId, "Aquarium Device", $"[{aquarium.Device.Name}] Aquarium device ip/port combination was updated to ${ip}:{port}").Wait();
                }



                aquarium.Device = _aquariumService.ApplyAquariumDeviceHardware(aquarium.Device.Id, aquariumDevice);
                return(new OkObjectResult(aquarium));
            }
            catch (Exception ex)
            {
                _logger.LogError($"POST /v1/DeviceInteraction endpoint caught exception: { ex.Message } Details: { ex.ToString() }");
                return(NotFound());
            }
        }
Exemplo n.º 3
0
 public IActionResult AddAquariumDevice([FromBody] AquariumDevice device)
 {
     try
     {
         _logger.LogInformation($"POST /v1/Device/Add called");
         var newDevice = _aquariumService.AddAquariumDevice(device);
         return(CreatedAtAction(nameof(UpdateAquariumDevice), new { id = newDevice.Id }, newDevice));
     }
     catch (Exception ex)
     {
         _logger.LogError($"POST /v1/Device/Add endpoint caught exception: { ex.Message } Details: { ex.ToString() }");
         return(NotFound());
     }
 }
Exemplo n.º 4
0
 public IActionResult UpdateDeviceInformation([FromBody] AquariumDevice aquariumDevice)
 {
     try
     {
         _logger.LogInformation("POST /v1/Device called");
         _aquariumAuthService.ApplyAquariumDeviceFromService(aquariumDevice);
         return(Ok());
     }
     catch (Exception ex)
     {
         _logger.LogError($"POST /v1/Device endpoint caught exception: { ex.Message } Details: { ex.ToString() }");
         _logger.LogError(ex.StackTrace);
         return(NotFound());
     }
 }
Exemplo n.º 5
0
        public AquariumDevice ScanHardware()
        {
            var port = _hostingEnvironment;

            var hardware = new AquariumDevice()
            {
                Port               = _config["Port"],
                EnabledPhoto       = CanTakePhoto(),
                EnabledTemperature = _serialService.CanRetrieveTemperature(),
                EnabledNitrate     = _serialService.CanRetrieveNitrate(),
                EnabledPh          = _serialService.CanRetrievePh(),
            };

            return(hardware);
        }
Exemplo n.º 6
0
        public AquariumDevice UpdateAquariumDevice(int userId, AquariumDevice device)
        {
            var updatedDevice = _aquariumDao.UpdateAquariumDevice(device);

            try
            {
                _deviceClient.Configure(updatedDevice);
                _deviceClient.ApplyUpdatedDevice(updatedDevice);
            }
            catch (Exception ex)
            {
                //Could not  tell devices that we updated
                _logger.LogError("Could not send update to devices.");
                _notificationService.EmitAsync(userId, "Aquarium Device", $"[{device.Name}] Unable to connect to aquarium device. Your device may be offline. " +
                                               $"We attempted to contact: " +
                                               $"${device.Address}:{device.Port}").Wait();
            }
            return(updatedDevice);
        }
Exemplo n.º 7
0
        public IActionResult GetPingFromDevice([FromBody] AquariumDevice deviceRequest)
        {
            try
            {
                _logger.LogInformation($"GET /v1/Device/Ping called");

                var host = HttpContext.Connection.RemoteIpAddress.ToString();

                _logger.LogInformation($"\n\nHost: ({host}) \n '{deviceRequest.PrivateKey}'");

                var device = _aquariumService.GetAquariumDeviceByIpAndKey(host, deviceRequest.PrivateKey);
                _aquariumService.ApplyAquariumDeviceHardware(device.Id, deviceRequest);
                return(new OkObjectResult(device));
            }
            catch (Exception ex)
            {
                _logger.LogError($"GET /v1/Device/Ping endpoint caught exception: { ex.Message } Details: { ex.ToString() }");
                return(BadRequest());
            }
        }
Exemplo n.º 8
0
        public void ApplyUpdatedDevice(AquariumDevice aquariumDevice)
        {
            var path = $"/v1/Device";

            using (var client2 = GetHttpClient())
            {
                JsonSerializerSettings jss = new JsonSerializerSettings();
                jss.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

                var httpContent = new StringContent(JsonConvert.SerializeObject(aquariumDevice, jss), Encoding.UTF8, "application/json");
                var result      = client2.PostAsync(path, httpContent).Result;
                if (!result.IsSuccessStatusCode)
                {
                    _logger.LogError($"{result.StatusCode}: {result.ReasonPhrase}");
                    _logger.LogError($"Path: {path}");
                    throw new Exception("Could not send updated device information to device");
                }
            }
            _logger.LogInformation("Device information updated on device");
        }
Exemplo n.º 9
0
        public IActionResult UpdateAquariumDevice([FromBody] AquariumDevice device)
        {
            try
            {
                _logger.LogInformation($"POST /v1/Device/Update called");
                var id = _accountService.GetCurrentUserId();
                var aq = _aquariumService.GetAquariumById(device.AquariumId);
                if (!_accountService.CanModify(id, aq))
                {
                    return(new UnauthorizedResult());
                }

                var updatedDevice = _aquariumService.UpdateAquariumDevice(id, device);
                return(new OkObjectResult(updatedDevice));
            }
            catch (Exception ex)
            {
                _logger.LogError($"POST /v1/Device/Update endpoint caught exception: { ex.Message } Details: { ex.ToString() }");
                return(NotFound());
            }
        }
Exemplo n.º 10
0
 public void Configure(AquariumDevice device)
 {
     Device = device;
 }
Exemplo n.º 11
0
 public AquariumDevice ApplyAquariumDeviceHardware(int deviceId, AquariumDevice updatedDevice)
 {
     return(_aquariumDao.ApplyAquariumDeviceHardware(deviceId, updatedDevice));
 }
Exemplo n.º 12
0
        public IActionResult DeviceLogin([FromBody] DeviceLoginRequest deviceLogin)
        {
            try
            {
                _logger.LogInformation($"POST /v1/Auth/Login/Device called");
                var user  = _accountService.AttemptUserCredentials(deviceLogin.Email, deviceLogin.Password);
                var token = _accountService.IssueDeviceLoginToken(user, deviceLogin.AquariumId);


                user.Aquariums = _aquariumService.GetAquariumsByAccountId(user.Id);



                var data = new DeviceLoginResponse
                {
                    Account    = user,
                    Token      = token,
                    AquariumId = deviceLogin.AquariumId
                };


                if (deviceLogin.AquariumId.HasValue)
                {
                    var aq = user.Aquariums.First(a => a.Id == deviceLogin.AquariumId);

                    //Register account login activity
                    _activityService.RegisterActivity(new DeviceLoginAccountActivity()
                    {
                        AccountId = user.Id
                    });

                    //Dispatch notification stating new login occured
                    _notificationService.EmitAsync(new DispatchedNotification
                    {
                        Date         = DateTime.Now.ToUniversalTime(),
                        Type         = NotificationTypes.LoginDeviceActivity,
                        DispatcherId = user.Id,
                        Title        = "New Device Login",
                        Subtitle     = $"Aquarium monitoring device connected to {aq.Name}",
                    }, new List <int>()
                    {
                        user.Id
                    }).Wait();


                    //If the aquarium did not have a device, create a record for it
                    if (aq.Device == null)
                    {
                        var d = new AquariumDevice
                        {
                            Name       = "Remote Login",
                            Type       = "RaspberryPi",
                            Address    = "",
                            Port       = "0",
                            PrivateKey = "",
                            AquariumId = aq.Id
                        };
                        aq.Device = _aquariumService.AddAquariumDevice(d);
                    }
                    else
                    {
                        aq.Device = _aquariumService.GetAquariumDeviceById(aq.Device.Id);
                    }
                    data.Aquarium = aq;
                }

                return(new OkObjectResult(data));
            }
            catch (Exception ex)
            {
                _logger.LogError($"POST /v1/Auth/Login/Device endpoint caught exception: { ex.Message } Details: { ex.ToString() }");
                return(Unauthorized());
            }
        }
Exemplo n.º 13
0
 public void ApplyAquariumDeviceFromService(AquariumDevice aquariumDevice)
 {
     _token.Aquarium.Device = aquariumDevice;
     SaveTokenToCache(_token);
     _bootstrapSetup();
 }