Esempio n. 1
0
        public void ConditionalFieldChangeTestForGroup()
        {
            var mock  = new MockedProject();
            var claim = mock.CreateClaim(mock.Group, mock.Player);

            FieldSaveHelper.SaveCharacterFields(
                mock.Player.UserId,
                claim,
                new Dictionary <int, string>()
            {
                { mock.ConditionalField.ProjectFieldId, "test" }
            });
            Assert.AreEqual($"{{\"{mock.ConditionalField.ProjectFieldId}\":\"test\"}}", claim.JsonData);
            Assert.AreEqual(_original.Character.JsonData, mock.Character.JsonData,
                            "Adding claim should not modify any character fields");
        }
        public void TryToChangeAnotherUserCharacter()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock = new MockedProject();

            Should.Throw <NoAccessToProjectException>(() =>
                                                      FieldSaveHelper.SaveCharacterFields(
                                                          mock.Player.UserId,
                                                          mock.Character,
                                                          new Dictionary <int, string>()
            {
                { mock.CharacterField.ProjectFieldId, "test" },
            },
                                                          _generator));
        }
Esempio n. 3
0
        public void TryToChangeMasterOnlyFieldOnAdd()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock = new MockedProject();

            _ = Should.Throw <NoAccessToProjectException>(() =>
                                                          FieldSaveHelper.SaveCharacterFields(
                                                              mock.Player.UserId,
                                                              mock.CreateClaim(mock.Character, mock.Player),
                                                              new Dictionary <int, string?>()
            {
                { mock.MasterOnlyField.ProjectFieldId, "test" },
            },
                                                              _generator));
        }
Esempio n. 4
0
        public void HiddenFieldChangeFailedTest()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock  = new MockedProject();
            var claim = mock.CreateClaim(mock.Group, mock.Player);

            Should.Throw <NoAccessToProjectException>(() =>
                                                      FieldSaveHelper.SaveCharacterFields(
                                                          mock.Player.UserId,
                                                          claim,
                                                          new Dictionary <int, string>()
            {
                { mock.HideForUnApprovedClaim.ProjectFieldId, "test" },
            },
                                                          _generator));
        }
Esempio n. 5
0
        public void ApprovedClaimChangeTest()
        {
            var mock  = new MockedProject();
            var claim = mock.CreateClaim(mock.Character, mock.Player);

            claim.ClaimStatus = Claim.Status.Approved;
            FieldSaveHelper.SaveCharacterFields(
                mock.Player.UserId,
                claim,
                new Dictionary <int, string>()
            {
                { mock.CharacterField.ProjectFieldId, "test" }
            });
            Assert.AreEqual(
                $"{{\"{mock.CharacterField.ProjectFieldId}\":\"test\",\"{mock.PublicField.ProjectFieldId}\":\"Public\"}}",
                mock.Character.JsonData);
            Assert.AreEqual("{}", claim.JsonData);
        }
        public void ApprovedClaimHiddenChangeTest()
        {
            var mock  = new MockedProject();
            var claim = mock.CreateApprovedClaim(mock.Character, mock.Player);

            FieldSaveHelper.SaveCharacterFields(
                mock.Player.UserId,
                claim,
                new Dictionary <int, string>()
            {
                { mock.HideForUnApprovedClaim.ProjectFieldId, "test" },
                { mock.CharacterField.ProjectFieldId, null }
            },
                generator);
            Assert.AreEqual(
                $"{{\"{mock.HideForUnApprovedClaim.ProjectFieldId}\":\"test\",\"{mock.PublicField.ProjectFieldId}\":\"Public\"}}",
                mock.Character.JsonData);
            Assert.AreEqual("{}", claim.JsonData);
        }
Esempio n. 7
0
        public void DisableUnapprovedClaimToChangeCharacterTest()
        {
            var mock  = new MockedProject();
            var claim = mock.CreateClaim(mock.Character, mock.Player);

            FieldSaveHelper.SaveCharacterFields(
                mock.Player.UserId,
                claim,
                new Dictionary <int, string>()
            {
                { mock.CharacterField.ProjectFieldId, "test" }
            });
            Assert.AreEqual(_original.Character.JsonData, mock.Character.JsonData, "Adding claim should not modify any character fields");
            CollectionAssert.AreEqual(
                _original.Character.Groups.Select(g => g.CharacterGroupId).ToList(),
                mock.Character.Groups.Select(g => g.CharacterGroupId).ToList(),
                "Adding claim should not modify any character groups");
            Assert.AreEqual($"{{\"{mock.CharacterField.ProjectFieldId}\":\"test\"}}", claim.JsonData);
        }
Esempio n. 8
0
        public void ApprovedClaimChangeTest()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock  = new MockedProject();
            var claim = mock.CreateApprovedClaim(mock.Character, mock.Player);

            FieldSaveHelper.SaveCharacterFields(
                mock.Player.UserId,
                claim,
                new Dictionary <int, string>()
            {
                { mock.CharacterField.ProjectFieldId, "test" },
            },
                _generator);

            mock.Character.FieldValuesShouldBe(new FieldWithValue(mock.CharacterField, "test"));

            ShouldBeTestExtensions.ShouldBe(claim.JsonData, "{}");
        }
Esempio n. 9
0
        public void MasterHiddenChangeTest()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock        = new MockedProject();
            var publicField = new FieldWithValue(mock.PublicField, "Public");

            MockedProject.AssignFieldValues(mock.Character, publicField);
            FieldSaveHelper.SaveCharacterFields(
                mock.Master.UserId,
                mock.Character,
                new Dictionary <int, string>()
            {
                { mock.HideForUnApprovedClaim.ProjectFieldId, "test" },
                { mock.CharacterField.ProjectFieldId, null },
            },
                _generator);

            mock.Character.FieldValuesShouldBe(new FieldWithValue(mock.HideForUnApprovedClaim, "test"), publicField);
        }
Esempio n. 10
0
        public async Task SaveFieldsFromClaim(int projectId,
            int characterId,
            IReadOnlyDictionary<int, string?> newFieldValue)
        {
            //TODO: Prevent lazy load here - use repository 
            var claim = await LoadProjectSubEntityAsync<Claim>(projectId, characterId);

            var updatedFields = FieldSaveHelper.SaveCharacterFields(CurrentUserId, claim, newFieldValue,
              FieldDefaultValueGenerator);
            if (updatedFields.Any(f => f.Field.FieldBoundTo == FieldBoundTo.Character) && claim.Character != null)
            {
                MarkChanged(claim.Character);
            }
            var user = await GetCurrentUser();
            var email = EmailHelpers.CreateFieldsEmail(claim, s => s.FieldChange, user, updatedFields);

            await UnitOfWork.SaveChangesAsync();

            await EmailService.Email(email);
        }
        public void SaveOnAddTest()
        {
            var mock  = new MockedProject();
            var claim = mock.CreateClaim(mock.Character, mock.Player);

            // ReSharper disable once MustUseReturnValue
            FieldSaveHelper.SaveCharacterFields(
                mock.Player.UserId,
                claim,
                new Dictionary <int, string>()
            {
                { mock.CharacterField.ProjectFieldId, "test" }
            },
                generator);
            Assert.AreEqual(_original.Character.JsonData, mock.Character.JsonData, "Adding claim should not modify any character fields");
            CollectionAssert.AreEqual(
                _original.Character.Groups.Select(g => g.CharacterGroupId).ToList(),
                mock.Character.Groups.Select(g => g.CharacterGroupId).ToList(),
                "Adding claim should not modify any character groups");
            Assert.AreEqual($"{{\"{mock.CharacterField.ProjectFieldId}\":\"test\"}}", claim.JsonData);
        }
Esempio n. 12
0
        public void ConditionalFieldChangeTestForGroup()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock             = new MockedProject();
            var claim            = mock.CreateClaim(mock.Group, mock.Player);
            var conditionalField = mock.CreateConditionalField();

            FieldSaveHelper.SaveCharacterFields(
                mock.Player.UserId,
                claim,
                new Dictionary <int, string>()
            {
                { conditionalField.ProjectFieldId, "test" },
            },
                _generator);
            ShouldBeTestExtensions.ShouldBe(claim.JsonData,
                                            $"{{\"{conditionalField.ProjectFieldId}\":\"test\"}}");
            ShouldBeTestExtensions.ShouldBe(mock.Character.JsonData,
                                            _original.Character.JsonData,
                                            "Adding claim should not modify any character fields");
        }
Esempio n. 13
0
        public void SkipOptionalField()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock = new MockedProject();

            mock.CharacterField.MandatoryStatus = MandatoryStatus.Optional;

            var claim = mock.CreateApprovedClaim(mock.Character, mock.Player);

            var exception = Should.NotThrow(() =>
                                            FieldSaveHelper.SaveCharacterFields(
                                                mock.Player.UserId,
                                                claim,
                                                new Dictionary <int, string>()
            {
                { mock.CharacterField.ProjectFieldId, "" },
            },
                                                _generator));

            mock.Character.JsonData.ShouldBe("{}");
        }
Esempio n. 14
0
        public void TryToSkipMandatoryField()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock = new MockedProject();

            mock.CharacterField.MandatoryStatus = MandatoryStatus.Required;

            var claim = mock.CreateApprovedClaim(mock.Character, mock.Player);

            var exception = Should.Throw <FieldRequiredException>(() =>
                                                                  FieldSaveHelper.SaveCharacterFields(
                                                                      mock.Player.UserId,
                                                                      claim,
                                                                      new Dictionary <int, string>()
            {
                { mock.CharacterField.ProjectFieldId, "" },
            },
                                                                      _generator));

            exception.FieldName.ShouldBe(mock.CharacterField.FieldName);
        }
        public async Task AddCharacter(AddCharacterRequest addCharacterRequest)
        {
            var project = await ProjectRepository.GetProjectAsync(addCharacterRequest.ProjectId);

            _ = project.RequestMasterAccess(CurrentUserId, acl => acl.CanEditRoles);
            _ = project.EnsureProjectActive();

            var character = new Character
            {
                ParentCharacterGroupIds =
                    await ValidateCharacterGroupList(addCharacterRequest.ProjectId, Required(addCharacterRequest.ParentCharacterGroupIds)),
                ProjectId              = addCharacterRequest.ProjectId,
                IsPublic               = addCharacterRequest.IsPublic,
                IsActive               = true,
                IsAcceptingClaims      = addCharacterRequest.IsAcceptingClaims,
                HidePlayerForCharacter = addCharacterRequest.HidePlayerForCharacter,
                IsHot = addCharacterRequest.IsHot,
            };

            Create(character);
            MarkTreeModified(project);

            if (project.Details.CharacterNameLegacyMode)
            {
                character.CharacterName = Required(addCharacterRequest.Name);
                // If not legacy mode, character name will be updated inside SaveCharacterFields(..)
            }

            // ReSharper disable once MustUseReturnValue
            //TODO we do not send message for creating character
            _ = FieldSaveHelper.SaveCharacterFields(CurrentUserId,
                                                    character,
                                                    addCharacterRequest.FieldValues,
                                                    FieldDefaultValueGenerator);

            await UnitOfWork.SaveChangesAsync();
        }
Esempio n. 16
0
        public void ApprovedClaimHiddenChangeTest()
        {
            _original  = new MockedProject();
            _generator = new MockedFieldDefaultValueGenerator();
            var mock  = new MockedProject();
            var claim = mock.CreateApprovedClaim(mock.Character, mock.Player);

            var publicField = new FieldWithValue(mock.PublicField, "Public");

            MockedProject.AssignFieldValues(claim, publicField);

            _ = FieldSaveHelper.SaveCharacterFields(
                mock.Player.UserId,
                claim,
                new Dictionary <int, string?>()
            {
                { mock.HideForUnApprovedClaim.ProjectFieldId, "test" },
                { mock.CharacterField.ProjectFieldId, null },
            },
                _generator);

            mock.Character.FieldValuesShouldBe(new FieldWithValue(mock.HideForUnApprovedClaim, "test"), publicField);
            ShouldBeTestExtensions.ShouldBe(claim.JsonData, "{}");
        }
        public async Task EditCharacter(int currentUserId,
                                        int characterId,
                                        int projectId,
                                        string name,
                                        bool isPublic,
                                        IReadOnlyCollection <int> parentCharacterGroupIds,
                                        bool isAcceptingClaims,
                                        bool hidePlayerForCharacter,
                                        IReadOnlyDictionary <int, string?> characterFields,
                                        bool isHot)
        {
            var character = await LoadProjectSubEntityAsync <Character>(projectId, characterId);

            _ = character.RequestMasterAccess(currentUserId, acl => acl.CanEditRoles);

            _ = character.EnsureProjectActive();

            var changedAttributes = new Dictionary <string, PreviousAndNewValue>();

            if (character.Project.Details.CharacterNameLegacyMode)
            {
                changedAttributes.Add("Имя персонажа",
                                      new PreviousAndNewValue(name, character.CharacterName.Trim()));
                character.CharacterName = name.Trim();
                // If not legacy mode, character name will be updated inside SaveCharacterFields(..)
            }

            character.IsAcceptingClaims = isAcceptingClaims;
            character.IsPublic          = isPublic;

            character.HidePlayerForCharacter = hidePlayerForCharacter;
            character.IsHot    = isHot;
            character.IsActive = true;

            character.ParentCharacterGroupIds = await ValidateCharacterGroupList(projectId,
                                                                                 Required(parentCharacterGroupIds),
                                                                                 ensureNotSpecial : true);

            var changedFields = FieldSaveHelper.SaveCharacterFields(currentUserId,
                                                                    character,
                                                                    characterFields,
                                                                    FieldDefaultValueGenerator);

            MarkChanged(character);
            MarkTreeModified(character.Project); //TODO: Can be smarter

            FieldsChangedEmail?email = null;

            changedAttributes = changedAttributes
                                .Where(attr => attr.Value.DisplayString != attr.Value.PreviousDisplayString)
                                .ToDictionary(x => x.Key, x => x.Value);

            if (changedFields.Any() || changedAttributes.Any())
            {
                var user = await UserRepository.GetById(currentUserId);

                email = EmailHelpers.CreateFieldsEmail(
                    character,
                    s => s.FieldChange,
                    user,
                    changedFields,
                    changedAttributes);
            }

            await UnitOfWork.SaveChangesAsync();

            if (email != null)
            {
                await EmailService.Email(email);
            }
        }
Esempio n. 18
0
        public async Task AddClaimFromUser(int projectId,
                                           int?characterGroupId,
                                           int?characterId,
                                           string claimText,
                                           IReadOnlyDictionary <int, string> fields)
        {
            var source = await ProjectRepository.GetClaimSource(projectId, characterGroupId, characterId);

            source.EnsureCanAddClaim(CurrentUserId);

            var responsibleMaster = source.GetResponsibleMasters().FirstOrDefault();
            var claim             = new Claim()
            {
                CharacterGroupId        = characterGroupId,
                CharacterId             = characterId,
                ProjectId               = projectId,
                PlayerUserId            = CurrentUserId,
                PlayerAcceptedDate      = Now,
                CreateDate              = Now,
                ClaimStatus             = Claim.Status.AddedByUser,
                ResponsibleMasterUserId = responsibleMaster?.UserId,
                ResponsibleMasterUser   = responsibleMaster,
                LastUpdateDateTime      = Now,
                CommentDiscussion       = new CommentDiscussion()
                {
                    CommentDiscussionId = -1, ProjectId = projectId
                },
            };

            if (!string.IsNullOrWhiteSpace(claimText))
            {
                claim.CommentDiscussion.Comments.Add(new Comment
                {
                    CommentDiscussionId = -1,
                    AuthorUserId        = CurrentUserId,
                    CommentText         = new CommentText {
                        Text = new MarkdownString(claimText)
                    },
                    CreatedAt         = Now,
                    IsCommentByPlayer = true,
                    IsVisibleToPlayer = true,
                    ProjectId         = projectId,
                    LastEditTime      = Now,
                    ExtraAction       = CommentExtraAction.NewClaim,
                });
            }

            UnitOfWork.GetDbSet <Claim>().Add(claim);

            var updatedFields = FieldSaveHelper.SaveCharacterFields(CurrentUserId, claim, fields, FieldDefaultValueGenerator);

            var claimEmail = await CreateClaimEmail <NewClaimEmail>(claim, claimText ?? "", s => s.ClaimStatusChange,
                                                                    CommentExtraAction.NewClaim);

            claimEmail.UpdatedFields = updatedFields;

            await UnitOfWork.SaveChangesAsync();

            await EmailService.Email(claimEmail);

            if (claim.Project.Details.AutoAcceptClaims)
            {
                var userId = claim.ResponsibleMasterUserId ?? claim.Project.ProjectAcls.First().UserId;
                StartImpersonate(userId);
                //TODO[Localize]
                await ApproveByMaster(projectId,
                                      claim.ClaimId,
                                      "Ваша заявка была принята автоматически");

                ResetImpersonation();
            }
        }
Esempio n. 19
0
        public async Task <int> MoveToSecondRole(int projectId, int claimId, int characterId)
        {
            var oldClaim = (await ClaimsRepository.GetClaim(projectId, claimId)).RequestAccess(CurrentUserId); //TODO Specific right

            oldClaim.EnsureStatus(Claim.Status.CheckedIn);

            Debug.Assert(oldClaim.Character != null, "oldClaim.Character != null");
            oldClaim.Character.InGame = false;
            MarkChanged(oldClaim.Character);

            var source = await CharactersRepository.GetCharacterAsync(projectId, characterId);

            MarkChanged(source);

            // TODO improve valitdation here
            //source.EnsureCanMoveClaim(oldClaim);

            var responsibleMaster = source.GetResponsibleMasters().FirstOrDefault();
            var claim             = new Claim()
            {
                CharacterGroupId        = null,
                CharacterId             = characterId,
                ProjectId               = projectId,
                PlayerUserId            = oldClaim.PlayerUserId,
                PlayerAcceptedDate      = Now,
                CreateDate              = Now,
                ClaimStatus             = Claim.Status.Approved,
                CurrentFee              = 0,
                ResponsibleMasterUserId = responsibleMaster?.UserId,
                ResponsibleMasterUser   = responsibleMaster,
                LastUpdateDateTime      = Now,
                MasterAcceptedDate      = Now,
                CommentDiscussion       =
                    new CommentDiscussion()
                {
                    CommentDiscussionId = -1, ProjectId = projectId
                },
            };

            claim.CommentDiscussion.Comments.Add(new Comment
            {
                CommentDiscussionId = -1,
                AuthorUserId        = CurrentUserId,
                CommentText         = new CommentText {
                    Text = new MarkdownString(".")
                },
                CreatedAt         = Now,
                IsCommentByPlayer = false,
                IsVisibleToPlayer = true,
                ProjectId         = projectId,
                LastEditTime      = Now,
                ExtraAction       = CommentExtraAction.SecondRole,
            });

            oldClaim.ClaimStatus = Claim.Status.Approved;
            source.ApprovedClaim = claim;
            AddCommentImpl(oldClaim, null, ".", true, CommentExtraAction.OutOfGame);


            UnitOfWork.GetDbSet <Claim>().Add(claim);

            // ReSharper disable once UnusedVariable TODO decide if we should send email if FieldDefaultValueGenerator changes something
            var updatedFields =
                FieldSaveHelper.SaveCharacterFields(CurrentUserId, claim, new Dictionary <int, string>(),
                                                    FieldDefaultValueGenerator);

            await UnitOfWork.SaveChangesAsync();

            var claimEmail = await CreateClaimEmail <SecondRoleEmail>(claim, "",
                                                                      s => s.ClaimStatusChange,
                                                                      CommentExtraAction.NewClaim);

            await EmailService.Email(claimEmail);

            return(claim.ClaimId);
        }