Exemple #1
0
        public override async Task SetUp(SetUpContext context, Action <string, string> reportError)
        {
            // Build schemas
            using (var builder = _schemaBuilder)
            {
                // configure
                Configure(builder);

                // user schema
                Users(builder);

                // photo schema
                UserPhoto(builder);

                // banner schema
                UserBanner(builder);

                // meta data schema
                UserData(builder);

                var errors = await _schemaManager.ExecuteAsync(builder.Statements);

                foreach (var error in errors)
                {
                    reportError(error, $"SetUp within {this.GetType().FullName} - {error}");
                }
            }

            // Configure default users
            await ConfigureDefaultUsers(context, reportError);

            // Configure administrator
            await ConfigureSuperUser(context, reportError);
        }
Exemple #2
0
        public override async Task SetUp(
            SetUpContext context,
            Action <string, string> reportError)
        {
            // --------------------------
            // Add default settings to dictionary store
            // --------------------------

            try
            {
                var siteSettings = await _siteSettingsStore.GetAsync() ?? new SiteSettings();

                siteSettings.SiteName  = context.SiteName;
                siteSettings.SuperUser = context.AdminUsername;
                siteSettings.ApiKey    = _keyGenerator.GenerateKey();
                siteSettings.HomeRoute = new HomeRoute();
                await _siteSettingsStore.SaveAsync(siteSettings);
            }
            catch (Exception ex)
            {
                reportError(ex.Message, ex.StackTrace);
            }

            // --------------------------
            // Apply default permissions to default roles for new feature
            // --------------------------

            await _defaultRolesManager.UpdateDefaultRolesAsync(new Permissions());
        }
Exemple #3
0
        public IOrType <IProject <TAssembly, TBacking>, IReadOnlyList <IError> > Parse <TAssembly, TBacking>(string text, IReadOnlyList <TAssembly> dependencies, string name)
            where TAssembly : IAssembly <TBacking>
        {
            var tokenizer = new Tokenizer(StaticSymbolsRegistry.SymbolsRegistry.Symbols.Except(new[] { SymbolsRegistry.StaticSubtractSymbol }).ToArray());
            var tokens    = tokenizer.Tokenize(text);

            var elementMatchingContest = new ElementMatchingContext();

            var scopePopulator = elementMatchingContest.ParseFile(tokens);

            var dependencyConverter = new DependencyConverter();

            var problem = new Tpn.TypeProblem2(new WeakScopeConverter(), scopePopulator, prob => {
                foreach (var dependency in dependencies)
                {
                    var type = prob.builder.CreateTypeExternalType(prob.Dependency, new WeakTypeDefinitionConverter(), dependency.Scope);

                    foreach (var memberPair in dependency.Scope.Members)
                    {
                        var innerType = ConvertType(prob.builder, type, OrType.Make <IVerifiableType, IError>(memberPair.Type));
                        innerType.Switch(x =>
                        {
                            prob.builder.CreatePublicMember(type, type, memberPair.Key, OrType.Make <IKey, IError>(x));
                        }, y =>
                        {
                            prob.builder.CreatePublicMember(type, memberPair.Key, y);
                        });
                    }
                    prob.builder.CreatePrivateMember(prob.Dependency, dependency.Key, OrType.Make <Tpn.TypeProblem2.MethodType, Tpn.TypeProblem2.Type, Tpn.TypeProblem2.Object, Tpn.TypeProblem2.OrType, Tpn.TypeProblem2.InferredType, Tpn.TypeProblem2.GenericTypeParameter, IError>(type));
                }
            });


            var populateScopeContex = new SetUpContext(problem.builder);
            var referanceResolver   = scopePopulator.Run(problem.ModuleRoot, populateScopeContex).Resolve;

            var solution = problem.Solve();

            var rootScope = referanceResolver.Run(solution, new List <Tpn.ITypeProblemNode>()
            {
                problem.Dependency,
                problem.ModuleRoot
            }).GetValue();

            var errors = rootScope.Validate().ToArray();

            if (errors.Any())
            {
                return(OrType.Make <IProject <TAssembly, TBacking>, IReadOnlyList <IError> >(errors));
            }

            var dependencyScope = problem.Dependency.Converter.Convert(solution, problem.Dependency, Array.Empty <Tpn.ITypeProblemNode>()).Is2OrThrow();


            var context = TransformerExtensions.NewConversionContext();

            return(OrType.Make <IProject <TAssembly, TBacking>, IReadOnlyList <IError> >(new Project <TAssembly, TBacking>(rootScope.Convert(context), dependencies, dependencyScope.Convert(context))));
        }
Exemple #4
0
        async Task ConfigureDefaultUsers(SetUpContext context, Action <string, string> reportError)
        {
            try
            {
                // create super user
                var result1 = await _userManager.CreateAsync(new User()
                {
                    Email                   = context.AdminEmail,
                    UserName                = context.AdminUsername,
                    PhotoColor              = _userColorProvider.GetColor(),
                    EmailConfirmed          = true,
                    IsVerified              = true,
                    IsVerifiedUpdatedUserId = 1,
                    IsVerifiedUpdatedDate   = DateTimeOffset.UtcNow
                }, context.AdminPassword);

                if (!result1.Succeeded)
                {
                    foreach (var error in result1.Errors)
                    {
                        reportError(error.Code, error.Description);
                    }
                }

                // create default plato bot

                var result2 = await _userManager.CreateAsync(new User()
                {
                    Email                   = "*****@*****.**",
                    UserName                = "******",
                    DisplayName             = "Plato Bot",
                    Biography               = "I'm not a real person. I'm a bot that keeps an eye on things.",
                    EmailConfirmed          = true,
                    IsVerified              = true,
                    IsVerifiedUpdatedUserId = 1,
                    IsVerifiedUpdatedDate   = DateTimeOffset.UtcNow,
                    PhotoUrl                = "/images/bot.png",
                    PhotoColor              = _userColorProvider.GetColor(),
                    UserType                = UserType.Bot
                }, context.AdminPassword);

                if (!result2.Succeeded)
                {
                    foreach (var error in result2.Errors)
                    {
                        reportError(error.Code, error.Description);
                    }
                }
            }
            catch (Exception ex)
            {
                reportError(ex.Message, ex.StackTrace);
            }
        }
Exemple #5
0
        public async Task <string> SetUpAsync(SetUpContext context)
        {
            var initialState = _shellSettings.State;

            try
            {
                return(await SetUpInternalAsync(context));
            }
            catch (Exception ex)
            {
                context.Errors.Add(ex.Message, ex.Message);
                _shellSettings.State = initialState;
                throw;
            }
        }
Exemple #6
0
        internal static WeakRootScope ConvertToWeak(FileToken fileToken)
        {
            var elementMatchingContest = new ElementMatchingContext();

            var scopePopulators = elementMatchingContest.ParseFile(fileToken);

            var problem = new Tpn.TypeProblem2(new WeakScopeConverter(), scopePopulators, _ => { });

            var populateScopeContex = new SetUpContext(problem.builder);
            var referanceResolver   = scopePopulators.Run(problem.ModuleRoot, populateScopeContex).Resolve;

            var solution = problem.Solve();

            var res = referanceResolver.Run(solution, new List <Tpn.ITypeProblemNode>());

            return(res.GetValue());
        }
Exemple #7
0
        public override async Task SetUp(SetUpContext context, Action <string, string> reportError)
        {
            using (var builder = _schemaBuilder)
            {
                // configure
                Configure(builder);

                // User reputations
                UserReputations(builder);

                var errors = await _schemaManager.ExecuteAsync(builder.Statements);

                foreach (var error in errors)
                {
                    reportError(error, $"SetUp within {this.GetType().FullName} - {error}");
                }
            }
        }
Exemple #8
0
        public override async Task SetUp(SetUpContext context, Action <string, string> reportError)
        {
            //var schemaBuilder = context.ServiceProvider.GetRequiredService<ISchemaBuilder>();
            using (var builder = _schemaBuilder)
            {
                // configure
                Configure(builder);

                // Emails schema
                Emails(builder);

                var errors = await _schemaManager.ExecuteAsync(builder.Statements);

                foreach (var error in errors)
                {
                    reportError(error, $"SetUp within {this.GetType().FullName} - {error}");
                }
            }
        }
Exemple #9
0
        async Task ConfigureSuperUser(SetUpContext context, Action <string, string> reportError)
        {
            // Get newly installed administrator role
            var role = await _roleManager.FindByNameAsync(DefaultRoles.Administrator);

            // Get newly created administrator user
            var user = await _userManager.FindByNameAsync(context.AdminUsername);

            // Add our administrator user to the administrator role
            var dirty = false;

            if (role != null && user != null)
            {
                if (!await _userManager.IsInRoleAsync(user, role.Name))
                {
                    var result = await _userManager.AddToRoleAsync(user, role.Name);

                    if (!result.Succeeded)
                    {
                        foreach (var error in result.Errors)
                        {
                            reportError(error.Code, error.Description);
                        }
                    }
                    dirty = true;
                }
            }

            if (dirty)
            {
                var result = await _userManager.UpdateAsync(user);

                if (!result.Succeeded)
                {
                    foreach (var error in result.Errors)
                    {
                        reportError(error.Code, error.Description);
                    }
                }
            }
        }
Exemple #10
0
        public override async Task SetUp(SetUpContext context, Action <string, string> reportError)
        {
            using (var builder = _schemaBuilder)
            {
                // configure
                Configure(builder);

                // roles
                Roles(builder);

                // user roles
                UserRoles(builder);

                var errors = await _schemaManager.ExecuteAsync(builder.Statements);

                foreach (var error in errors)
                {
                    reportError(error, $"SetUp within {this.GetType().FullName} - {error}");
                }
            }

            // Install default roles & permissions on first set-up
            await _defaultRolesManager.InstallDefaultRolesAsync();
        }
Exemple #11
0
        public override async Task SetUp(SetUpContext context, Action <string, string> reportError)
        {
            // --------------------------
            // Build core schemas
            // --------------------------

            using (var builder = _schemaBuilder)
            {
                // configure
                Configure(builder);

                // features schema
                Features(builder);

                // Did any errors occur?

                var errors = await _schemaManager.ExecuteAsync(builder.Statements);

                foreach (var error in errors)
                {
                    reportError(error, $"SetUp within {this.GetType().FullName} - {error}");
                }
            }
        }
Exemple #12
0
 public override Task SetUp(
     SetUpContext context,
     Action <string, string> reportError)
 {
     return(Task.CompletedTask);
 }
Exemple #13
0
        public override async Task SetUp(
            SetUpContext context,
            Action <string, string> reportError)
        {
            // --------------------------
            // Build core schemas
            // --------------------------

            var dictionaryTable = new SchemaTable()
            {
                Name    = "DictionaryEntries",
                Columns = new List <SchemaColumn>()
                {
                    new SchemaColumn()
                    {
                        PrimaryKey = true,
                        Name       = "Id",
                        DbType     = DbType.Int32
                    },
                    new SchemaColumn()
                    {
                        Name   = "[Key]",
                        Length = "255",
                        DbType = DbType.String
                    },
                    new SchemaColumn()
                    {
                        Name   = "[Value]",
                        Length = "max",
                        DbType = DbType.String
                    },
                    new SchemaColumn()
                    {
                        Name   = "CreatedUserId",
                        DbType = DbType.Int32
                    },
                    new SchemaColumn()
                    {
                        Name   = "CreatedDate",
                        DbType = DbType.DateTimeOffset
                    },
                    new SchemaColumn()
                    {
                        Name   = "ModifiedUserId",
                        DbType = DbType.Int32
                    },
                    new SchemaColumn()
                    {
                        Name     = "ModifiedDate",
                        DbType   = DbType.DateTimeOffset,
                        Nullable = true
                    }
                }
            };

            var documentTable = new SchemaTable()
            {
                Name    = "DocumentEntries",
                Columns = new List <SchemaColumn>()
                {
                    new SchemaColumn()
                    {
                        PrimaryKey = true,
                        Name       = "Id",
                        DbType     = DbType.Int32
                    },
                    new SchemaColumn()
                    {
                        Name   = "[Type]",
                        Length = "500",
                        DbType = DbType.String
                    },
                    new SchemaColumn()
                    {
                        Name   = "[Value]",
                        Length = "max",
                        DbType = DbType.String
                    },
                    new SchemaColumn()
                    {
                        Name   = "CreatedDate",
                        DbType = DbType.DateTimeOffset
                    },
                    new SchemaColumn()
                    {
                        Name   = "CreatedUserId",
                        DbType = DbType.Int32
                    },
                    new SchemaColumn()
                    {
                        Name   = "ModifiedDate",
                        DbType = DbType.DateTimeOffset
                    },
                    new SchemaColumn()
                    {
                        Name     = "ModifiedUserId",
                        DbType   = DbType.Int32,
                        Nullable = true
                    }
                }
            };

            using (var builder = _schemaBuilder)
            {
                // Build dictionary store
                // --------------------------

                builder
                .Configure(options =>
                {
                    options.ModuleName = "Plato.Core";
                    options.Version    = "1.0.0";
                });
                builder.TableBuilder.CreateTable(dictionaryTable);

                builder.ProcedureBuilder.CreateDefaultProcedures(dictionaryTable)
                .CreateProcedure(
                    new SchemaProcedure("SelectDictionaryEntryByKey", StoredProcedureType.SelectByKey)
                    .ForTable(dictionaryTable).WithParameter(new SchemaColumn()
                {
                    Name   = "[Key]",
                    Length = "255",
                    DbType = DbType.String
                }));

                builder.ProcedureBuilder.CreateDefaultProcedures(dictionaryTable)
                .CreateProcedure(
                    new SchemaProcedure("DeleteDictionaryEntryByKey", StoredProcedureType.DeleteByKey)
                    .ForTable(dictionaryTable).WithParameter(new SchemaColumn()
                {
                    Name   = "[Key]",
                    Length = "255",
                    DbType = DbType.String
                }));

                // Build document store
                // --------------------------

                builder
                .Configure(options =>
                {
                    options.ModuleName = "Plato.Core";
                    options.Version    = "1.0.0";
                });

                builder.TableBuilder.CreateTable(documentTable);

                builder.ProcedureBuilder
                .CreateDefaultProcedures(documentTable)
                .CreateProcedure(
                    new SchemaProcedure("SelectDocumentEntryByType", StoredProcedureType.SelectByKey)
                    .ForTable(documentTable)
                    .WithParameter(new SchemaColumn()
                {
                    Name   = "[Type]",
                    Length = "500",
                    DbType = DbType.String
                }));

                // Did any errors occur?

                var errors = await _schemaManager.ExecuteAsync(builder.Statements);

                foreach (var error in errors)
                {
                    reportError(error, $"SetUp within {this.GetType().FullName} - {error}");
                }
            }
        }
Exemple #14
0
        public async Task <IActionResult> Index(SetUpViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            if (!string.IsNullOrEmpty(_shellSettings.ConnectionString))
            {
                model.ConnectionStringPreset = true;
                model.ConnectionString       = _shellSettings.ConnectionString;
            }

            if (!string.IsNullOrEmpty(_shellSettings.TablePrefix))
            {
                model.TablePrefixPreset = true;
                model.TablePrefix       = _shellSettings.TablePrefix;
            }

            var setupContext = new SetUpContext()
            {
                SiteName                 = model.SiteName,
                DatabaseProvider         = "SqlClient",
                DatabaseConnectionString = model.ConnectionString,
                AdminUsername            = model.UserName,
                AdminEmail               = model.Email,
                AdminPassword            = model.Password,
                Errors = new Dictionary <string, string>()
            };

            if (!model.TablePrefixPreset)
            {
                setupContext.DatabaseTablePrefix = model.TablePrefix;
            }

            if (_logger.IsEnabled(LogLevel.Information))
            {
                _logger.LogInformation($"Beginning call to SetUpAsync");
            }

            var executionId = await _setUpService.SetUpAsync(setupContext);

            // Check if a component in the Setup failed
            if (setupContext.Errors.Count > 0)
            {
                if (_logger.IsEnabled(LogLevel.Information))
                {
                    _logger.LogInformation($"Set-up of tenant '{setupContext.SiteName}' failed with the following errors...");
                }

                foreach (var error in setupContext.Errors)
                {
                    if (_logger.IsEnabled(LogLevel.Information))
                    {
                        _logger.LogInformation(error.Key + " " + error.Value);
                    }
                    ModelState.AddModelError(error.Key, error.Value);
                }
                return(View(model));
            }

            if (_logger.IsEnabled(LogLevel.Information))
            {
                _logger.LogInformation($"Tenant with site name '{setupContext.SiteName}' created successfully");
            }

            return(Redirect("~/"));
        }
Exemple #15
0
        async Task <string> SetUpInternalAsync(SetUpContext context)
        {
            // Set shell state to "Initializing" so that subsequent HTTP requests are responded to with "Service Unavailable" while Orchard is setting up.
            _shellSettings.State = TenantState.Initializing;

            var executionId = Guid.NewGuid().ToString("n");

            var shellSettings = new ShellSettings(_shellSettings.Configuration);

            shellSettings.Name     = context.SiteName;
            shellSettings.Location = context.SiteName.ToSafeFileName();

            if (string.IsNullOrEmpty(shellSettings.DatabaseProvider))
            {
                var tablePrefix = context.DatabaseTablePrefix;
                if (!tablePrefix.EndsWith(TablePrefixSeparator))
                {
                    tablePrefix += TablePrefixSeparator;
                }
                shellSettings.DatabaseProvider = context.DatabaseProvider;
                shellSettings.ConnectionString = context.DatabaseConnectionString;
                shellSettings.TablePrefix      = tablePrefix;
            }

            using (var shellContext = _shellContextFactory.CreateMinimalShellContext(shellSettings))
            {
                using (var scope = shellContext.ServiceProvider.CreateScope())
                {
                    using (var dbContext = scope.ServiceProvider.GetRequiredService <IDbContext>())
                    {
                        // update dbContext confirmation
                        dbContext.Configure(options =>
                        {
                            options.ConnectionString = shellSettings.ConnectionString;
                            options.DatabaseProvider = shellSettings.DatabaseProvider;
                            options.TablePrefix      = shellSettings.TablePrefix;
                        });

                        var hasErrors = false;
                        void ReportError(string key, string message)
                        {
                            hasErrors           = true;
                            context.Errors[key] = message;
                        }

                        // Invoke modules to react to the setup event
                        var setupEventHandlers = scope.ServiceProvider.GetServices <ISetUpEventHandler>();
                        var logger             = scope.ServiceProvider.GetRequiredService <ILogger <SetUpService> >();

                        await setupEventHandlers.InvokeAsync(x => x.SetUp(context, ReportError), logger);

                        if (hasErrors)
                        {
                            return(executionId);
                        }
                    }
                }
            }

            if (context.Errors.Count > 0)
            {
                return(executionId);
            }

            shellSettings.State = TenantState.Running;
            _platoHost.UpdateShellSettings(shellSettings);

            return(executionId);
        }