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)); }