private bool dbPutAnimalGenus(int id, AnimalGenusRepresentation animalGenus)
        {
            var animalGenusInDb = db.AnimalGenuses.Find(id);

            if (animalGenusInDb == null)
            {
                return(false);
            }

            foreach (var animalType in animalGenusInDb.AnimalTypes)
            {
                animalType.AnimalGenus = null;
            }

            animalGenusInDb.AnimalTypes = new List <AnimalType>();

            foreach (var animalType in animalGenus.AnimalTypes)
            {
                var newAnimalType = new AnimalType {
                    Name = animalType.Name
                };
                db.AnimalTypes.Add(newAnimalType);
                newAnimalType.AnimalGenus = animalGenusInDb;
                animalGenusInDb.AnimalTypes.Add(newAnimalType);
            }

            foreach (var park in animalGenusInDb.Parks)
            {
                park.AnimalGenuses.Remove(animalGenusInDb);
            }

            animalGenusInDb.Parks = new List <Park>();

            foreach (var park in animalGenus.Parks)
            {
                var parkInDatabase = db.Parks.FirstOrDefault(elem => elem.Name == park.Name);
                if (parkInDatabase == null)
                {
                    parkInDatabase = new Park()
                    {
                        Name = park.Name
                    };
                }

                parkInDatabase.AnimalGenuses.Add(animalGenusInDb);
                animalGenusInDb.Parks.Add(parkInDatabase);
            }

            animalGenusInDb.Name = animalGenus.Name;

            db.SaveChanges();

            return(true);
        }
        private AnimalGenusRepresentation GetAnimalGenus(AnimalGenus animalGenus)
        {
            var representation = new AnimalGenusRepresentation()
            {
                Id   = animalGenus.Id,
                Name = animalGenus.Name
            };

            representation.Links.Add(LinkTemplates.AnimalGenuses.DeleteAnimalGenus.CreateLink(new { id = animalGenus.Id }));
            representation.Links.Add(LinkTemplates.AnimalGenuses.UpdateAnimalGenus.CreateLink(new { id = animalGenus.Id }));
            return(representation);
        }
        private AnimalGenusRepresentation GetAnimalGenus(AnimalGenus animalGenus)
        {
            var representation = new AnimalGenusRepresentation()
            {
                Id   = animalGenus.Id,
                Name = animalGenus.Name
            };

            representation.Links.Add(LinkTemplates.AnimalGenuses.DeleteAnimalGenus.CreateLink(new { id = animalGenus.Id }));
            representation.Links.Add(LinkTemplates.AnimalGenuses.UpdateAnimalGenus.CreateLink(new { id = animalGenus.Id }));
            representation.AnimalTypes = animalGenus.AnimalTypes.Select(animalType => GetAnimalType(animalType)).ToList();
            representation.Parks       = animalGenus.Parks.Select(park => GetPark(park)).ToList();
            return(representation);
        }
        public IHttpActionResult PutAnimalGenus(int id, AnimalGenusRepresentation animalGenus)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (dbPutAnimalGenus(id, animalGenus))
            {
                return(StatusCode(HttpStatusCode.NoContent));
            }
            else
            {
                return(NotFound());
            }
        }
        public IHttpActionResult PostAnimalGenus(AnimalGenusRepresentation animalGenus)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var animalGenusInDb = dbPostAnimalGenus(animalGenus);

            if (animalGenusInDb != null)
            {
                return(CreatedAtRoute("DefaultApi", new { id = animalGenusInDb.Id }, GetAnimalGenus(animalGenusInDb)));
            }
            else
            {
                return(BadRequest());
            }
        }
        private AnimalGenus dbPostAnimalGenus(AnimalGenusRepresentation animalGenus)
        {
            if (db.AnimalGenuses.FirstOrDefault(elem => elem.Name == animalGenus.Name) != null)
            {
                return(null);
            }

            var animalGenusInDb = new AnimalGenus()
            {
                Name = animalGenus.Name
            };

            db.AnimalGenuses.Add(animalGenusInDb);

            foreach (var park in animalGenus.Parks)
            {
                var parkInDb = db.Parks.FirstOrDefault(elem => elem.Name == park.Name);
                if (parkInDb == null)
                {
                    parkInDb = new Park()
                    {
                        Name = park.Name
                    };
                }
                parkInDb.AnimalGenuses.Add(animalGenusInDb);
                animalGenusInDb.Parks.Add(parkInDb);
            }

            foreach (var animalType in animalGenus.AnimalTypes)
            {
                var newAnimalType = new AnimalType {
                    Name = animalType.Name
                };
                db.AnimalTypes.Add(newAnimalType);
                newAnimalType.AnimalGenus = animalGenusInDb;
                animalGenusInDb.AnimalTypes.Add(newAnimalType);
            }

            db.SaveChanges();

            return(animalGenusInDb);
        }