Example #1
0
        public IHttpActionResult Update(int networkId, int id, SensorModelPut sensorModel)
        {
            _credentials.SetCredentials(Request.Headers.Authorization.Parameter);
            var userId = _userRep.Get(_credentials.Email, _credentials.Password).Id;

            if (!_networkRep.GetAll().Any(n => n.Id == networkId && n.User_Id == userId))
            {
                var errorMessage = _messages.GetMessage(Custom.NotFound, "Network", "Id");
                return(NotFound(errorMessage));
            }

            if (sensorModel == null)
            {
                var errorMessage = _messages.GetMessage(Generic.NullObject);
                return(BadRequest(errorMessage));
            }

            if (_sensorRep.GetAll().Any(
                    p => p.Name == sensorModel.Name && p.Id != id))
            {
                var errorMessage = _messages.GetMessage(Custom.Conflict, "Sensor", "Name");
                return(Conflict(errorMessage));
            }

            var sensor = _sensorRep.Get(id);

            if (sensor == null)
            {
                var errorMessage = _messages.GetMessage(Custom.NotFound, "Sensor");
                return(NotFound(errorMessage));
            }


            //Pending
            if (sensorModel.UploadInterval < sensor.UploadInterval &&
                sensor.Active == true)
            {
                var lastInsertDate = sensor.LastInsertDate.Value;
                var waitTime       = (uint)
                                     (
                    lastInsertDate.AddMinutes(sensor.UploadInterval) - _dateTime.GetDateTime()
                                     ).TotalMinutes;

                if (waitTime == 0)
                {
                    waitTime = 1;
                }
                var s = waitTime > 1 ? "s" : "";

                var pendingModel = _mapper.Map <Sensor, SensorPendingModel>(sensor,
                                                                            opt => opt.AfterMap((dest, src) =>
                                                                                                src.UploadInterval = sensorModel.UploadInterval));

                TheSensorIntervalPending.AddToPending(pendingModel);

                _mapper.Map(sensorModel, sensor,
                            opts => opts.BeforeMap((src, dest) => {
                    src.UploadInterval = dest.UploadInterval;
                }));
                _sensorRep.Update(sensor);

                return(Ok($"It will take {waitTime} minute{s} to change the upload interval"));
            }

            _mapper.Map(sensorModel, sensor);
            _sensorRep.Update(sensor);

            return(StatusCode(HttpStatusCode.NoContent));
        }
Example #2
0
        public IHttpActionResult PartialUpdate(int networkId, int id, JsonPatchDocument <SensorModelPut> patchDoc)
        {
            _credentials.SetCredentials(Request.Headers.Authorization.Parameter);
            var userId = _userRep.Get(_credentials.Email, _credentials.Password).Id;

            if (!_networkRep.GetAll().Any(n => n.Id == networkId && n.User_Id == userId))
            {
                var errorMessage = _messages.GetMessage(Custom.NotFound, "Network", "Id");
                return(NotFound(errorMessage));
            }

            if (patchDoc == null)
            {
                var errorMessage = _messages.GetMessage(Generic.NullObject);
                return(BadRequest(errorMessage));
            }

            var sensor = _sensorRep.Get(id);

            if (sensor == null)
            {
                var errorMessage = _messages.GetMessage(Custom.NotFound, "Sensor");
                return(NotFound(errorMessage));
            }

            var sensorModel = _mapper.Map <SensorModelPut>(sensor);

            try
            {
                patchDoc.ApplyTo(sensorModel);
            }
            catch (JsonPatchException ex)
            {
                return(BadRequest(ex.Message));
            }
            catch (ArgumentNullException ex)
            {
                return(BadRequest(ex.Message));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }

            Validate(sensorModel);

            if (!ModelState.IsValid)
            {
                var error = ModelState.SelectMany(m => m.Value.Errors)
                            .Where(m => m.ErrorMessage != "")
                            .FirstOrDefault();
                var errorMessage = error != null ?
                                   error.ErrorMessage : _messages.GetMessage(Generic.InvalidRequest);
                return(BadRequest(errorMessage));
            }

            if (_sensorRep.GetAll().Any(
                    p => p.Name == sensorModel.Name && p.Id != id))
            {
                var errorMessage = _messages.GetMessage(Custom.Conflict, "Sensor", "Name");
                return(Conflict(errorMessage));
            }


            if (sensorModel.UploadInterval < sensor.UploadInterval &&
                sensor.Active == true)
            {
                var lastInsertDate = sensor.LastInsertDate.Value;
                var waitTime       = (uint)
                                     (
                    lastInsertDate.AddMinutes(sensor.UploadInterval) - _dateTime.GetDateTime()
                                     ).TotalMinutes;

                if (waitTime == 0)
                {
                    waitTime = 1;
                }
                var s = waitTime > 1 ? "s" : "";

                var pendingModel = _mapper.Map <Sensor, SensorPendingModel>(sensor,
                                                                            opt => opt.AfterMap((dest, src) =>
                                                                                                src.UploadInterval = sensorModel.UploadInterval));

                TheSensorIntervalPending.AddToPending(pendingModel);

                _mapper.Map(sensorModel, sensor,
                            opts => opts.BeforeMap((src, dest) => {
                    src.UploadInterval = dest.UploadInterval;
                }));
                _sensorRep.Update(sensor);

                return(Ok($"It will take {waitTime} minute{s} to change the upload interval"));
            }

            _mapper.Map(sensorModel, sensor);
            _sensorRep.Update(sensor);

            return(StatusCode(HttpStatusCode.NoContent));
        }
Example #3
0
        public IHttpActionResult Add(SensorReadingModelPost sensorReadingModel)
        {
            if (sensorReadingModel == null)
            {
                var errorMessage = _messages.GetMessage(Generic.NullObject);
                return(BadRequest(errorMessage));
            }

            _throttler.ThrottlerSetup(sensorReadingModel.SensorAddress, 1, 3);
            if (_throttler.RequestShouldBeThrottled())
            {
                return(TooManyRequests(_throttler));
            }

            var sensor = _sensorRep.GetAll()
                         .Where(s => s.Address == sensorReadingModel.SensorAddress)
                         .SingleOrDefault();


            if (sensor != null)
            {
                var gateway = _gatewayRep.GetAll()
                              .SingleOrDefault(g => g.Address == sensorReadingModel.GatewayAddress);

                if (gateway == null)
                {
                    var errorMessage = _messages.GetMessage(Custom.NotFound, "Gateway", "Address");
                    return(NotFound(errorMessage));
                }

                var sensorReading = _mapper.Map <SensorReading>(sensorReadingModel);
                sensorReading.Sensor_Id  = sensor.Id;
                sensorReading.InsertDate = _dateTime.GetDateOffSet();
                _readingRep.Add(sensorReading);

                var pending =
                    TheSensorIntervalPending
                    .GetPendingMember(sensor.Id);

                //Check if the pending exists
                if (pending != null)
                {
                    _mapper.Map(pending, sensor);
                    TheSensorIntervalPending.ClearPending(pending);
                }

                sensor.Active          = true;
                sensor.LastReadingDate = sensorReading.ReadingDate;
                sensor.LastInsertDate  = sensorReading.InsertDate;
                _sensorRep.Update(sensor);

                var address = sensorReadingModel.SensorAddress;
                Hub.Clients.Group(address).refreshReadings();



                //add the gateway connections
                if (!_connectionRep.GetAll()
                    .Any(
                        c => c.Gateway_Id == gateway.Id &&
                        c.Sensor_Id == sensor.Id)
                    )
                {
                    var connection = _connectionService.Create(gateway.Id, sensor.Id);
                    _connectionRep.Add(connection);
                }

                gateway.LastSensorDate = sensorReading.ReadingDate;
                _gatewayRep.Update(gateway);

                var createdReading = _mapper.Map <SensorReadingModelGet>(sensorReading);
                return(Created($"api/networks/{sensor.Network_Id}/sensors/{sensor.Id}/readings", createdReading));
            }
            else
            {
                var errorMessage = _messages.GetMessage(Custom.NotFound, "Sensor", "Address");
                return(NotFound(errorMessage));
            }
        }