public async Task <bool> DeleteChainAsync(int gameId) { var success = true; var gameEntity = _context.Find(typeof(GameEntity), gameId) as GameEntity; if (gameEntity != null) { var randomDrawEvents = from Chain in gameEntity.Chain join evnt in gameEntity.Events on Chain.Id equals evnt.Id where evnt.Type == EventType.RandomDraw select evnt; // clear any random draw jobs foreach (var randomDraw in randomDrawEvents) { await _randomDrawEventService.ClearDrawExecutionJobs(randomDraw.Id); } gameEntity.Chain = null; foreach (var id in _context.Entries.Where(x => x.GameId == gameId).Select(e => e.Id)) { var entity = new EntryEntity { Id = id }; _context.Entries.Attach(entity); _context.Entries.Remove(entity); } foreach (var id in _context.Players.Where(x => x.GameId == gameId).Select(e => e.Id)) { var entity = new PlayerEntity { Id = id }; _context.Players.Attach(entity); _context.Players.Remove(entity); } //gameEntity.Entries.Clear(); // clear all entries for this game. //gameEntity.Players.Clear(); // clear all players for this game. } else { success = false; } await _context.SaveChangesAsync(); return(success); }
public async Task <bool> DeleteEventAsync(int eventId) { var success = true; var entityToUpdate = _context.Find(typeof(EventEntity), eventId) as EventEntity; if (entityToUpdate != null) { var game = _context.Find(typeof(GameEntity), entityToUpdate.GameId) as GameEntity; var chainCount = 0; if (entityToUpdate.Game.Chain != null) { chainCount = entityToUpdate.Game.Chain.Count(x => x.Id == entityToUpdate.Id); } if (chainCount > 0) { var randomDrawEvents = from Chain in game.Chain join evnt in game.Events on Chain.Id equals evnt.Id where evnt.Type == EventType.RandomDraw select evnt; // clear any random draw jobs foreach (var randomDraw in randomDrawEvents) { await _randomDrawEventService.ClearDrawExecutionJobs(randomDraw.Id); } game.Chain = null; // remove chain for this game too as the event is being used in the chain. foreach (var id in _context.Entries.Where(x => x.GameId == game.Id).Select(e => e.Id)) { var entity = new EntryEntity { Id = id }; _context.Entries.Attach(entity); _context.Entries.Remove(entity); } foreach (var id in _context.Players.Where(x => x.GameId == game.Id).Select(e => e.Id)) { var entity = new PlayerEntity { Id = id }; _context.Players.Attach(entity); _context.Players.Remove(entity); } //game.Entries.Clear(); // clear all entries for this game. //game.Players.Clear(); // clear all players for this game. } _context.Events.Remove(entityToUpdate); } else { success = false; } await _context.SaveChangesAsync(); return(success); }
/// <summary> /// Attempt to manually advance an events entry. /// </summary> /// <param name="entry"></param> /// <returns>Will return true if move successfull.</returns> public async Task <bool> ManuallyAdvanceEntry(EntryEntity entry) { var currentEvent = await _context.Events.FirstAsync(x => x.Id == entry.State); var chain = entry.Game.Chain.SingleOrDefault(x => x.Id == entry.State); if (currentEvent.TransitionType == TransitionType.Timed && currentEvent.ManualAdvance == true) // if manual advance should be true. { // then if valid this entry should move on to the next event state. // first check the pass round var successeventId = chain.SuccessEvent ?? 0; var faileventId = chain.FailEvent ?? 0; if (currentEvent.Type == EventType.RandomDraw) { // check event state to see if its been drawn already var state = currentEvent.EventState.ToObject <RandomEventState>(); if (!state.IsDrawn) { await _randomDrawEventService.ClearDrawExecutionJobs(currentEvent.Id); if (await _randomDrawEventService.ExecuteDraw(currentEvent.Id)) { state.HangfireJobId = "ManualAdvanceTrigger"; state.IsDrawn = true; await _context.SaveChangesAsync(); } } return(true); } if (currentEvent.Type == EventType.Moderate) { // Then they entries must be moderated to move onto the next event. return(false); } // all other manual advances will try success event then fail. if (successeventId != 0) { if (await ValidateMove(entry, successeventId)) { entry.State = successeventId; await _context.SaveChangesAsync(); return(true); } } if (faileventId != 0) { if (await ValidateMove(entry, faileventId)) { entry.State = faileventId; await _context.SaveChangesAsync(); return(true); } } } return(false); }