private void ProcessGetList(ApiRequest request)
        {
            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = "LIST", context = "BEFORE_LIST", data = null
            });

            HttpContext context = request.HttpContext;

            // Enable GZip Compression if client support it
            AddGZipCompression(context, request.AcceptGZip);

            var result = GetCollection(request.IncludeList, request.Filter, request.FilterParameters, request.PageNumber, request.PageSize, request.SortOrder, request.SortColumn);

            result.ObjectsDataSet.SerializeTechnicalProperties = false;

            if (!request.IsDatasetApi)
            {
                result.ObjectsDataSet.InitializeRelationsToInclude(typeof(TENTITY), request.Includes);
            }

            object dataToSerialize = request.IsDatasetApi ? DataObjectFactory.CreateDataSetContainer(result) : result;
            var    json            = JsonConvert.SerializeObject(dataToSerialize, GetJsonSerializerSettings(request));

            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = "LIST", context = "JSON", data = json
            });

            WriteResponse(context, json);
        }
        private void ProcessGetById(ApiRequest request)
        {
            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = "BYID", context = "BEFORE_BYID", data = null
            });

            var pks        = request.QueryParts.Skip(2).Select(pk => HttpUtilities.UrlDecode(pk));
            var dataObject = DataObjectFactory.CreateDataObject(pks);
            var result     = DataProvider.Get(dataObject, null, request.IncludeList);

            if (result == null)
            {
                techLogger.Error("Can't get Entity by Id. DataObject:{0} pk:{1}: url:{2}", DataObjectFactory.GetType().Name, pks.SingleOrDefault(), request.HttpContext.Request.Url);
                throw new ResourceNotFoundException();
            }

            if (result.ObjectsDataSet == null)
            {
                result.ObjectsDataSet = ApplicationSettings.Resolve <IObjectsDataSet>();
                result.ObjectsDataSet.AddObject(result);
            }

            result.ObjectsDataSet.SerializeTechnicalProperties = false;

            if (!request.IsDatasetApi)
            {
                result.ObjectsDataSet.InitializeRelationsToInclude(typeof(TENTITY), request.Includes);
            }

            object dataToSerialize = request.IsDatasetApi ? DataObjectFactory.CreateDataSetContainer(result) : result;

            var json = JsonConvert.SerializeObject(dataToSerialize, GetJsonSerializerSettings(request));

            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = "BYID", context = "JSON", data = json
            });

            WriteResponse(request.HttpContext, json);
        }
        private void ProcessPost(ApiRequest request)
        {
            TENTITY objectToSave = null;

            JsonSerializerSettings settings = GetJsonSerializerSettings(request);

            string jsonIncomingEntity = request.JsonEntityData;

            if (request.IsDatasetApi)
            {
                objectToSave = DataObjectFactory.DeserializeFromContainer(jsonIncomingEntity, settings);

                // Case where trying to save existing object, not dirty => either:
                // (a) only PK is passed to the client, or
                // (b) the main/primary entity is not present in the incoming dataset, in which case the deserialize call above will have created a new instance of the main/primary entity
                // In both cases we should retrieve the main/primary object from database, and combine the datasets
                if (objectToSave.IsNew == false && objectToSave.IsDirty == false)
                {
                    var objectFromDatabase = DataProvider.Get(objectToSave);
                    objectFromDatabase.ObjectsDataSet.AddOrReplaceObject(objectToSave);
                    objectToSave = objectFromDatabase;
                }
            }
            else
            {
                objectToSave = DataObjectFactory.DeserializeObject(jsonIncomingEntity, settings);

                if (objectToSave != null)
                {
                    var dataset = ApplicationSettings.Container.Resolve <IObjectsDataSet>();
                    dataset.AddObject(objectToSave);
                    objectToSave.IsDirty = true;                     // Force Save
                }
            }

            if (objectToSave != null)
            {
                objectToSave.ObjectsDataSet.EnsureInitialized();
                objectToSave.ObjectsDataSet.ReconstructIndexes();
            }

            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = objectToSave.IsNew ? "CREATE" : "UPDATE", context = "BEFORE SAVE", data = ""
            });

            string response = String.Empty;
            var    result   = DataProvider.Save(objectToSave, null, request.IncludeList);

            if (result == null)
            {
                if (!objectToSave.IsMarkedForDeletion)
                {
                    throw new ResourceNotFoundException();
                }
                else
                {
                    response = null;
                }
            }
            else
            {
                result.ObjectsDataSet.SerializeTechnicalProperties = false;

                if (!request.IsDatasetApi)
                {
                    result.ObjectsDataSet.InitializeRelationsToInclude(typeof(TENTITY), request.Includes);
                }

                object dataToSerialize = request.IsDatasetApi ? DataObjectFactory.CreateDataSetContainer(result) : result;

                response = JsonConvert.SerializeObject(dataToSerialize, settings);
            }

            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = objectToSave.IsNew ? "CREATE" : "UPDATE", context = "JSON WRITE", data = response
            });

            WriteResponse(request.HttpContext, response);
        }