public IHttpActionResult Put(int id, [FromBody] DAO.BusinessCategory businessCategory)
 {
     try
     {
         if (businessCategory == null)
         {
             return(BadRequest());
         }
         //map
         var bc     = _businessCategoryFactory.CreateBusinessCategory(businessCategory);
         var result = _repository.UpdateBusinessCategory(bc);
         if (result.Status == BookingRepositoryActionStatus.Updated)
         {
             // map to dao
             var updatedBusinessCategory = _businessCategoryFactory.CreateBusinessCategory(result.Entity);
             return(Ok(updatedBusinessCategory));
         }
         else if (result.Status == BookingRepositoryActionStatus.NotFound)
         {
             return(NotFound());
         }
         return(BadRequest());
     }
     catch (Exception)
     {
         return(InternalServerError());
     }
 }
 public IHttpActionResult Post([FromBody] DAO.BusinessCategory businessCategory)
 {
     try
     {
         if (businessCategory == null)
         {
             return(BadRequest());
         }
         var bc     = _businessCategoryFactory.CreateBusinessCategory(businessCategory);
         var result = _repository.InsertBusinessCategory(bc);
         if (result.Status == BookingRepositoryActionStatus.Created)
         {
             var newBusinessCategory = _businessCategoryFactory.CreateBusinessCategory(result.Entity);
             return(Created(Request.RequestUri + "/" + newBusinessCategory.Id.ToString(), newBusinessCategory));
         }
         return(BadRequest());
     }
     catch (Exception)
     {
         return(InternalServerError());
     }
 }
        public object CreateDataShapedObject(DAO.BusinessCategory businessCategory, List <string> lstOfFields)
        {
            // work with a new instance, as we'll manipulate this list in this method
            List <string> lstOfFieldsToWorkWith = new List <string>(lstOfFields);

            if (!lstOfFieldsToWorkWith.Any())
            {
                return(businessCategory);
            }
            else
            {
                // does it include any business-related field?
                var lstOfBusinessFields = lstOfFieldsToWorkWith.Where(f => f.Contains("businesses")).ToList();

                // if one of those fields is "businesses", we need to ensure the FULL business is returned.  If
                // it's only subfields, only those subfields have to be returned.

                bool returnPartialBusiness = lstOfBusinessFields.Any() && !lstOfBusinessFields.Contains("businesses");

                // if we don't want to return the full business, we need to know which fields
                if (returnPartialBusiness)
                {
                    // remove all business-related fields from the list of fields,
                    // as we will use the CreateDateShapedObject function in BusinessFactory
                    // for that.

                    lstOfFieldsToWorkWith.RemoveRange(lstOfBusinessFields);
                    lstOfBusinessFields = lstOfBusinessFields.Select(f => f.Substring(f.IndexOf(".") + 1)).ToList();
                }
                else
                {
                    // we shouldn't return a partial business, but the consumer might still have
                    // asked for a subfield together with the main field, ie: business,business.id.  We
                    // need to remove those subfields in that case.

                    lstOfBusinessFields.Remove("businesses");
                    lstOfFieldsToWorkWith.RemoveRange(lstOfBusinessFields);
                }

                // create a new ExpandoObject & dynamically create the properties for this object

                // if we have an expense

                ExpandoObject objectToReturn = new ExpandoObject();
                foreach (var field in lstOfFieldsToWorkWith)
                {
                    // need to include public and instance, b/c specifying a binding flag overwrites the
                    // already-existing binding flags.

                    var fieldValue = businessCategory.GetType()
                                     .GetProperty(field, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance)
                                     .GetValue(businessCategory, null);


                    // add the field to the ExpandoObject
                    ((IDictionary <String, Object>)objectToReturn).Add(field, fieldValue);
                }

                if (returnPartialBusiness)
                {
                    // add a list of businesses, and in that, add all those businesses
                    List <object> businesses = new List <object>();
                    foreach (var business in businessCategory.Businesses)
                    {
                        businesses.Add(businessFactory.CreateDataShapedObject(business, lstOfBusinessFields));
                    }

                    ((IDictionary <String, Object>)objectToReturn).Add("businesses", businesses);
                }


                return(objectToReturn);
            }
        }