Beispiel #1
0
        public IHttpActionResult StoreSensorData(string data)
        {
            var testStoreMessage = new SensorDataMessage {
                SensorId = 3, SensorType = "binary", Value = 0
            };
            var encoded = UrlEncode(testStoreMessage);


            var decodedInput      = HttpUtility.UrlDecode(data);
            var sensorDataMessage = JsonConvert.DeserializeObject <SensorDataMessage>(decodedInput);

            var now = DateTime.Now;

            int newSensorDataId;

            using (var context = new FirstSampleContext())
            {
                var newSensorData = new SensorData
                {
                    SensorId = sensorDataMessage.SensorId,
                    Value    = sensorDataMessage.Value,
                    Received = now
                };
                context.SensorDataSet.Add(newSensorData);
                context.SaveChanges();
                newSensorDataId = newSensorData.SensorDataId;
                // SetChallengeStatusIfRequired(sensorDataMessage, context);
            }
            return(Ok(newSensorDataId));
        }
Beispiel #2
0
        /// <summary>
        /// // TODO: does not work, needs more work.
        /// Sets challenge Status to "failed" or "succeeded" if necessary
        /// </summary>
        /// <param name="sensorDataMessage"></param>
        /// <param name="context"></param>
        private static void SetChallengeStatusIfRequired(SensorDataMessage sensorDataMessage, FirstSampleContext context)
        {
            // based on the sensor data update the challenge table

            /**
             *  select * from challenge c
             *  inner join sensor S
             *  on s.UserId = c.victimId
             *  where
             *  s.SensorId = c.SensorId
             *  and c.Status = 'accepted'
             *  and s.SensorId = 3
             */
            var relevantChallenges = context.ChallengeSet
                                     .Join(context.SensorSet,
                                           c => c.VictimId,
                                           s => s.UserId,
                                           (c, s) => new { c, s }).
                                     Where(cs => cs.s.SensorId == cs.c.SensorId &&
                                           cs.c.VictimId == cs.s.UserId &&
                                           cs.c.Status == "accepted" &&
                                           cs.s.SensorId == sensorDataMessage.SensorId)
                                     .Select(cs => new
            {
                ChallengeId     = cs.c.ChallengeId,
                ChallengeTypeId = cs.c.ChallengeTypeId,
                StartDate       = cs.c.StartDate
            });

            foreach (var relevantChallenge in relevantChallenges)
            {
                var existingChallenge = context.ChallengeSet.Where(c => c.ChallengeId == relevantChallenge.ChallengeId)
                                        .Join(context.ChallengeTypeSet, c => c.ChallengeTypeId, ct => ct.ChallengeTypeId, (c, ct) => new { c, ct })
                                        .Where(cct => DateTime.Now - cct.c.StartDate < new TimeSpan(0, 0, cct.ct.DurationSeconds)).Select(cct => cct.c).FirstOrDefault();
                if (existingChallenge != null)
                {
                    existingChallenge.Status = "succeeded";
                    context.SaveChanges();
                }
            }

            var query = relevantChallenges
                        .Join(context.ChallengeTypeSet,
                              rc => rc.ChallengeTypeId,
                              ct => ct.ChallengeTypeId,
                              (rc, ct) => new { rc.ChallengeId, rc.StartDate, ct.DurationSeconds })
                        .Where(rcct => DateTime.Now - rcct.StartDate > new TimeSpan(0, 0, rcct.DurationSeconds));
            var succeededChallenges = query.ToList();

            foreach (var succeededChallenge in succeededChallenges)
            {
                var existing = context.ChallengeSet.Where(c => c.ChallengeId == succeededChallenge.ChallengeId).FirstOrDefault();
                if (existing != null)
                {
                    existing.Status = "succeeded";
                    context.SaveChanges();
                }
            }


            /*
             * select Getdate() - StartDate as currentDuration, DurationSeconds, ct.Type
             * from challenge c
             * inner join challengeType ct
             * on ct.ChallengeTypeId  = c.ChallengeTypeId
             * where challengeId = 1
             * -- given this result  --> if currentDuration > DurationSeconds
             * -- update challenge set status = 'succeeded' where challengeId = 1
             * -- hardcode type logic:
             * if (notv)
             * -- if dateTime.Now - StartDate > DurationInSeconds --> succeeded
             * -- if the current!!! data point == 1 --> fail
             */
        }