public async Task <IHttpActionResult> GetAbility(int id)
        {
            Ability ability = await db.Abilities.Include(a => a.OriginalAbilityOwner).FirstOrDefaultAsync(a => a.AbilityId == id);

            if (ability == null)
            {
                return(NotFound());
            }
            var dto = AbilityDataTransferObject.CreateAbilityDataTransferObject(ability);

            return(Ok(dto));
        }
        public async Task <IHttpActionResult> PostAbility(AbilityDataTransferObject ability)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            var modelAbility = ability.ToAbilityModel();

            if (ability.OriginalAbilityOwnerId == null || ability.OriginalAbilityOwnerId == 0)
            {//if passed in ability has no originalhero set.
                modelAbility.OriginalAbilityOwner = null;
            }
            else
            { //there was a passed in originalabilityowner
                //lookup hero id in database
                var dataSourcePassedInAbilityOriginalHero = await db.Heroes.FirstOrDefaultAsync(h => h.HeroId == ability.OriginalAbilityOwnerId);

                if (dataSourcePassedInAbilityOriginalHero != null)
                {
                    modelAbility.OriginalAbilityOwner = dataSourcePassedInAbilityOriginalHero;
                }
                else
                {
                    return(BadRequest("An original ability owner with that ID could not be found."));
                }
            }

            db.Abilities.Add(modelAbility);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (AbilityExists(ability.AbilityId))
                {
                    return(Conflict());
                }
                else
                {
                    throw;
                }
            }

            return(CreatedAtRoute("DefaultApi", new { id = ability.AbilityId }, ability));
        }
        public async Task <IHttpActionResult> PutAbility(int id, AbilityDataTransferObject ability)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != ability.AbilityId)
            {
                return(BadRequest());
            }

            var dataSourceAbility = await db.Abilities.Include(a => a.OriginalAbilityOwner).FirstOrDefaultAsync(a => a.AbilityId == id);

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

            var attachedEntry = db.Entry(dataSourceAbility);

            attachedEntry.CurrentValues.SetValues(ability); //copy values from dto to data source object.

            if (ability.OriginalAbilityOwnerId == null || ability.OriginalAbilityOwnerId == 0)
            {//if passed in ability has no originalhero set.
                dataSourceAbility.OriginalAbilityOwner = null;
            }
            else
            { //there was a passed in originalabilityowner
                //check if the id of passed in ability is the same as one already in db
                var needToUpdate = dataSourceAbility.OriginalAbilityOwner == null ? true : dataSourceAbility.OriginalAbilityOwner.HeroId == ability.OriginalAbilityOwnerId;
                var dataSourcePassedInAbilityOriginalHero = await db.Heroes.FirstOrDefaultAsync(h => h.HeroId == ability.OriginalAbilityOwnerId);

                if (dataSourcePassedInAbilityOriginalHero != null)
                {
                    dataSourceAbility.OriginalAbilityOwner = dataSourcePassedInAbilityOriginalHero;
                }
                else
                {
                    return(BadRequest("An original ability owner with that ID could not be found."));
                }
            }

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

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!AbilityExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }