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)); }
/// <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 */ }