Beispiel #1
0
        public HttpResponseMessage Post(HttpRequestMessage request)
        {
            var requestStream = request.Content.ReadAsStreamAsync().Result;

            using (var zip = ZipFile.Read(requestStream)) {
                foreach (var entry in zip)
                {
                    var memory = new MemoryStream();
                    entry.Extract(memory);
                    memory.Position = 0;
                    var log = new ClientAppLog(CurrentUser, new StreamReader(memory).ReadToEnd());
                    log.Version = RequestLog.GetVersion(Request);
                    IEnumerable <string> values;
                    if (request.Headers.TryGetValues("Request-Token", out values))
                    {
                        log.RequestToken = values.Implode();
                    }

                    if (String.IsNullOrWhiteSpace(log.Text))
                    {
                        continue;
                    }

                    Session.Save(log);
                }
            }
            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
Beispiel #2
0
        public HttpResponseMessage Get(bool reset        = false,
                                       string data       = null,
                                       DateTime?lastSync = null,
                                       //перечень активных адресов доставки через запятую
                                       //для экспорта неподтвержденных заявок
                                       string addressIds = null,
                                       uint?id           = null)
        {
            if (id != null)
            {
                return(Session.Load <RequestLog>(id.Value).ToResult(Request, Config));
            }

            var        updateType = data ?? GetType().Name;
            RequestLog existsJob  = null;

            //если это новый запрос то пытаемся найти уже подготовленные данные которые не протухли или в процессе
            //что бы избежать дополнительной нагрузки на сервер
            if (reset)
            {
                if (Config.UpdateLifeTime > TimeSpan.Zero)
                {
                    var version = RequestLog.GetVersion(Request);
                    //если есть не загруженные данные отдаем их
                    //каждая версия хранит подготовленные данные в своей директории
                    //по этому передавать неподтвержденные данные есть смысл только в рамках версии
                    existsJob = Session.Query <RequestLog>()
                                .Where(j => j.UpdateType == updateType &&
                                       !j.IsConfirmed &&
                                       !j.IsFaulted &&
                                       j.User == CurrentUser &&
                                       j.Version == version)
                                .OrderByDescending(j => j.CreatedOn)
                                .Take(1)
                                .ToArray()
                                .FirstOrDefault(x => x.GetIsStale(Config.UpdateLifeTime) == false);
                }
            }
            else
            {
                existsJob = TryFindJob(updateType);
            }

            if (existsJob == null)
            {
                existsJob = new RequestLog(CurrentUser, Request, updateType, lastSync);
                existsJob.StartJob(Session,
                                   (session, job) => {
                    using (var exporter = new Exporter(session, Config, job)) {
                        exporter.Addresses = addressIds?.Split(',')
                                             .Select(x => session.Load <Address>(Convert.ToUInt32(x)))
                                             .ToArray()
                                             ?? new Address[0];
                        if (data.Match("Waybills"))
                        {
                            exporter.ExportDocs();
                        }
                        else
                        {
                            //если есть обновление исполняемых файлов то готовить данные нет смысла
                            //тк схема данных могла измениться и клиент все равно будет загружать кумулятивное
                            //после обновления бинарных файлов
                            if (data.Match("NoBin") || !exporter.ExportBin())
                            {
                                exporter.ExportDb();
                            }
                        }
                        //все данные выгружены завершаем транзакцию
                        session.Transaction.Commit();
                        exporter.Compress(job.OutputFile(Config));
                    }
                });
            }

            return(existsJob.ToResult(Request, Config));
        }