public SensorEvent AddOrUpdate(SensorEventPOST viewModel)
        {
            //try to get an existing meter, by looking in a local cache first
            var meteredSpace = _meteredSpacesService.Get(viewModel.MeteredSpace.MeterID);
            if (meteredSpace == null)
            {
                //record this meter in the db
                meteredSpace = _meteredSpacesService.AddOrUpdate(viewModel.MeteredSpace);
            }

            var posted = new SensorEvent() {
                ClientId = viewModel.ClientID,
                EventTime = DateTime.Parse(viewModel.EventTime),
                EventType = viewModel.EventType,
                MeteredSpace = meteredSpace,
                ReceivedTime = _clock.UtcNow,
                SessionId = long.Parse(viewModel.MeteredSpace.SessionID),
                TransmissionId = long.Parse(viewModel.TransmissionID),
                TransmissionTime = DateTime.Parse(viewModel.TransmissionDateTime)
            };

            var existing = _sensorEventsRepo.Get(x => x.TransmissionId == posted.TransmissionId);

            if (existing == null)
            {
                _sensorEventsRepo.Create(posted);
            }
            else
            {
                posted.Id = existing.Id;
                _sensorEventsRepo.Update(posted);
            }

            return posted;
        }
        public void Post_GivenViewModel_ReturnsCreatedSensorEventGETAtRoute()
        {
            _mockSensorEventsService
            .Setup(m => m.AddOrUpdate(It.IsAny <SensorEventPOST>()))
            .Returns <SensorEventPOST>(vm =>
                                       new SensorEvent {
                TransmissionId = long.Parse(vm.TransmissionID),
                MeteredSpace   = new MeteredSpace {
                    MeterId = vm.MeteredSpace.MeterID
                },
                SessionId = long.Parse(vm.MeteredSpace.SessionID),
            }
                                       );

            var viewModel = new SensorEventPOST {
                TransmissionID = "1",
                MeteredSpace   = new SensorEventMeteredSpacePOST {
                    SessionID = "0",
                    MeterID   = "Pole1"
                }
            };

            IHttpActionResult actionResult = _controller.Post(viewModel);
            var okResult = actionResult as OkNegotiatedContentResult <SensorEventGET>;

            Assert.IsNotNull(okResult);
            //Assert.AreEqual("SensorEvents", createdResult.RouteName);
            //Assert.AreEqual(1, createdResult.RouteValues["id"]);

            Assert.IsNotNull(okResult.Content);
            Assert.AreEqual(1, okResult.Content.EventId);
            Assert.AreEqual(0, okResult.Content.SessionId);
            Assert.AreEqual("Pole1", okResult.Content.MeterId);
        }
        public void SensorEventXml_DeserializesTo_SensorEventPOST()
        {
            //arrange

            var serializer = new DataContractSerializer(typeof(SensorEventPOST));

            string xml =
                @"<SensorEvent>
<ClientID>XYZ123</ClientID>
<TransmissionID>12345678</TransmissionID>
<TransmissionDateTime>2015-01-26 17:00:00</TransmissionDateTime>
<EventType>SE</EventType>
<MeteredSpace>
<MeterID>Pole1</MeterID>
<SessionID>123</SessionID>
</MeteredSpace>
<EventTime>2015-01-26 17:00:00</EventTime>
</SensorEvent>";

            SensorEventPOST sensorEvent = null;

            //act

            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
            {
                sensorEvent = serializer.ReadObject(ms) as SensorEventPOST;
            }

            //assert

            Assert.NotNull(sensorEvent);
            Assert.AreEqual("XYZ123", sensorEvent.ClientID);
            Assert.AreEqual("12345678", sensorEvent.TransmissionID);
            Assert.AreEqual("2015-01-26 17:00:00", sensorEvent.TransmissionDateTime);
            Assert.AreEqual("SE", sensorEvent.EventType);
            Assert.NotNull(sensorEvent.MeteredSpace);
            Assert.AreEqual("Pole1", sensorEvent.MeteredSpace.MeterID);
            Assert.AreEqual("123", sensorEvent.MeteredSpace.SessionID);
            Assert.AreEqual("2015-01-26 17:00:00", sensorEvent.EventTime);
        }
示例#4
0
        public IHttpActionResult Post([FromBody] SensorEventPOST postedSensorEvent)
        {
            if (postedSensorEvent == null)
            {
                Logger.Warning("POST to {0} with null model.", RequestContext.RouteData.Route.RouteTemplate);
                return(BadRequest("Incoming data parsed to null entity model."));
            }

            SensorEvent entity = null;

            try
            {
                entity = _sensorEventsService.AddOrUpdate(postedSensorEvent);
            }
            catch (Exception ex)
            {
                Logger.Error(
                    ex,
                    "Server error on POST to {0} with model:{1}{2}",
                    RequestContext.RouteData.Route.RouteTemplate,
                    Environment.NewLine,
                    postedSensorEvent.ToXmlString()
                    );
                return(InternalServerError(ex));
            }

            //temporary because WebApi routes are registered with Route.Name = null, hence cannot be looked up by name
            //we should return CreatedAtRoute (201 with a location header)
            //instead we just return 200 with the entity

            //return CreatedAtRoute(
            //    "SensorEvents",
            //    new { id = entity.Id },
            //    entity
            //);

            return(Ok(_sensorEventsService.GetViewModel(entity)));
        }
        public SensorEvent AddOrUpdate(SensorEventPOST viewModel)
        {
            //try to get an existing meter, by looking in a local cache first
            var meteredSpace = _meteredSpacesService.Get(viewModel.MeteredSpace.MeterID);

            if (meteredSpace == null)
            {
                //record this meter in the db
                meteredSpace = _meteredSpacesService.AddOrUpdate(viewModel.MeteredSpace);
            }

            var posted = new SensorEvent()
            {
                ClientId         = viewModel.ClientID,
                EventTime        = DateTime.Parse(viewModel.EventTime),
                EventType        = viewModel.EventType,
                MeteredSpace     = meteredSpace,
                ReceivedTime     = _clock.UtcNow,
                SessionId        = long.Parse(viewModel.MeteredSpace.SessionID),
                TransmissionId   = long.Parse(viewModel.TransmissionID),
                TransmissionTime = DateTime.Parse(viewModel.TransmissionDateTime)
            };

            var existing = _sensorEventsRepo.Get(x => x.TransmissionId == posted.TransmissionId);

            if (existing == null)
            {
                _sensorEventsRepo.Create(posted);
            }
            else
            {
                posted.Id = existing.Id;
                _sensorEventsRepo.Update(posted);
            }

            return(posted);
        }
        public void Post_GivenViewModel_ReturnsCreatedSensorEventGETAtRoute()
        {
            _mockSensorEventsService
                .Setup(m => m.AddOrUpdate(It.IsAny<SensorEventPOST>()))
                .Returns<SensorEventPOST>(vm =>
                        new SensorEvent {
                            TransmissionId = long.Parse(vm.TransmissionID),
                            MeteredSpace = new MeteredSpace {
                                MeterId = vm.MeteredSpace.MeterID
                            },
                            SessionId = long.Parse(vm.MeteredSpace.SessionID),
                        }
                );

            var viewModel = new SensorEventPOST {
                TransmissionID = "1",
                MeteredSpace = new SensorEventMeteredSpacePOST {
                    SessionID = "0",
                    MeterID = "Pole1"
                }
            };

            IHttpActionResult actionResult = _controller.Post(viewModel);
            var okResult = actionResult as OkNegotiatedContentResult<SensorEventGET>;

            Assert.IsNotNull(okResult);
            //Assert.AreEqual("SensorEvents", createdResult.RouteName);
            //Assert.AreEqual(1, createdResult.RouteValues["id"]);

            Assert.IsNotNull(okResult.Content);
            Assert.AreEqual(1, okResult.Content.EventId);
            Assert.AreEqual(0, okResult.Content.SessionId);
            Assert.AreEqual("Pole1", okResult.Content.MeterId);
        }