//TODO - Remove same character id from same team public static HttpStatusCode Command(int userId, Models.Enums.TeamType teamType, int newUserCharacterId, int?oldUserCharacterId) { using (var db = new ClanRePlannerContext()) { var teams = db.UserTeamCharacter.Where(x => x.UserId == userId); //Remove old character from your team if (oldUserCharacterId.HasValue) { var userTeamCharacterToRemove = teams.Single(x => x.TeamTypeId == (int)teamType && x.UserCharacterId == oldUserCharacterId); db.UserTeamCharacter.Remove(userTeamCharacterToRemove); //Remove borrowed character from other teams using it if support if (teamType == Models.Enums.TeamType.Support) { var userTeamCharactersToRemove = db.UserTeamCharacter.Where(x => x.UserCharacterId == oldUserCharacterId.Value).ToList(); if (userTeamCharactersToRemove.Any()) { db.UserTeamCharacter.RemoveRange(userTeamCharactersToRemove); } } } //If you're adding a unit that exists in the same team, do nothing var existsInSameTeam = teams.Any(x => x.UserCharacterId == newUserCharacterId && x.TeamTypeId == (int)teamType); if (existsInSameTeam) { return(HttpStatusCode.OK); } //If you're adding a unit to a normal team, remove the unit from other teams if (teamType != Models.Enums.TeamType.Support) { var unitToRemoveFromOtherTeam = teams .SingleOrDefault(x => x.UserCharacterId == newUserCharacterId && x.TeamTypeId != (int)Models.Enums.TeamType.Support); if (unitToRemoveFromOtherTeam != default(UserTeamCharacter)) { db.UserTeamCharacter.Remove(unitToRemoveFromOtherTeam); } } //If you're adding a unit to a team that contains the same character, remove the old unit var selectedCharacterId = db.UserCharacters.Single(x => x.UserCharacterId == newUserCharacterId).CharacterId; var matchingCharacter = teams .SingleOrDefault(x => x.UserCharacter.CharacterId == selectedCharacterId && (int)teamType == x.TeamTypeId); if (matchingCharacter != default(UserTeamCharacter)) { db.UserTeamCharacter.Remove(matchingCharacter); } //Add unit to team var userTeamCharacterToAdd = new UserTeamCharacter() { UserCharacterId = newUserCharacterId, UserId = userId, TeamTypeId = (int)teamType, }; db.UserTeamCharacter.Add(userTeamCharacterToAdd); try { db.SaveChanges(); } catch (Exception e) { return(HttpStatusCode.ServiceUnavailable); } return(HttpStatusCode.OK); } }
public static HttpStatusCode Command(int userId, SelectedCharacterDto[] selectedCharacters) { using (var db = new ClanRePlannerContext()) { var userCharactersToUpdate = new List <UserCharacter>(); var userCharactersToAdd = new List <UserCharacter>(); var userCharactersToDelete = new List <UserCharacter>(); var oldUserCharacters = db.UserCharacters.Where(x => x.UserId == userId).ToList(); var selectedUserCharacters = selectedCharacters.Select(x => new UserCharacter { UserId = userId, CharacterId = x.CharacterId, Stars = x.Stars, }); if (oldUserCharacters.Any()) { var matchedUserCharacters = oldUserCharacters .Intersect(selectedUserCharacters, new UserCharacterComparer()).ToList(); foreach (var matchedDbUserCharacter in matchedUserCharacters) { var newStarValue = selectedUserCharacters.Single(x => x.UserId == matchedDbUserCharacter.UserId && x.CharacterId == matchedDbUserCharacter.CharacterId).Stars; matchedDbUserCharacter.Stars = newStarValue; } userCharactersToUpdate = matchedUserCharacters; userCharactersToAdd = selectedUserCharacters .Except(oldUserCharacters, new UserCharacterComparer()).ToList(); userCharactersToDelete = oldUserCharacters .Except(selectedUserCharacters, new UserCharacterComparer()).ToList(); } else { userCharactersToAdd = selectedUserCharacters.ToList(); } if (userCharactersToUpdate.Any()) { db.UserCharacters.UpdateRange(userCharactersToUpdate); } if (userCharactersToAdd.Any()) { db.UserCharacters.AddRange(userCharactersToAdd); } if (userCharactersToDelete.Any()) { db.UserCharacters.RemoveRange(userCharactersToDelete); } try { db.SaveChanges(); } catch (Exception e) { return(HttpStatusCode.ServiceUnavailable); } return(HttpStatusCode.OK); } }