public async Task <CharacterModifier> AddModifiersAsync(NaheulbookExecutionContext executionContext, int characterId, AddCharacterModifierRequest request) { using (var uow = _unitOfWorkFactory.CreateUnitOfWork()) { var character = await uow.Characters.GetWithGroupAsync(characterId); if (character == null) { throw new CharacterNotFoundException(characterId); } _authorizationUtil.EnsureCharacterAccess(executionContext, character); var characterModifier = _mapper.Map <CharacterModifier>(request); characterModifier.Character = character; uow.CharacterModifiers.Add(characterModifier); uow.CharacterHistoryEntries.Add(_characterHistoryUtil.CreateLogAddModifier(character, characterModifier)); await uow.SaveChangesAsync(); var session = _notificationSessionFactory.CreateSession(); session.NotifyCharacterAddModifier(characterId, characterModifier); await session.CommitAsync(); return(characterModifier); } }
public Task ExecuteAsync( NhbkAction action, ActionContext context, INotificationSession notificationSession ) { if (action.Type != ActionType) { throw new InvalidActionTypeException(action.Type, ActionType); } if (action.Data?.Modifier == null) { throw new InvalidActionDataException(action.Type); } var modifier = action.Data.Modifier; var characterModifier = new CharacterModifier { Name = modifier.Name, Permanent = false, DurationType = modifier.DurationType, Duration = modifier.Duration, Type = modifier.Type, Description = modifier.Description, Reusable = modifier.Reusable, IsActive = true, CombatCount = modifier.CombatCount, CurrentCombatCount = modifier.CombatCount, TimeDuration = modifier.TimeDuration, CurrentTimeDuration = modifier.TimeDuration, LapCount = modifier.LapCount, CurrentLapCount = modifier.LapCount, Values = modifier.Values.Select(v => new CharacterModifierValue { Type = v.Type, StatName = v.Stat, Value = v.Value }).ToList() }; if (context.TargetCharacter.Modifiers == null) { context.TargetCharacter.Modifiers = new List <CharacterModifier>(); } context.TargetCharacter.Modifiers.Add(characterModifier); context.TargetCharacter.AddHistoryEntry(_characterHistoryUtil.CreateLogAddModifier(context.TargetCharacter, characterModifier)); notificationSession.NotifyCharacterAddModifier(context.TargetCharacter.Id, characterModifier, true); return(Task.CompletedTask); }
public async Task AddModifiersAsync_ShouldLog() { const int characterId = 4; var character = new Character(); var characterHistoryEntry = new CharacterHistoryEntry(); var request = new AddCharacterModifierRequest(); var characterModifier = new CharacterModifier(); _mapper.Map <CharacterModifier>(request) .Returns(characterModifier); _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithGroupAsync(characterId) .Returns(character); _characterHistoryUtil.CreateLogAddModifier(character, characterModifier) .Returns(characterHistoryEntry); await _service.AddModifiersAsync(new NaheulbookExecutionContext(), characterId, request); Received.InOrder(() => { _unitOfWorkFactory.GetUnitOfWork().CharacterHistoryEntries.Add(characterHistoryEntry); _unitOfWorkFactory.GetUnitOfWork().Received(1).SaveChangesAsync(); }); }
public async Task ExecuteAsync( NhbkAction action, ActionContext context, INotificationSession notificationSession ) { if (action.Type != ActionType) { throw new InvalidActionTypeException(action.Type, ActionType); } if (action.Data == null) { throw new InvalidActionDataException(action.Type); } if (!action.Data.EffectId.HasValue) { throw new InvalidActionDataException(action.Type); } if (action.Data.EffectData == null) { throw new InvalidActionDataException(action.Type); } var effect = await context.UnitOfWork.Effects.GetWithEffectWithModifiersAsync(action.Data.EffectId.Value); if (effect == null) { throw new EffectNotFoundException(); } var combatCount = effect.CombatCount; var timeDuration = effect.TimeDuration; var duration = effect.Duration; var lapCount = effect.LapCount; var customDurationType = action.Data.EffectData.Value <string?>("durationType"); if (!string.IsNullOrEmpty(customDurationType)) { timeDuration = null; duration = null; combatCount = null; lapCount = null; switch (customDurationType) { case "combat": combatCount = action.Data.EffectData.Value <int?>("combatCount"); break; case "time": timeDuration = action.Data.EffectData.Value <int?>("timeDuration"); break; case "custom": duration = action.Data.EffectData.Value <string>("duration"); break; case "lap": lapCount = action.Data.EffectData.Value <int?>("lapCount"); break; case "forever": break; default: throw new InvalidCustomDurationActionException(customDurationType); } } var characterModifier = new CharacterModifier { Name = effect.Name, Permanent = false, DurationType = customDurationType ?? effect.DurationType, Duration = duration, Type = effect.SubCategory.Name, Description = effect.Description, Reusable = false, IsActive = true, CombatCount = combatCount, CurrentCombatCount = combatCount, TimeDuration = timeDuration, CurrentTimeDuration = timeDuration, LapCount = lapCount, CurrentLapCount = lapCount, Values = effect.Modifiers.Select(v => new CharacterModifierValue { Type = v.Type, StatName = v.StatName, Value = v.Value }).ToList() }; if (context.TargetCharacter.Modifiers == null) { context.TargetCharacter.Modifiers = new List <CharacterModifier>(); } context.TargetCharacter.Modifiers.Add(characterModifier); context.TargetCharacter.AddHistoryEntry(_characterHistoryUtil.CreateLogAddModifier(context.TargetCharacter, characterModifier)); notificationSession.NotifyCharacterAddModifier(context.TargetCharacter.Id, characterModifier, true); }