Пример #1
0
        public void Initialize()
        {
            var inMemoryUserRepository     = new InMemoryUserRepository();
            var inMemoryGroupRepository    = new InMemoryGroupRepository();
            var inMemoryKeyRepository      = new InMemoryKeysRepository();
            var inMemorySanctionRepository = new InMemorySanctionRepository();
            var inMemoryEventRepository    = new InMemoryEventRepository();
            var groupSettings = new GroupSettings(2, 10, 0, 1000);
            var emailSender   = new Mock <IEmailSender>();
            var publisher     = new Mock <IEventPublisher>();

            userSettings = new UserSettings("");

            var adminKey = new Key("email", KeyAppointment.BecomeAdmin);

            inMemoryKeyRepository.AddKey(adminKey);

            _sanctionFacade = new SanctionFacade(inMemorySanctionRepository, inMemoryUserRepository, publisher.Object);
            _groupFacade    = new GroupFacade(inMemoryGroupRepository, inMemoryUserRepository, inMemorySanctionRepository,
                                              new GroupSettings(3, 100, 0, 1000), publisher.Object);
            _userFacade = new UserFacade(inMemoryUserRepository, inMemoryGroupRepository, inMemoryEventRepository,
                                         publisher.Object);
            _accountFacade = new AccountFacade(inMemoryKeyRepository, inMemoryUserRepository,
                                               emailSender.Object, userSettings);
            var creatorId = _accountFacade.RegUser("Alena", new Credentials("email", "password"), true, adminKey.Value);

            _groupCreator = _userFacade.GetUser(creatorId);
        }
Пример #2
0
 public void No_events_in_empty_repo()
 {
     using (var sut = new InMemoryEventRepository(""))
     {
         Assert.Equal(0, sut.Count);
     }
 }
Пример #3
0
        public void Initialize()
        {
            var emailSender     = new Mock <IEmailSender>();
            var keysRepository  = new InMemoryKeysRepository();
            var eventRepository = new InMemoryEventRepository();
            var groupRepository = new InMemoryGroupRepository();

            _userRepository = new InMemoryUserRepository();
            var fileRepository = new InMemoryFileRepository();

            _sanctionRepository = new InMemorySanctionRepository();
            var userSettings = new UserSettings("");
            var adminKey     = new Key("adminEmail", KeyAppointment.BecomeModerator);

            keysRepository.AddKey(adminKey);
            var accountFacade = new AccountFacade(keysRepository, _userRepository, emailSender.Object, userSettings);

            _publisher      = new Mock <IEventPublisher>();
            _userEditFacade = new UserEditFacade(_userRepository, fileRepository, _sanctionRepository);
            _userFacade     = new UserFacade(_userRepository, groupRepository, eventRepository, _publisher.Object);

            _adminId = accountFacade.RegUser("admin", Credentials.FromRawData("adminEmail", "password"), false,
                                             adminKey.Value);
            _testUserId = accountFacade.RegUser("Ivan", Credentials.FromRawData("*****@*****.**", "1"), false);
        }
        public void ShouldComposeSnapshotOfExactNumberOfEvents()
        {
            // ARRANGE
            var eventRepository    = new InMemoryEventRepository();
            var snapshotRepository = new InMemorySnapshotEventRepository();

            var factory        = new DefaultAggregateFactory();
            var aggregateStore = new AggregateRepository(eventRepository, factory, snapshotRepository);

            // Create a test aggregate.
            var aggregateId = CombGuid.Generate();
            var aggregate   = aggregateStore.GetById <IncrementingAggregate>(aggregateId);

            var snapshotSize       = aggregate.SnapshotSize;
            var numberOfTestEvents = 2 * snapshotSize + 1;

            // Send test events to the aggregate.
            Enumerable.Range(1, numberOfTestEvents)
            .ToList()
            .ForEach(x => aggregate.Tell(new IncrementingAggregate.Increment()));

            // ACT
            var orderedEvents   = aggregateStore.Save(aggregate);
            var snapshotVersion = snapshotRepository.GetVersionByAggregateId(aggregateId);
            var snapshotOffer   = (SnapshotOffer)snapshotRepository
                                  .GetSnapshotEventByAggregateIdAndVersion(aggregateId, snapshotVersion ?? 0);
            var newAggregate = aggregateStore.GetById <IncrementingAggregate>(aggregateId);
            var newState     = newAggregate.Ask <int>(new IncrementingAggregate.GetValue());

            // ASSERT
            Assert.AreEqual(numberOfTestEvents, orderedEvents.Length);
            Assert.AreEqual(numberOfTestEvents - 1, snapshotOffer.Version);
            Assert.AreEqual(numberOfTestEvents - 1, snapshotOffer.State);
            Assert.AreEqual(numberOfTestEvents, newState);
        }
Пример #5
0
 public void Index_must_be_geq_0()
 {
     using (var sut = new InMemoryEventRepository(""))
     {
         Assert.Throws <InvalidOperationException>(() => sut.Store(-1, new TestEvent()));
         Assert.Equal(0, sut.Count);
     }
 }
Пример #6
0
        public void Store_once()
        {
            using (var sut = new InMemoryEventRepository(""))
            {
                sut.Store(0, new TestEvent());

                Assert.Throws <InvalidOperationException>(() => sut.Store(0, new TestEvent()));
                Assert.Equal(1, sut.Count);
            }
        }
Пример #7
0
 public void Counting_events()
 {
     using (var sut = new InMemoryEventRepository(""))
     {
         sut.Store(0, new TestEvent());
         Assert.Equal(1, sut.Count);
         sut.Store(1, new TestEvent());
         Assert.Equal(2, sut.Count);
     }
 }
Пример #8
0
        public void Store_and_load()
        {
            using (var sut = new InMemoryEventRepository(""))
            {
                var e = new TestEvent {
                    Foo = "Hello"
                };
                sut.Store(0, e);

                var result = (TestEvent)sut.Load(0);

                Assert.Equal(e, result);
                Assert.Equal(e.Id, result.Id);
                Assert.Equal(e.Foo, result.Foo);
            }
        }
Пример #9
0
        static async Task Main(string[] args)
        {
            var eventRepository    = new InMemoryEventRepository();
            var snapshotRepository = new InMemorySnapshotRepository();
            var solution           = new Solution(eventRepository, snapshotRepository);

            solution.AddContext <EntityContext>();
            solution.AddContext <AttributeContext>();


            await solution.ExecuteCommand(new CreateEntity(Guid.NewGuid(), "Name1"));

            await solution.ExecuteCommand(new CreateEntity(Guid.NewGuid(), "Name2"));

            await solution.ExecuteCommand(new CreateEntity(Guid.NewGuid(), "Name2"));
        }
Пример #10
0
        public static async Task StartAsync()
        {
            using (await _queue.GetBlockingScope())
            {
                if (_initialized)
                {
                    throw new InvalidOperationException("Bootstrapper has already been invoked");
                }

                var constantSettings = ApplicationBootstrapper.ConstantSettingsProvider.Find();
                var directoryPath    = AppDomain.CurrentDomain.BaseDirectory;

                await WriteDatabaseInitializer.Initialize(new WriteDatabaseConfiguration(directoryPath, constantSettings.DatabaseFilePath, constantSettings.DatabaseEncryptionKey));

                await ReadDatabaseInitializer.Initialize();

                var applicationSettings    = await new ApplicationSettingsRepository(WriteDatabaseInitializer.DatabaseContext).LoadAsync();
                var applicationListenerUri = string.Format(constantSettings.ApplicationListenerUri, constantSettings.SystemIpAddress, applicationSettings.ApplicationCommunicationPort);

                var builder = new ContainerBuilder();

                var assemblies = new[] { Assembly.GetEntryAssembly() }
                .Union(new[]
                {
                    "iGP11.Library.dll",
                    "iGP11.Library.Component.dll",
                    "iGP11.Library.Component.DataAnnotations.dll",
                    "iGP11.Library.DDD.dll",
                    "iGP11.Library.EventPublisher.dll",
                    "iGP11.Library.File.dll",
                    "iGP11.Library.Hub.dll",
                    "iGP11.Library.Hub.Client.dll",
                    "iGP11.Library.Hub.Shared.dll",
                    "iGP11.Library.Hub.Transport.dll",
                    "iGP11.Library.Network.dll",
                    "iGP11.Library.Scheduler.dll",
                    "iGP11.Tool.Application.dll",
                    "iGP11.Tool.Application.Api.dll",
                    "iGP11.Tool.Domain.dll",
                    "iGP11.Tool.Infrastructure.Communication.dll",
                    "iGP11.Tool.Infrastructure.External.dll",
                    "iGP11.Tool.Infrastructure.Database.dll",
                    "iGP11.Tool.Localization.dll",
                    "iGP11.Tool.ReadModel.dll",
                    "iGP11.Tool.ReadModel.Api.dll",
                    "iGP11.Tool.Shared.dll"
                }
                       .Select(Assembly.LoadFrom))
                .ToArray();

                foreach (var assembly in assemblies)
                {
                    builder.RegisterAssemblyTypes(assembly)
                    .AsSelf()
                    .AsImplementedInterfaces();
                }

                builder.Register(
                    context =>
                {
                    var listener = new NetworkListener($"{applicationListenerUri}/", context.Resolve <ILogger>());
                    foreach (dynamic handler in assemblies.GetImplementations(typeof(INetworkCommandHandler)).Select(context.Resolve))
                    {
                        listener.Register(handler);
                    }

                    return(listener);
                })
                .SingleInstance()
                .AsSelf()
                .AsImplementedInterfaces();

                var proxyCommunicationPort = applicationSettings.ProxyCommunicationPort;
                var systemIpAddress        = constantSettings.SystemIpAddress;

                var eventPublisher = new EventPublisher();
                _scheduler = new BlockingScheduler(eventPublisher.Collect, Interval);
                _scheduler.Start();

                builder.Register(context => Logger.Current).SingleInstance().AsSelf().AsImplementedInterfaces();
                builder.Register(context => WriteDatabaseInitializer.DatabaseContext).SingleInstance().AsSelf().AsImplementedInterfaces();
                builder.Register(context => ReadDatabaseInitializer.Database).SingleInstance().AsSelf().AsImplementedInterfaces();
                builder.Register(context => new CommunicatorFactory(systemIpAddress, proxyCommunicationPort, Logger.Current)).AsSelf().AsImplementedInterfaces();
                builder.Register(context => eventPublisher).SingleInstance().AsSelf().AsImplementedInterfaces();
                builder.Register(context => constantSettings.Plugins).AsSelf().AsImplementedInterfaces();
                builder.Register(context => new NetworkPublisher(applicationListenerUri)).AsSelf().AsImplementedInterfaces();

                builder.Register(context => new GameSettingsProcessWatcher(
                                     constantSettings.Plugins,
                                     systemIpAddress,
                                     proxyCommunicationPort,
                                     context.Resolve <ComponentAssembler>(),
                                     context.Resolve <IDirectoryRepository>(),
                                     context.Resolve <IGameRepository>(),
                                     context.Resolve <IInjectionService>(),
                                     Logger.Current,
                                     context.Resolve <IProcessWatcher>()))
                .SingleInstance()
                .AsSelf()
                .AsImplementedInterfaces();

                var hubEventRepository      = new InMemoryEventRepository <HubEvent>();
                var endpointEventRepository = new InMemoryEventRepository <EndpointEvent>();
                var transport = new InMemoryTransport();
                var eventSerializerFactory = new DataContractEventSerializerFactory();
                var hubClientFactory       = new HubClientFactory(transport, eventSerializerFactory);

                _hub = new Hub(hubEventRepository, endpointEventRepository, transport, Logger.Current);
                var commandEndpointId = EndpointId.Generate();
                var queryEndpointId   = EndpointId.Generate();

                builder.Register(context => new DomainActionBuilder(new ActionBuilder(hubClientFactory, eventSerializerFactory), commandEndpointId)).AsSelf().AsImplementedInterfaces();
                DependencyResolver.Current = new AutofacResolver(builder.Build());

                var domainCommandHubHost = new DomainCommandHubHost(commandEndpointId, queryEndpointId, hubClientFactory);
                foreach (dynamic handler in assemblies.GetImplementations(typeof(IDomainCommandHandler <>)).Select(DependencyResolver.Current.Resolve))
                {
                    ListenFor(domainCommandHubHost, handler);
                }

                var domainEventHubHost = new DomainEventHubHost(queryEndpointId, hubClientFactory);
                foreach (dynamic handler in assemblies.GetImplementations(typeof(IDomainEventHandler <>)).Select(DependencyResolver.Current.Resolve))
                {
                    ListenFor(domainEventHubHost, handler);
                }

                domainCommandHubHost.Start();
                domainEventHubHost.Start();

                _initialized = true;
            }
        }
Пример #11
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            StartLoggly();

            services.AddWebSocketManager();

            IFileRepository     fileRepository;
            IGroupRepository    groupRepository;
            IKeysRepository     keysRepository;
            ITagRepository      tagRepository;
            IUserRepository     userRepository;
            ISanctionRepository sanctionRepository;
            IEventRepository    eventRepository;

            if (bool.Parse(Configuration.GetValue <string>("UseDB")))
            {
                var dbContext = Configuration.GetValue <string>("MysqlConnectionString");
                using (var context = new EduhubContext(dbContext))
                {
                    if (bool.Parse(Configuration.GetValue <string>("DeleteDB")))
                    {
                        context.Database.EnsureDeleted();
                    }
                    if (context.Database.EnsureCreated())
                    {
                        var dbName = dbContext.Split("database=")[1].Split(";")[0];
                        context.Database.ExecuteSqlCommand(
                            "ALTER DATABASE " + dbName + " CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;");
                        var modelNames = context.Model.GetEntityTypes();
                        foreach (var modelname in modelNames)
                        {
                            var mapping   = context.Model.FindEntityType(modelname.Name).Relational();
                            var tableName = mapping.TableName;
                            context.Database.ExecuteSqlCommand(
                                "alter table " + tableName.ToLower()
                                + " convert to character set utf8mb4 collate utf8mb4_bin;");
                        }
                    }

                    context.Database.Migrate();
                }

                fileRepository     = new InMysqlFileRepository(dbContext);
                groupRepository    = new InMysqlGroupRepository(dbContext);
                keysRepository     = new InMysqlKeyRepository(dbContext);
                tagRepository      = new InMysqlTagRepository(dbContext);
                userRepository     = new InMysqlUserRepository(dbContext);
                sanctionRepository = new InMysqlSanctionRepository(dbContext);
                eventRepository    = new InMemoryEventRepository();
            }
            else
            {
                fileRepository     = new InMemoryFileRepository();
                groupRepository    = new InMemoryGroupRepository();
                keysRepository     = new InMemoryKeysRepository();
                tagRepository      = new InMemoryTagRepository();
                sanctionRepository = new InMemorySanctionRepository();
                userRepository     = new InMemoryUserRepository();
                eventRepository    = new InMemoryEventRepository();
            }

            var emailSettings = new EmailSettings(Configuration.GetValue <string>("EmailLogin"),
                                                  Configuration.GetValue <string>("Email"),
                                                  Configuration.GetValue <string>("EmailPassword"),
                                                  Configuration.GetValue <string>("SmtpAddress"),
                                                  Configuration.GetValue <string>("ConfirmAddress"),
                                                  int.Parse(Configuration.GetValue <string>("SmtpPort")));


            var defaultAvatarFilename    = Configuration.GetValue <string>("DefaultAvatarFilename");
            var defaultAvatarContentType = Configuration.GetValue <string>("DefaultAvatarContentType");
            var userSettings             = new UserSettings(defaultAvatarFilename);

            if (!fileRepository.DoesFileExists(defaultAvatarFilename))
            {
                fileRepository.AddFile(new UserFile(defaultAvatarFilename, defaultAvatarContentType));
            }

            var tagFacade   = new TagFacade(tagRepository);
            var emailSender = new EmailSender(emailSettings);
            var notificationsDistributor = new NotificationsDistributor(groupRepository, userRepository, emailSender);

            var groupSettings = new GroupSettings(Configuration.GetValue <int>("MinGroupSize"),
                                                  Configuration.GetValue <int>("MaxGroupSize"),
                                                  Configuration.GetValue <double>("MinGroupValue"),
                                                  Configuration.GetValue <double>("MaxGroupValue"));

            var eventBusSettings = new EventBusSettings(Configuration.GetValue <string>("RabbitMqServerHostName"),
                                                        Configuration.GetValue <string>("RabbitMqServerVirtualHost"),
                                                        Configuration.GetValue <string>("RabbitMqAdminUserName"),
                                                        Configuration.GetValue <string>("RabbitMqAdminPassword"));
            var eventBus = new EventBus(eventBusSettings);

            eventBus.StartListening();

            var adminsEventConsumer     = new AdminsEventConsumer(notificationsDistributor, eventRepository);
            var courseEventConsumer     = new CourseEventConsumer(notificationsDistributor, eventRepository);
            var curriculumEventConsumer = new CurriculumEventConsumer(notificationsDistributor, eventRepository);
            var groupEventsConsumer     = new GroupEventsConsumer(notificationsDistributor, eventRepository);
            var invitationConsumer      = new InvitationConsumer(notificationsDistributor, eventRepository);
            var memberActionsConsumer   = new MemberActionsConsumer(notificationsDistributor, eventRepository);

            eventBus.RegisterConsumer(new TagPopularityConsumer(tagFacade));
            eventBus.RegisterConsumer <ReportMessageEvent>(adminsEventConsumer);
            eventBus.RegisterConsumer <SanctionsAppliedEvent>(adminsEventConsumer);
            eventBus.RegisterConsumer <SanctionCancelledEvent>(adminsEventConsumer);
            eventBus.RegisterConsumer <TeacherFoundEvent>(courseEventConsumer);
            eventBus.RegisterConsumer <CourseFinishedEvent>(courseEventConsumer);
            eventBus.RegisterConsumer <ReviewReceivedEvent>(courseEventConsumer);
            eventBus.RegisterConsumer <CurriculumAcceptedEvent>(curriculumEventConsumer);
            eventBus.RegisterConsumer <CurriculumDeclinedEvent>(curriculumEventConsumer);
            eventBus.RegisterConsumer <CurriculumSuggestedEvent>(curriculumEventConsumer);
            eventBus.RegisterConsumer <NewCreatorEvent>(groupEventsConsumer);
            eventBus.RegisterConsumer <GroupIsFormedEvent>(groupEventsConsumer);
            eventBus.RegisterConsumer <InvitationAcceptedEvent>(invitationConsumer);
            eventBus.RegisterConsumer <InvitationDeclinedEvent>(invitationConsumer);
            eventBus.RegisterConsumer <InvitationReceivedEvent>(invitationConsumer);
            eventBus.RegisterConsumer <NewMemberEvent>(memberActionsConsumer);
            eventBus.RegisterConsumer <MemberLeftEvent>(memberActionsConsumer);

            var publisher = eventBus.GetEventPublisher();

            var userFacade      = new UserFacade(userRepository, groupRepository, eventRepository, publisher);
            var groupEditFacade = new GroupEditFacade(groupRepository, groupSettings, publisher);
            var userEditFacade  = new UserEditFacade(userRepository, fileRepository, sanctionRepository);
            var groupFacade     = new GroupFacade(groupRepository, userRepository, sanctionRepository, groupSettings,
                                                  publisher);
            var fileFacade        = new FileFacade(fileRepository);
            var chatFacade        = new ChatFacade(groupRepository, userRepository);
            var sanctionsFacade   = new SanctionFacade(sanctionRepository, userRepository, publisher);
            var userAccountFacade = new AccountFacade(keysRepository, userRepository, emailSender, userSettings);
            var reportFacade      = new ReportFacade(userRepository, eventRepository, publisher);

            services.AddSingleton <IUserFacade>(userFacade);
            services.AddSingleton <IGroupFacade>(groupFacade);
            services.AddSingleton <IFileFacade>(fileFacade);
            services.AddSingleton <IChatFacade>(chatFacade);
            services.AddSingleton <IGroupEditFacade>(groupEditFacade);
            services.AddSingleton <IUserEditFacade>(userEditFacade);
            services.AddSingleton <ITagFacade>(tagFacade);
            services.AddSingleton <ISanctionFacade>(sanctionsFacade);
            services.AddSingleton <IAccountFacade>(userAccountFacade);
            services.AddSingleton <IReportFacade>(reportFacade);
            services.AddSingleton(Env);

            userAccountFacade.CheckAdminExistence(Configuration.GetValue <string>("AdminEmail"));

            services.AddSwaggerGen(current =>
            {
                current.SwaggerDoc("v1", new Info
                {
                    Title   = "EduHub API",
                    Version = "v1"
                });
                current.AddSecurityDefinition("Bearer", new ApiKeyScheme
                {
                    Description =
                        "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                    Name = "Authorization",
                    In   = "header",
                    Type = "apiKey"
                });
                current.OperationFilter <ExamplesOperationFilter>();
                current.DescribeAllEnumsAsStrings();
                var a = string.Format(@"{0}\EduHub.xml", AppDomain.CurrentDomain.BaseDirectory);
                current.IncludeXmlComments(string.Format(@"{0}/EduHub.xml", AppDomain.CurrentDomain.BaseDirectory));
            });
            ConfigureSecurity(services);
            if (Configuration.GetValue <bool>("Authorization"))
            {
                services.AddMvc(o =>
                {
                    o.Filters.Add(new ExceptionFilter());
                    o.Filters.Add(new ActionFilter());
                });
            }
            else
            {
                services.AddMvc(o =>
                {
                    o.Filters.Add(new AllowAnonymousFilter());
                    o.Filters.Add(new ExceptionFilter());
                    o.Filters.Add(new ActionFilter());
                });
            }
            services.AddCors(options =>
            {
                options.AddPolicy("AllowAnyOrigin",
                                  builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
            });
        }