public async Task <object> GetCharacters(string account_name)
        {
            WarcraftAcct account_entry = await GetAccountID(account_name);

            //does not return deleted accounts characters
            if (account_entry != null && account_entry.active == true)
            {
                return(new
                {
                    account_id = account_entry.account_id,
                    characters = await GetActiveCharacterList(account_entry.account_id)
                });
            }
            return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Account Error: Does Not Exist/Inactive"));
        }
        public async Task <object> Delete(string account_name)
        {
            WarcraftAcct account_entry = await GetAccountID(account_name);

            if (account_entry != null)
            {
                //if account exists delete
                //if account exists and deleted then undelete
                account_entry.active           = !account_entry.active;
                _db.Entry(account_entry).State = EntityState.Modified;
                await _db.SaveChangesAsync();

                return(new { account = FirstToUpper(account_name), active = account_entry.active });
            }
            return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Request Error: Account Invalid"));
        }
        public async Task <object> DeleteCharacter(string account_name, string character_name)
        {
            WarcraftAcct account_entry = await GetAccountID(account_name);

            //only allow character manipulation if account is not deleted
            if (account_entry != null && account_entry.active == true)
            {
                List <Character> account_CharList = await GetAllCharacterList(account_entry.account_id);

                //go through all the past characters to check for
                //the most recent character or most recent deleted character
                //matching the given name
                string faction = "";
                if (account_CharList != null)
                {
                    if (account_CharList[0].active == true)
                    {
                        faction = account_CharList[0].faction;
                    }
                    foreach (Character c in account_CharList)
                    {
                        if (c.name == FirstToUpper(character_name.ToLower()) &&
                            (faction.Length == 0 || faction == c.faction))
                        {
                            //if char exists delete
                            //if char exists and deleted then undelete

                            c.active           = !c.active;
                            _db.Entry(c).State = EntityState.Modified;
                            await _db.SaveChangesAsync();

                            return(new
                            {
                                account = FirstToUpper(account_entry.account_name),
                                character = FirstToUpper(character_name.ToLower()),
                                active = c.active
                            });
                        }
                    }
                }
            }
            return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Request Error: Account or Character Invalid"));
        }
        public async Task <object> CreateAccount(HttpRequestMessage requestBody)
        {
            try
            {
                string     body             = requestBody.Content.ReadAsStringAsync().Result;
                NewAccount deserial_account = null;

                //build a new entry for account table
                WarcraftAcct new_entry = new WarcraftAcct();
                deserial_account = JsonConvert.DeserializeObject <NewAccount>(body);

                //try to map JSON to account obj will throw on invalid
                //inputs or format
                if (body.Contains(",") || deserial_account == null ||
                    !acct_model.AccountEntryIsValid(deserial_account.name))
                {
                    throw new InvalidOperationException();
                }
                new_entry.account_name = FirstToUpper(deserial_account.name);
                new_entry.active       = true;

                List <int> account_match = await(from q in _db.WarcraftAccts
                                                 where q.account_name == new_entry.account_name
                                                 select q.account_id).ToListAsync();
                //check for name collisions

                if (account_match.FirstOrDefault() == 0)
                {
                    _db.WarcraftAccts.Add(new_entry);
                    await _db.SaveChangesAsync();

                    return(new { account_id = new_entry.account_id });
                }
            }
            catch (Exception ex)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Request Error: Account or Request Body Invalid"));
            }
            return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Account Error: Account Name Already Exists"));
        }
        public async Task <object> CreateCharacter(string account_name, HttpRequestMessage body)
        {
            try
            {
                //try to map JSON to character obj will throw on invalid
                //inputs or format
                Character char_entry = null;
                char_entry = JsonConvert.DeserializeObject <Character>(body.Content.ReadAsStringAsync().Result);
                if (char_entry == null || !char_model.CharEntryIsValid(char_entry))
                {
                    throw new InvalidOperationException();
                }

                //make input easier on the user
                char_entry.name = FirstToUpper(char_entry.name.ToLower());

                //only allow character creation if account has not been deleted
                //and account exists
                WarcraftAcct account_entry = await GetAccountID(account_name);

                if (account_entry == null || account_entry.active == false)
                {
                    throw new InvalidOperationException();
                }
                //continue building new character entry
                char_entry.account_id = account_entry.account_id;
                char_entry.active     = true;
                char_model.UpdateCasing(char_entry);
                //does the character meet faction/class/race/level requirements
                List <bool> cs = await(from q in _db.CharSelections
                                       where q.faction == char_entry.faction &&
                                       q.race == char_entry.race &&
                                       q.@class == char_entry.@class &&
                                       q.startlvl <= char_entry.level &&
                                       q.maxlvl >= char_entry.level
                                       select q.enabled).ToListAsync();

                if (cs.FirstOrDefault())
                {
                    List <Character> active_charList = await GetActiveCharacterList(char_entry.account_id);

                    if (active_charList != null)
                    {
                        foreach (Character c in active_charList)
                        {
                            if (c.faction != char_entry.faction || c.name == char_entry.name)
                            {
                                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Character Conflict: Name/Faction"));
                            }
                        }
                    }
                    _db.Characters.Add(char_entry);
                    await _db.SaveChangesAsync();

                    return(new
                    {
                        character_id = char_entry.character_id
                    });
                }
            }
            catch (Exception ex)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Request Error: Account or Request Body Invalid"));
            }

            return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Character Conflict: Invalid Character Option"));
        }