Esempio n. 1
0
        public void SendRequestDeniedMessage(UserAggregate forAgg, List <PermissionAggregate> deniedPermissions)
        {
            try
            {
                var PermissionNames = new List <string>();
                foreach (var permission in deniedPermissions)
                {
                    PermissionNames.Add(permission.Name);
                }

                var requests = String.Join(", ", PermissionNames.ToArray());

                //recipient address
                _mail.To.Add(new MailAddress(forAgg.Email));
                _mail.Subject = "*******Request Denied********";
                //Formatted mail body
                _mail.IsBodyHtml = true;
                string message = "Hello " + forAgg.FirstName + " " + forAgg.LastName + ", the request(s) for your access to the following: " + requests + ", was denied. ";
                _mail.Body = message;
                _smtp.Send(_mail);
            }
            catch (Exception)
            {
            }
        }
Esempio n. 2
0
        public void SendPermissionsUpdatedMessage(UserAggregate forAgg, List <PermissionAggregate> revokedPermissions, List <PermissionAggregate> grantedPermissions)
        {
            try
            {
                var revokedPermissionNames = new List <string>();
                foreach (var permission in revokedPermissions)
                {
                    revokedPermissionNames.Add(permission.Name);
                }

                var revokedPermissionsString = String.Join(", ", revokedPermissionNames.ToArray());

                var grantedPermissionNames = new List <string>();
                foreach (var permission in grantedPermissions)
                {
                    grantedPermissionNames.Add(permission.Name);
                }

                var grantedPermissionsString = String.Join(", ", grantedPermissionNames.ToArray());

                //recipient address
                _mail.To.Add(new MailAddress(forAgg.Email));
                _mail.Subject = "*******Permissions Updated********";
                //Formatted mail body
                _mail.IsBodyHtml = true;
                string message = "Hello " + forAgg.FirstName + " " + forAgg.LastName + ", The following permissions have been Revoked: " + revokedPermissionsString + ". The following permissions have been Granted: " + grantedPermissionsString + ". ";
                _mail.Body = message;
                _smtp.Send(_mail);
            }
            catch (Exception)
            {
            }
        }
Esempio n. 3
0
        public void Registration(UserDTO User)
        {
            UserAggregate UserAgg = new UserAggregate(new UserEntity()
            {
                ID                 = User.ID,
                UserName           = User.UserName,
                Email              = User.Email,
                PasswordHash       = User.PasswordHash,
                PasswordRepeatHash = User.PasswordRepeatHash,
                IsActive           = true
            });

            List <string> ValidationResult = UserAgg.Validation(ValidationStateEnum.Registation);

            if (ValidationResult.Count == 0)
            {
                var UserData = UserAgg.GetUser();
                _UserRepository.Registration(new UserDTO()
                {
                    ID                 = UserData.ID,
                    UserName           = UserData.UserName,
                    Email              = UserData.Email,
                    PasswordHash       = UserData.PasswordHash,
                    PasswordRepeatHash = UserData.PasswordRepeatHash,
                });
            }
            else
            {
                throw new CustomException(ValidationResult);
            }
        }
Esempio n. 4
0
        public void setup_session_to_return_correct_aggregate(UserAggregate agg, PermissionAggregate permAgg)
        {
            // Get UserAggregate
            SessionMock.Setup(a => a.Get <UserAggregate>(It.IsAny <Guid>(), It.IsAny <int?>(), It.IsAny <CancellationToken>()))
            .Callback(() =>
            {
                SessionGetWasCalled = true;
            })
            .Returns(Task.FromResult(agg));

            // Get PermissionAggregate
            SessionMock.Setup(a => a.Get <PermissionAggregate>(It.IsAny <Guid>(), It.IsAny <int?>(), It.IsAny <CancellationToken>()))
            .Callback(() =>
            {
                SessionGetPermisisonWasCalled = true;
            })
            .Returns(Task.FromResult(permAgg));

            // Commit
            SessionMock.Setup(a => a.Commit(It.IsAny <CancellationToken>()))
            .Callback(() =>
            {
                SessionCommitWasCalled = true;
            })
            .Returns(Task.FromResult(0));
        }
Esempio n. 5
0
        public Task Consume(ConsumeContext <UserRegister> context)
        {
            var aggregate = new UserAggregate();

            aggregate.RegisterUser(new UserDetails()
            {
                AnnualIncomeBeforeTax = context.Message.AnnualIncomeBeforeTax,
                DoB                         = context.Message.DoB,
                Email                       = context.Message.Email,
                EmploymentStatus            = context.Message.EmploymentStatus,
                Firstname                   = context.Message.Firstname,
                HomeOwnership               = context.Message.HomeOwnership,
                Lastname                    = context.Message.Lastname,
                LoanReason                  = context.Message.LoanReason,
                MonthlyMortgageContribution = context.Message.MonthlyMortgageContribution,
                MonthlyRentContribution     = context.Message.MonthlyRentContribution,
                PhoneNumber                 = context.Message.PhoneNumber,
                Title                       = context.Message.Title,
                UserId                      = context.Message.UserId
            });

            repository.Save(aggregate);

            return(Task.FromResult(0));
        }
Esempio n. 6
0
        /// <summary>Создает пару JWT токенов для пользователя</summary>
        /// <param name="user">Аутентифицируемый пользователь</param>
        /// <returns>Пара Access/refresh JWT токенов</returns>
        private LoginResponse CreateTokensPair(UserAggregate user)
        {
            // Создание списка Claim'ов
            var claims = new List <Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
                new Claim(JwtRegisteredClaimNames.UniqueName, user.Username),
                new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role)
            };

            // Генерация Access и Refresh токенов
            var accessTokenRaw  = _jwtAccessOptions.GenerateToken(claims);
            var refreshTokenRaw = _jwtRefreshOptions.GenerateToken(claims);

            var securityHandler = new JwtSecurityTokenHandler();

            var accessToken  = securityHandler.WriteToken(accessTokenRaw);
            var refreshToken = securityHandler.WriteToken(refreshTokenRaw);

            // Формирование ответа от сервера
            var loginResponse = new LoginResponse()
            {
                AccessToken  = accessToken,
                ExpiresIn    = accessTokenRaw.ValidTo.ToEpochTime(),
                RefreshToken = refreshToken,
            };

            return(loginResponse);
        }
Esempio n. 7
0
        public Guid Login(LoginDTO User)
        {
            UserAggregate UserAgg = new UserAggregate(new UserEntity()
            {
                UserName     = User.UserName,
                PasswordHash = User.PasswordHash
            });

            List <string> ValidationResult = UserAgg.Validation(ValidationStateEnum.Login);

            if (ValidationResult.Count == 0)
            {
                var UserData = UserAgg.GetUser();
                return(_UserRepository.Login(new LoginDTO()
                {
                    UserName = UserData.UserName,
                    PasswordHash = UserData.PasswordHash,
                    SessionID = UserData.SessionID
                }));
            }
            else
            {
                throw new CustomException(ValidationResult);
            }
        }
Esempio n. 8
0
        public async Task <IdentityResult> Handle(Command request, CancellationToken cancellationToken)
        {
            var user = await _userManager.FindByIdAsync(request.Id);

            var allUserRoles = await _context.UserRoles.Where(x => x.UserId == request.Id)
                               .Join(_context.Roles, ur => ur.RoleId, r => r.Id, (ur, r) => new { r.Id, r.Name })
                               .ToListAsync(cancellationToken);

            List <string> rolesToRemove = allUserRoles.Where(x => !request.RolesId.Contains(x.Id)).Select(x => x.Name).ToList();

            List <string> rolesId = allUserRoles.Select(x => x.Id).ToList();

            List <string> rolesToAddIds = request.RolesId.Where(x => !rolesId.Contains(x)).ToList();

            List <string> rolesToAddNames = await _context.Roles.Where(x => rolesToAddIds.Contains(x.Id))
                                            .Select(x => x.Name).ToListAsync(cancellationToken);

            foreach (string roleName in rolesToRemove)
            {
                await _userManager.RemoveFromRoleAsync(user, roleName);
            }

            foreach (string roleName in rolesToAddNames)
            {
                await _userManager.AddToRoleAsync(user, roleName);
            }
            user = UserAggregate.FromState(user).Update(request).State;

            IdentityResult updateResult = await _userManager.UpdateAsync(user);

            return(updateResult);
        }
        public void UserController_GetByUsername_ReturnUser()
        {
            using (DatabaseContext databaseContext = DatabaseTestFactory.GetSession())
            {
                var user01 = UserAggregate.Create("jsmith", "*****@*****.**", "password hash", "security stamp");
                var user02 = UserAggregate.Create("mjane", "*****@*****.**", "password hash", "security stamp");

                databaseContext.Set <UserAggregate>().AddRange(new[] { user01, user02 });
                databaseContext.SaveChanges();
            }

            using (WebApp.Start <Startup>(url: iisAddress))
            {
                HttpClient client = new HttpClient();
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));
                var response = client.GetAsync(String.Format("{0}UserRead?username={1}", iisAddress, "jsmith")).Result;
                response.StatusCode.Should().Be(HttpStatusCode.OK);
                var result = response.Content.ReadAsStringAsync().Result;

                Debug.WriteLine(response.Content.ReadAsStringAsync().Result);

                var user = JsonConvert.DeserializeObject <UserMessage>(result);

                user.Username.Should()
                .Be("jsmith");
            }
        }
Esempio n. 10
0
        public UserAggregate GetUserInfo(string accountNumber)
        {
            var user   = session.Query <User>().FirstOrDefault(x => x.AccountNumber == accountNumber);
            var ammout = session.Load <AccountUpdateEvent>($"{user.Id}/Events").Updates.Sum(x => x.Ammount);

            return(UserAggregate.Create(user, ammout));
        }
Esempio n. 11
0
        public void setup_session_to_return_aggregate_with_requested_permission(UserAggregate agg, PermissionAggregate permAgg)
        {
            SessionCommitWasCalled = false;

            var input = new RequestUserPermissionsDTO
            {
                ForId    = agg.Id,
                ById     = agg.Id,
                Requests = new Dictionary <Guid, PermissionDetails>
                {
                    {
                        permAgg.Id, new PermissionDetails
                        {
                            Reason = "testReason"
                        }
                    }
                }
            };

            agg.UserRequestedPermissions(new List <PermissionAggregate> {
                permAgg
            }, input);

            SessionMock.Setup(a => a.Get <UserAggregate>(It.IsAny <Guid>(), It.IsAny <int?>(), It.IsAny <CancellationToken>()))
            .Callback(() =>
            {
                SessionGetWasCalled = true;
            })
            .Returns(Task.FromResult(agg));
        }
Esempio n. 12
0
        public async Task It_should_delete_entity_and_record_change_log()
        {
            // Given
            var user = new UserAggregate(Guid.NewGuid(), "Bond");

            using var db = NewDbContext();
            db.Users.Add(user);
            await db.SaveChangesAsync();

            // When
            user.Delete();
            var changeLog = user.Changes.GetUncommittedChanges().ToList();

            db.Users.Remove(user);
            await db.SaveChangesAsync();

            // Then
            db.DetachAll();
            var savedUser = await db.Users.FindAsync(user.Id);

            var savedChangeLog = (await LoadChangeLog(user.StreamId)).AsEnumerable()
                                 .Reverse()
                                 .Take(changeLog.Count)
                                 .Reverse()
                                 .ToList();

            savedUser.Should().BeNull();
            for (var i = 0; i < savedChangeLog.Count; i++)
            {
                savedChangeLog[i].Should().BeEquivalentTo((object)changeLog[i]);
                savedChangeLog[i].Should().BeOfType(changeLog[i].GetType());
            }
        }
Esempio n. 13
0
        /**
         * filters actions taken according to the forAgg's permissionList's event type, and the event types being passed in
         *
         * Ex: if a forAgg's permission list has VisualStudio permission's  eventType as "revoked", we do not want to be able to revoke it again, so we
         * remove it from the list of actions.
         */
        private Dictionary <Guid, PermissionDetails> VerifyActions(UserAggregate forAgg, UserAggregate byAgg, Dictionary <Guid, PermissionDetails> requests, List <string> eventTypesToRemove)
        {
            var result           = new Dictionary <Guid, PermissionDetails>();
            var markedForRemoval = new List <Guid>();

            foreach (var request in requests)
            {
                result[request.Key] = request.Value;
                //if forAgg's permission list contains a definition for that permission
                if (forAgg.PermissionList.ContainsKey(request.Key))
                {
                    // if the definition of that permission is one of the eventTypes to remove, remove it from requests.
                    if (eventTypesToRemove.Contains(
                            JsonConvert.DeserializeObject <string>(forAgg.PermissionList[request.Key].EventType)))
                    {
                        markedForRemoval.Add(request.Key);
                    }
                    else
                    {
                        //might not even need this******because admin rights are handled in the aggregate.
                        //(admins can override eventTypes) Otherwise, if they are not an admin, remove it from requests
                        if (!byAgg.IsAdmin)
                        {
                            markedForRemoval.Add(request.Key);
                        }
                    }
                } // if the permission list does not contain, this case will be handled by the aggregate since admins can do
                  // whatever they want. and the aggregate will restrict user actions based on that
            }

            markedForRemoval.ForEach(a => result.Remove(a));

            return(result);
        }
        public void UserAggregate_Delete_WillDelete()
        {
            // create
            using (DatabaseContext databaseContext = DatabaseTestFactory.GetSession())
            {
                var user = UserAggregate.Create("raffaeu", "*****@*****.**",
                                                "password hash", "security stamp");
                databaseContext.Set <UserAggregate>().Add(user);
                databaseContext.SaveChanges();
            }

            // delete
            using (DatabaseContext databaseContext = DatabaseTestFactory.GetSession())
            {
                var user = databaseContext.Set <UserAggregate>().First();
                databaseContext.Set <UserAggregate>().Remove(user);

                databaseContext.SaveChanges();
            }

            // verify
            using (DatabaseContext databaseContext = DatabaseTestFactory.GetSession())
            {
                databaseContext.Set <UserAggregate>().Count().Should().Be(0);
            }
        }
        public void UserAggregate_AddClaim_WillPersist()
        {
            // create
            using (DatabaseContext databaseContext = DatabaseTestFactory.GetSession())
            {
                var user = UserAggregate.Create("raffaeu", "*****@*****.**",
                                                "password hash", "security stamp");

                user.AddClaim("LOCAL AUTHORITY", "LOCAL AUTHORITY", "schema", "Raffaeu", "schema#string");


                databaseContext.Set <UserAggregate>().Add(user);
                databaseContext.SaveChanges();
            }

            // verify
            using (DatabaseContext databaseContext = DatabaseTestFactory.GetSession())
            {
                var expectedUser = databaseContext.Set <UserAggregate>()
                                   .Include(x => x.Claims)
                                   .First();

                expectedUser.Claims.Count.Should().Be(1);
            }
        }
        public void It_should_reply_change_log()
        {
            // Given
            var id          = Random.NextGuid();
            var name        = Random.GetString();
            var changedName = Random.GetString();
            var history     = new IDomainEvent[]
            {
                new UserRegistered {
                    Id = id, Name = name
                },
                new UserNameChanged {
                    Name = changedName
                }
            };

            // When
            var user = new UserAggregate();

            user.Changes.LoadFromHistory(history);

            // Then
            Assert.That(user.Changes.GetUncommittedChanges(), Is.Empty);
            Assert.That(user.Id, Is.EqualTo(id));
            Assert.That(user.Name, Is.EqualTo(changedName));
            Assert.That(user.Version, Is.EqualTo(2));
        }
        public async Task AddAndRetrieve_MultipleSimpleObjects_Success()
        {
            var unitOfWork = new UserUnitOfWork(Database, CollectionName);

            var person1 = new UserAggregate()
            {
                FirstName = "John",
                Surname   = "Smith"
            };
            var person2 = new UserAggregate()
            {
                FirstName = "Jane",
                Surname   = "Doe"
            };

            unitOfWork.Users.Add(person1);
            unitOfWork.Users.Add(person2);
            await unitOfWork.CommitAsync();

            var person1Result = await unitOfWork.Users.QuerySingleAsync(user => user.Id == person1.Id);

            var person2Result = await unitOfWork.Users.QuerySingleAsync(user => user.Id == person2.Id);

            Assert.IsNotNull(person1Result);
            Assert.IsNotNull(person2Result);
        }
        public void It_should_record_change_log_when_entity_is_updated()
        {
            // Given
            var id          = Random.NextGuid();
            var name        = Random.GetString();
            var changedName = Random.GetString();
            var user        = new UserAggregate(id, name);

            user.Changes.MarkChangesAsCommitted();

            // When
            user.Rename(changedName);

            // Then
            var changes = user.Changes.GetUncommittedChanges().ToList();

            Assert.That(changes, Has.Count.EqualTo(1));
            Assert.That(changes[0], Is.TypeOf <UserNameChanged>());
            var evt = (UserNameChanged)changes[0];

            Assert.That(evt.Id, Is.EqualTo(id));
            Assert.That(evt.Name, Is.EqualTo(changedName));
            Assert.That(evt.Version, Is.EqualTo(2));
            Assert.That(user.Version, Is.EqualTo(2));
        }
Esempio n. 19
0
        public async Task It_should_rollback_both_entity_and_change_log_within_sync_flow()
        {
            // Given
            var id        = Guid.NewGuid();
            var user      = new UserAggregate(id, "Bond");
            var changeLog = user.Changes.GetUncommittedChanges().ToList();

            using var db = NewDbContext();
            db.Users.Add(user);
            await db.SaveChangesAsync();

            // When
            using (var tran = TransactionExt.Begin(IsolationLevel.ReadCommitted))
            {
                user.Rename("James Bond");
                db.SaveChanges();
            }

            // Then
            db.DetachAll();
            var savedUser = await db.Users.FindAsync(id);

            var savedChangeLog = await LoadChangeLog(user.StreamId);

            savedUser.Should().BeEquivalentTo(new UserAggregate(id, "Bond"));
            savedChangeLog.Should().HaveSameCount(changeLog);
            for (var i = 0; i < savedChangeLog.Count; i++)
            {
                savedChangeLog[i].Should().BeEquivalentTo((object)changeLog[i]);
                savedChangeLog[i].Should().BeOfType(changeLog[i].GetType());
            }
        }
        public void UserAggregate_Created_EmptyValues_IsNotValid()
        {
            var user = UserAggregate.Create(
                string.Empty, string.Empty,
                string.Empty, string.Empty);

            user.IsValid.Should().BeFalse();
        }
Esempio n. 21
0
        public CommandStatus Handle(CreateUserCommand message)
        {
            var user = new UserAggregate(_userService, message.Key, message.Name);

            _userStore.Save("Users", user);

            return(CommandStatus.Accepted);
        }
Esempio n. 22
0
        public void IncludeUpdateTest()
        {
            var userBuilder   = new UserAggregateBuilder();
            var userAggregate = userBuilder.GetRandomUserAggregate();
            var user          = UserAggregate.Update(userAggregate.Id, userAggregate);

            userAggregate.Should().BeEquivalentTo(user);
        }
        public void UserAggregate_Create_ValidValues_IsValid()
        {
            var user = UserAggregate.Create(
                "Username", "Email",
                "PasswordHash", "SecurityStamp");

            user.IsValid.Should().BeTrue();
        }
Esempio n. 24
0
        public async Task <Guid> Create(UserCreateRequest request)
        {
            var user = UserAggregate.CreateFromRequest(request);

            await _repo.Add(user);

            return(user.Id);
        }
        public async Task <UserId> SetAsync(UserAggregate aggregate)
        {
            var user = await ToModel(aggregate);

            _context.Users.Upsert(user);
            await _context.SaveChangesAsync();

            return(new UserId(user.Id));
        }
Esempio n. 26
0
        public async Task <Guid> Create(User item)
        {
            var user = UserAggregate.Create(item.Username, item.PasswordHash, item.Role);

            item.EnsureNotNull(nameof(item));
            await _userAggregateRepo.Add(user);

            return(item.Id);
        }
Esempio n. 27
0
        private void Commit(UserAggregate aggregate)
        {
            var changes = _repository.Save(aggregate);

            foreach (var change in changes)
            {
                _publisher.Publish(change);
            }
        }
Esempio n. 28
0
        public void Handle(StartUserRegistration c)
        {
            var aggregate = new UserAggregate {
                AggregateIdentifier = c.AggregateIdentifier
            };

            aggregate.StartRegistration(c.Name, c.Password);
            Commit(aggregate);
        }
Esempio n. 29
0
        public UserAggregate GetUserInfoFromSpan(string accountNumber, TimeSpan span)
        {
            var user   = session.Query <User>().FirstOrDefault(x => x.AccountNumber == accountNumber);
            var ammout =
                session.Load <AccountUpdateEvent>($"{user.Id}/Events")
                .Updates.Where(x => x.OccuredDate - DateTime.Now <= span)
                .Sum(x => x.Ammount);

            return(UserAggregate.Create(user, ammout));
        }
Esempio n. 30
0
        public void given_create_user_with_bad_input_should_throw_CreateUserDataNotFoundException()
        {
            // Assemble
            CreateUserInputDTO input = new CreateUserInputDTO();
            UserAggregate      agg;


            // Apply / Assert
            Assert.Throws <CreateUserDataNotFoundException>(() => agg = UserAggregate.CreateNewUser(input));
        }
        public void Given_a_user_When_updating_the_name_Then_update_name_event_is_witten_to_the_store()
        {
            var eventStore = new ListEventStore<IUserCommand>();
            var userAggregate = new UserAggregate();
            using (var user = new User(eventStore, userAggregate))
            {
                user.ChangeName("The Name");

                Assert.IsTrue(eventStore.Events.Any());
            }
        }