public IHttpActionResult NewProperty(Dto.Models.Property propertyDto)
        {
            loggedInUser = GetLoggedInUser();

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var result = new PropertyValidator().Validate(propertyDto);

            if (!result.IsValid)
            {
                return(new ValidatorError("Validation failed for new property DTO", HttpStatusCode.BadRequest, result, Request));
            }

            if (propertyDto.CompanyId != loggedInUser.CompanyId)
            {
                return(BadRequest("Property does not belong to same company as logged in user"));
            }
            else if (db.Properties.Count(p => p.CompanyId == loggedInUser.CompanyId && p.Id != propertyDto.Id && p.Name == propertyDto.Name) > 0)
            {
                return(new BadRequestErrorMessageResult("Another property has the same name as this property", this));
            }

            var propertyEntity = Mapper.Map <Dto.Models.Property, Entity.Models.Property>(propertyDto);

            if (propertyDto.Users != null)
            {
                var userIdList = propertyDto.Users.Select(u => u.Id);
                var newUsers   = db.Users.Where(u => userIdList.Contains(u.Id)).ToList();
                propertyEntity.Users = newUsers; // for this to work, existing Users must have been forced loaded.
            }

            var company = db.Companies.Find(propertyEntity.CompanyId);

            company.Properties.Add(propertyEntity);

            db.SaveChanges();

            propertyDto = Mapper.Map <Entity.Models.Property, Dto.Models.Property>(propertyEntity);
            GenerateUserPhotoLinks(propertyDto.Users);
            result = new PropertyValidator().Validate(propertyDto);

            if (!result.IsValid)
            {
                return(new ValidatorError("Error mapping property DTO from database", HttpStatusCode.InternalServerError, result, Request));
            }

            return(CreatedAtRoute("NewPropertyRoute", new { id = propertyDto.Id }, propertyDto));
        }
        public IHttpActionResult UpdateProperty(int id, Dto.Models.Property propertyDto)
        {
            loggedInUser = GetLoggedInUser();

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var result = new PropertyValidator().Validate(propertyDto);

            if (!result.IsValid)
            {
                return(new ValidatorError("Validation failed for updated property DTO", HttpStatusCode.BadRequest, result, Request));
            }

            if (id != propertyDto.Id)
            {
                return(new BadRequestErrorMessageResult("Updated property DTO id mismatch", this));
            }

            if (propertyDto.CompanyId != loggedInUser.CompanyId)
            {
                return(BadRequest("Updated property does not belong to same company as logged in user"));
            }
            else if (db.Properties.Count(p => p.CompanyId == loggedInUser.CompanyId && p.Id != propertyDto.Id && p.Name == propertyDto.Name) > 0)
            {
                return(new BadRequestErrorMessageResult("Another property has the same name as this property", this));
            }

            var propertyEntity = Mapper.Map <Dto.Models.Property, Entity.Models.Property>(propertyDto);

            db.Properties.Attach(propertyEntity);

            db.Entry(propertyEntity).State = EntityState.Modified;

            if (propertyDto.Users != null)
            {
                // Update Users for Property
                db.Entry(propertyEntity).Collection(u => u.Users).Load(); // force load
                var userIdList = propertyDto.Users.Select(u => u.Id);
                var newUsers   = db.Users.Where(u => userIdList.Contains(u.Id)).ToList();
                propertyEntity.Users = newUsers; // for this to work, existing Users must have been forced loaded.
            }

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!PropertyExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }