public IHttpActionResult GetProperty(int id)
        {
            loggedInUser = GetLoggedInUser();

            Entity.Models.Property propertyEntity = db.Properties.FirstOrDefault(p => p.CompanyId == loggedInUser.CompanyId && p.Id == id); //loggedInUser.Properties.FirstOrDefault(p => p.Id == id);
            if (propertyEntity == null)
            {
                return(NotFound());
            }

            if (propertyEntity.CompanyId != loggedInUser.CompanyId)
            {
                return(BadRequest("Requested property does not belong to same company as logged in user"));
            }

            // Fortunately, our we have a relationship be user and associated properties, so this is easy.
            var propertyDto = Mapper.Map <Entity.Models.Property, Dto.Models.Property>(propertyEntity);

            GenerateUserPhotoLinks(propertyDto.Users);

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

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

            return(Ok(propertyDto));
        }
        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));
        }
Beispiel #3
0
        public bool CreateUser(Entity.Models.User model, out string password)
        {
            try
            {
                password = PasswordGenerator.Generate();

                var graphModel = new Create()
                {
                    AccountEnabled  = true,
                    GivenName       = model.FirstName,
                    Surname         = model.LastName,
                    PasswordProfile = new PasswordProfile()
                    {
                        Password = password
                    },
                    SignInNames = new List <SignInName>()
                    {
                        new SignInName()
                        {
                            Value = model.EmailAddress
                        }
                    }
                };
                var result = JObject.Parse(Post("/users", JsonConvert.SerializeObject(graphModel, new JsonSerializerSettings()
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                })));

                model.AuthId = result.Value <string>("objectId");

                return(true);
            }
            catch (Exception e)
            {
                model.AuthId = null;

                password = null;

                return(false);
            }
        }
        public IHttpActionResult GetProperties([FromUri] PropertyListRequest requestParams)       
        {
            loggedInUser = GetLoggedInUser();

            if (requestParams == null)
            {
                return BadRequest("Property list request parameters are missing");
            }

            
            var result = new PropertyListRequestValidator().Validate(requestParams);
            if (!result.IsValid)
            {
                return new ValidatorError("Error validating page request parameters", HttpStatusCode.BadRequest, result, Request);
            }
                 
            // Get properties based on parameters we got
            var paginatedList = GetPaginatedPropertyList(requestParams);

            return Ok(paginatedList);
        }
        public IHttpActionResult DeleteProperty(int id)
        {
            loggedInUser = GetLoggedInUser();

            var propertyEntity = db.Properties.FirstOrDefault(p => p.CompanyId == loggedInUser.CompanyId && p.Id == id);

            if (propertyEntity == null)
            {
                return(NotFound());
            }

            if (propertyEntity.CompanyId != loggedInUser.CompanyId)
            {
                return(BadRequest("Requested property does not belong to same company as logged in user"));
            }

            // Get DTO object before deleting or this will fail.
            var propertyDto = Mapper.Map <Entity.Models.Property, Dto.Models.Property>(propertyEntity);

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

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

            // EF diagram won't support cascade deletes on many-to-many relationships, so we have to manually
            // delete properties for user here.
            foreach (var u in propertyEntity.Users)
            {
                u.Properties.Remove(propertyEntity);
            }

            db.Properties.Remove(propertyEntity);

            db.SaveChanges();

            return(Ok(propertyDto));
        }
        public IHttpActionResult GetProperties([FromUri] PropertyListRequest requestParams)
        {
            loggedInUser = GetLoggedInUser();

            if (requestParams == null)
            {
                return(BadRequest("Property list request parameters are missing"));
            }


            var result = new PropertyListRequestValidator().Validate(requestParams);

            if (!result.IsValid)
            {
                return(new ValidatorError("Error validating page request parameters", HttpStatusCode.BadRequest, result, Request));
            }

            // Get properties based on parameters we got
            var paginatedList = GetPaginatedPropertyList(requestParams);

            return(Ok(paginatedList));
        }
        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));
        }
        public IHttpActionResult DeleteProperty(int id)
        {
            loggedInUser = GetLoggedInUser();
            
            var propertyEntity = db.Properties.FirstOrDefault(p => p.CompanyId == loggedInUser.CompanyId && p.Id == id);
            if (propertyEntity == null)
            {
                return NotFound();
            }

            if (propertyEntity.CompanyId != loggedInUser.CompanyId)
            {
                return BadRequest("Requested property does not belong to same company as logged in user");
            }
           
            // Get DTO object before deleting or this will fail.
            var propertyDto = Mapper.Map<Entity.Models.Property, Dto.Models.Property>(propertyEntity);
            GenerateUserPhotoLinks(propertyDto.Users);
            var result = new PropertyValidator().Validate(propertyDto);
            if (!result.IsValid)
            {
                return new ValidatorError("Error mapping property DTO from database", HttpStatusCode.InternalServerError, result, Request);
            }

            // EF diagram won't support cascade deletes on many-to-many relationships, so we have to manually
            // delete properties for user here.
            foreach (var u in propertyEntity.Users)
            {
                u.Properties.Remove(propertyEntity);
            }

            db.Properties.Remove(propertyEntity);
         
            db.SaveChanges();

            return Ok(propertyDto);
        }
        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);
        }
        public IHttpActionResult GetProperty(int id)
        {
            loggedInUser = GetLoggedInUser();
            
            Entity.Models.Property propertyEntity = db.Properties.FirstOrDefault(p => p.CompanyId == loggedInUser.CompanyId && p.Id == id); //loggedInUser.Properties.FirstOrDefault(p => p.Id == id);
            if (propertyEntity == null)
            {
                return NotFound();
            }

            if (propertyEntity.CompanyId != loggedInUser.CompanyId)
            {
                return BadRequest("Requested property does not belong to same company as logged in user");
            }

            // Fortunately, our we have a relationship be user and associated properties, so this is easy.
            var propertyDto = Mapper.Map<Entity.Models.Property, Dto.Models.Property>(propertyEntity);
            GenerateUserPhotoLinks(propertyDto.Users);

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

            return Ok(propertyDto);
        }