Example #1
0
        public virtual JsonResult SyncData(string EventName, UpdateServiceFromAppModel model)
        {
            model.Responses = model.Responses ?? Enumerable.Empty <MoodResponseUpdateModel>();
            Event evnt = null;

            try
            {
                if (string.IsNullOrEmpty(EventName))
                {
                    throw new ArgumentException("Invalid event");
                }
                if (model == null)
                {
                    throw new ArgumentException("Invalid model");
                }

                this.logger.Info("App", string.Format("Request to sync data - {0}", model.rid));

                var syncTimestamp = DateTime.UtcNow;

                evnt = db.Get <Event>().FirstOrDefault(e => e.Name.Equals(EventName, StringComparison.InvariantCultureIgnoreCase));

                var responder = evnt.AddResponder(new Guid(model.rid), model.reg, model.apn);

                var lastSync = responder.LastSync < model.LastUpdate ? responder.LastSync : model.LastUpdate;

                // NB: assume new set will commit fine on the background queue.
                // If a failure occurs, it will be picked up on the next (or later) sync, and trigger a full "recovery" sync.
                var resError = model.ResTotal != (responder.Responses.Count() + model.Responses.Count());

                responder.LastSync = syncTimestamp;

                db.SaveChanges();

                if (model.Responses.Any())
                {
                    responseSubmissionQueue.Enqueue(new MoodResponseWorkItem
                    {
                        EventName     = EventName,
                        ResponderId   = model.rid,
                        Region        = model.reg,
                        DeviceId      = model.apn,
                        MoodResponses = model.Responses
                    });

                    backgroundTaskFactory.StartNew(ProcessQueuedMoodResponseWorkItems);
                }

                return(Json(GetServiceUpdates(evnt, true, resError, lastSync, syncTimestamp, responder.ForceReset)));
            }
            catch (Exception ex)
            {
                logger.Error("App", ex, "Failed sync from app" + (model == null ? " - model is null" : string.Empty));

                return(Json(GetServiceUpdates(evnt, false, false, model.LastUpdate, DateTime.UtcNow, false)));
            }
        }
        private void SubmitResponse(Guid responseId, MoodResponseUpdateModel response)
        {
            var model = new UpdateServiceFromAppModel()
            {
                AppId = appId,
                LastSuccessfulServiceUpdate = DateTime.UtcNow,
                ResponderId = responseId.ToString(),
                Responses   = new List <MoodResponseUpdateModel>()
                {
                    response
                }
            };

            JObject value = null;

            try
            {
                Console.WriteLine("Submitting request: " + requestUrl + " :: " + model.ResponderId);
                var req = HttpWebRequest.Create(requestUrl + appId);
                req.ContentType = "application/json";
                req.Method      = "POST";

                JObject postJson = JObject.FromObject(model);

                string postJsonString = postJson.ToString();

                byte[] data = new ASCIIEncoding().GetBytes(postJsonString);
                req.ContentLength = data.Length;

                Stream dataStream = req.GetRequestStream();
                dataStream.Write(data, 0, data.Length);
                dataStream.Close();

                using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
                {
                    using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
                    {
                        value = (JObject)JToken.ReadFrom(new JsonTextReader(reader));
                    }
                }
                Console.WriteLine("Request completed");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed request:");
                Console.WriteLine(ex.ToString());
            }
        }