Ejemplo n.º 1
0
        public async Task MergeArenas(ArenaSessionModel source, ArenaSessionModel target)
        {
            if (source == null || target == null || source.Hero == null || target.Hero == null || source.Hero.Id != target.Hero.Id)
            {
                Log.Error("Error merging arenas, null parameters or heroes are not the same.");
                return;
            }

            using (var context = this.dbContext())
            {
                var sourceArena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == source.Id);
                var targetArena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == target.Id);
                if (sourceArena == null || targetArena == null)
                {
                    Log.Error("Error merging arenas, source or target does not exist");
                    return;
                }

                var updatedGames = new List<GameResult>();
                foreach (var sourceGame in sourceArena.Games)
                {
                    AddGameToArena(sourceGame, targetArena);
                    updatedGames.Add(sourceGame);
                }

                for (int i = sourceArena.Games.Count - 1; i >= 0; i--)
                {
                    sourceArena.Games.Remove(sourceArena.Games[i]);
                }

                context.ArenaSessions.Remove(sourceArena);

                SetEndDateIfNeeded(targetArena);

                await context.SaveChangesAsync();

                target.MapFrom(targetArena);
                this.events.PublishOnBackgroundThread(new ArenaSessionDeleted(source));
                this.events.PublishOnBackgroundThread(new ArenaSessionUpdated(targetArena.Id));
                foreach (var game in updatedGames)
                {
                    this.events.PublishOnBackgroundThread(new GameResultUpdated(game.Id, game.ArenaSessionId));
                }
            }
        }