Example #1
0
        public async Task <byte[]> GetFileAsync(StoredFile storedFile, DatabaseOptions databaseOptions)
        {
            var fileId = ConvertUtil.DeserializeObject <DatabaseIdentifierOptions>(storedFile.FileIdentifierOptions).FileId;
            var bucket = GetMongoBucket(databaseOptions);

            return(await bucket.DownloadAsBytesAsync(ObjectId.Parse(fileId)));
        }
        public async Task <byte[]> GetFileAsync(StoredFile storedFile, DatabaseOptions databaseOptions)
        {
            var fileId = ConvertUtil.DeserializeObject <DatabaseIdentifierOptions>(storedFile.FileIdentifierOptions).FileId;

            byte[] bytes = null;
            using (var sqlDbConnection = new SqlConnection(databaseOptions.ConnectionString))
            {
                sqlDbConnection.Open();
                using (var sqlCommand = new SqlCommand("SELECT * FROM uploadFiles Where id=@id", sqlDbConnection))
                {
                    sqlCommand.Parameters.Add("id", System.Data.SqlDbType.NVarChar, 450).Value = fileId;
                    using (var sqlReader = await sqlCommand.ExecuteReaderAsync())
                    {
                        if (sqlReader.HasRows)
                        {
                            while (sqlReader.Read())
                            {
                                bytes = (byte[])sqlReader["File"];
                                break;
                            }
                        }
                    }
                }
            }

            return(bytes);
        }
Example #3
0
        private T Convert <T>(IEnumerable <VersionValue> versionValues)
        {
            var defaultValue = Activator.CreateInstance <T>();

            var targetType           = typeof(T);
            var allVailableProperies = targetType
                                       .GetProperties()
                                       .Where(a => a.CanWrite && a.GetSetMethod() != null && a.PropertyType.GetCustomAttribute <NotManifestAttribute>() == null)
                                       .ToList();
            var allVailableNames = allVailableProperies.Select(a => a.Name);

            foreach (var versionValue in versionValues)
            {
                var prop       = allVailableProperies.First(a => a.Name == versionValue.Key);
                var foundValue = versionValue.Value;
                if (!string.IsNullOrEmpty(foundValue))
                {
                    if (prop.PropertyType == typeof(string) ||
                        prop.PropertyType == typeof(decimal) ||
                        prop.PropertyType.IsValueType ||
                        prop.PropertyType.IsEnum)
                    {
                        var typeConverter    = TypeDescriptor.GetConverter(prop.PropertyType);
                        var typeConverterObj = typeConverter.ConvertFromString(foundValue);
                        prop.SetValue(defaultValue, typeConverterObj);
                    }
                    else
                    {
                        var convertingObj = ConvertUtil.DeserializeObject(foundValue, prop.PropertyType);
                        prop.SetValue(defaultValue, convertingObj);
                    }
                }
            }
            return(defaultValue);
        }
Example #4
0
        public async Task <byte[]> GetFileAsync(StoredFile storedFile, DatabaseOptions databaseOptions)
        {
            var fileId = ConvertUtil.DeserializeObject <DatabaseIdentifierOptions>(storedFile.FileIdentifierOptions).FileId;

            byte[] bytes;
            using (var postgreDbConnection = new NpgsqlConnection(databaseOptions.ConnectionString))
            {
                postgreDbConnection.Open();
                var manager = new NpgsqlLargeObjectManager(postgreDbConnection);
                // Reading and writing Large Objects requires the use of a transaction
                using (var transaction = postgreDbConnection.BeginTransaction())
                {
                    // Open the file for reading and writing
                    using (var stream = manager.OpenRead(fileId))
                    {
                        using (var memoryStream = new MemoryStream())
                        {
                            await stream.CopyToAsync(memoryStream);

                            bytes = memoryStream.GetBuffer();
                            memoryStream.Close();
                        }
                    }
                }
            }

            return(bytes);
        }
Example #5
0
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            var serviceBuilder = modelBuilder.Entity <Service>();

            serviceBuilder.HasKey(a => a.Id);

            serviceBuilder.HasOne(a => a.ServiceHardwareInfo).WithOne().OnDelete(DeleteBehavior.Cascade);
            serviceBuilder.HasMany(a => a.MonitorCounters).WithOne(b => b.Service).OnDelete(DeleteBehavior.Cascade);

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                serviceBuilder.Property(a => a.HealthCheckNotifyEnable).HasColumnType("BIT");
                serviceBuilder.Property(a => a.LoggerNotifyEnable).HasColumnType("BIT");
            }

            var logEventBuilder = modelBuilder.Entity <LogEvent>();

            logEventBuilder.HasKey(a => a.Id);

            var jsonStackTracesConverter = new ValueConverter <IEnumerable <string>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <IEnumerable <string> >(v));

            logEventBuilder.Property(a => a.StackTrace).HasConversion(jsonStackTracesConverter);

            var monitorCounterBuilder = modelBuilder.Entity <MonitorCounter>();

            monitorCounterBuilder.HasKey(a => a.Id);

            monitorCounterBuilder.HasOne(a => a.HardwareCounter).WithOne().OnDelete(DeleteBehavior.Cascade);
            monitorCounterBuilder.HasOne(a => a.HttpCounter).WithOne().OnDelete(DeleteBehavior.Cascade);

            var hardwareBuilder = modelBuilder.Entity <HardwareCounter>();

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                hardwareBuilder.Property(a => a.IsCpuBottleneck).HasColumnType("BIT");
                hardwareBuilder.Property(a => a.IsMemoryThreshold).HasColumnType("BIT");
            }

            var monitorHardwareBuilder = modelBuilder.Entity <MonitorHardwareReport>();

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                monitorHardwareBuilder.Property(a => a.IsCpuBottleneck).HasColumnType("BIT");
                monitorHardwareBuilder.Property(a => a.IsMemoryThreshold).HasColumnType("BIT");
            }

            var monitorHttpBuilder = modelBuilder.Entity <MonitorHttpReport>();

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var property in entity.GetProperties())
                {
                    property.SetColumnName(ToCamelCase(property.GetColumnName()));
                }
            }
        }
Example #6
0
        public async Task <UploadBackupResponseModel> UploadBackupFile(IFormFile uploadFile, string uploader)
        {
            var isFileValid = await _fileSeviceProvider.ValidateFile(uploadFile);

            if (isFileValid)
            {
                Directory.CreateDirectory(_backupOptions.CurrentValue.RestoreFolderPath);
                var tempFilePath = await SaveFormFileAsync(uploadFile, _backupOptions.CurrentValue.RestoreFolderPath);

                var unzipFileName   = Path.GetFileNameWithoutExtension(tempFilePath);
                var unzipFolderPath = Path.Combine(_backupOptions.CurrentValue.RestoreFolderPath, Path.GetFileNameWithoutExtension(tempFilePath));
                if (Directory.Exists(unzipFolderPath))
                {
                    // Delete old directory
                    Directory.Delete(unzipFolderPath, true);
                }

                Directory.CreateDirectory(unzipFolderPath);
                ZipFile.ExtractToDirectory(tempFilePath, unzipFolderPath);
                var jsonFilePath = Path.Combine(unzipFolderPath, unzipFileName + ".json");
                var jsonFound    = File.ReadAllText(jsonFilePath);

                var backupFlatternModel = ConvertUtil.DeserializeObject <BackupFlatternFileModel>(jsonFound);
                // Save zip file into file service
                var storedFile = await _fileSeviceProvider.UploadFileAsync(tempFilePath, uploader, true);

                // Restore backup
                var backup = backupFlatternModel.Backup;
                backup.Id              = DataUtil.GenerateUniqueId();
                backup.FileId          = storedFile.FileId;
                backup.DownloadableUrl = storedFile.DownloadableUrl;
                await _backupRepository.AddAsync(backup);

                return(new UploadBackupResponseModel
                {
                    Id = backup.Id,
                    Name = backup.Name,
                    Description = backup.Description,
                    Creator = backup.Creator,
                    CreatedDate = backup.CreatedDate,
                    TotalObjects = backupFlatternModel.TotalObjects,
                    IsFileValid = true
                });
            }
            else
            {
                return(new UploadBackupResponseModel {
                    IsFileValid = false
                });
            }
        }
        public override async Task <T> InvokeAsyncT <T>(MethodInfo targetMethod, object[] args)
        {
            var argInfos    = InitArgumentInfos(targetMethod.GetParameters(), args);
            var urlTemplate = _urlBuilder.GetUrlTemplate(targetMethod);

            var requestMessage = HttpRequestUtil.BuildHttpRequestMessage(_httpConfig?.RequestHeaders, argInfos, urlTemplate);

            _logger?.LogDebug("Request url:{0} {1}", requestMessage.Method, requestMessage.RequestUri.AbsoluteUri);

            var response = await _httpClient.SendAsync(requestMessage);

            var content = await response.Content.ReadAsStringAsync();

            return(ConvertUtil.DeserializeObject <T>(content));
        }
Example #8
0
        private ToolsOptions GetToolsOptions(string filePath)
        {
            string fullPath;

            if (!string.IsNullOrEmpty(filePath))
            {
                fullPath = Path.GetFullPath(filePath);
            }
            else
            {
                fullPath = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "tools.json");
            }
            Console.WriteLine(">>> Config file path: {0}", fullPath);
            var foundText = File.ReadAllText(fullPath);

            return(ConvertUtil.DeserializeObject <ToolsOptions>(foundText));
        }
        public override object Invoke(MethodInfo targetMethod, object[] args)
        {
            //if the method is 'Config',then save the config data and return this instance for the next invoke
            if (IsConfigMethod(targetMethod, args))
            {
                _httpConfig         = args[0] as HttpConfig;
                _httpClient.Timeout = _httpConfig.Timeout;
                return(this);
            }
            var argInfos    = InitArgumentInfos(targetMethod.GetParameters(), args);
            var urlTemplate = _urlBuilder.GetUrlTemplate(targetMethod);

            var requestMessage = HttpRequestUtil.BuildHttpRequestMessage(_httpConfig?.RequestHeaders, argInfos, urlTemplate);

            _logger?.LogDebug("Request url:{0} {1}", requestMessage.Method, requestMessage.RequestUri.AbsoluteUri);

            var response = _httpClient.SendAsync(requestMessage).ConfigureAwait(false).GetAwaiter().GetResult();
            var content  = response.Content.ReadAsStringAsync().ConfigureAwait(false).GetAwaiter().GetResult();

            return(ConvertUtil.DeserializeObject(targetMethod.ReturnType, content));
        }
Example #10
0
        public async Task <ExecutedDataSourceModel> GetDatasourceService(Datasource datasource)
        {
            var datasourceModels = new List <DatasourceModel>();

            if (datasource.DatasourceType == DatasourceType.Static)
            {
                datasourceModels = ConvertUtil.DeserializeObject <List <DatasourceModel> >(datasource.Query);
            }
            else
            {
                var database = await _databaseServiceProvider.GetOneDatabaseConnectionAsync(datasource.DatabaseId);

                var foundExtractionDatasource = _extractionDatasources.First(a => a.ConnectionType == database.GetConnectionType());

                datasourceModels = await foundExtractionDatasource.ExtractionDatasource(database, datasource.Query, datasource.OutputProjection);
            }

            return(new ExecutedDataSourceModel
            {
                DatasourceModels = datasourceModels,
                CanCache = datasource.CanCache
            });
        }
Example #11
0
        public static ChatSessionModel LoadFrom(ChatSession chatSession)
        {
            if (chatSession == null)
            {
                return(null);
            }
            var newSession = new ChatSessionModel
            {
                ChatRoomId        = chatSession.ChatRoomId,
                Messages          = new Queue <MessageModel>(),
                PreviousSessionId = chatSession.PreviousSessionId,
                CreatedDate       = chatSession.CreatedDate,
                LeaveDate         = chatSession.LeaveDate,
                NextSessionId     = chatSession.NextSessionId,
                SessionId         = chatSession.Id
            };

            if (chatSession.Conversations != null)
            {
                foreach (var message in chatSession.Conversations.OrderBy(a => a.Timestamp))
                {
                    newSession.Messages.Enqueue(new MessageModel
                    {
                        Message          = message.Message,
                        FormattedMessage = message.MessageTransform,
                        TimeStamp        = message.Timestamp,
                        UserName         = message.Username,
                        CreatedDate      = message.CreatedDate,
                        AttachmentFiles  = !string.IsNullOrEmpty(message.FileUrl)
                            ? ConvertUtil.DeserializeObject <List <AttachmentFile> >(message.FileUrl)
                                : new List <AttachmentFile>()
                    });
                }
            }

            return(newSession);
        }
        public async Task <byte[]> GetFileAsync(StoredFile storedFile)
        {
            var localFile = ConvertUtil.DeserializeObject <LocalFileOptions>(storedFile.FileIdentifierOptions);

            return(await File.ReadAllBytesAsync(localFile.FileLocation));
        }
Example #13
0
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Declare all model builder
            var jsonMenusConverter = new ValueConverter <List <Menu>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <Menu> >(v));

            var jsonMenuProfilesConverter = new ValueConverter <List <MenuProfile>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <MenuProfile> >(v));

            // App
            var appBuilder = modelBuilder.Entity <App>();

            appBuilder.HasKey(a => a.Id);
            appBuilder.Property(a => a.Menus).HasConversion(jsonMenusConverter);
            appBuilder.Property(a => a.MenuProfiles).HasConversion(jsonMenuProfilesConverter);

            // Portal Version
            var portalVersionBuilder = modelBuilder.Entity <LetPortal.Core.Versions.Version>();

            portalVersionBuilder.HasKey(a => a.Id);

            // Component
            var componentBuilder = modelBuilder.Entity <Component>();

            componentBuilder.HasKey(a => a.Id);

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                componentBuilder.Property(a => a.AllowOverrideOptions).HasColumnType("BIT");
                componentBuilder.Property(a => a.AllowPassingDatasource).HasColumnType("BIT");
            }

            var jsonShellOptionsConverter = new ValueConverter <List <ShellOption>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <ShellOption> >(v));

            componentBuilder.Property(a => a.Options).HasConversion(jsonShellOptionsConverter);

            // Dynamic List
            var dynamicListBuilder = modelBuilder.Entity <DynamicList>();

            dynamicListBuilder.HasBaseType <Component>();

            var jsonDynamicListDatasourceConverter = new ValueConverter <DynamicListDatasource, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <DynamicListDatasource>(v));
            var jsonParamsListConverter = new ValueConverter <ParamsList, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <ParamsList>(v));
            var jsonFiltersListConverter = new ValueConverter <FiltersList, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <FiltersList>(v));
            var jsonColumnsListConverter = new ValueConverter <ColumnsList, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <ColumnsList>(v));
            var jsonCommandsListConverter = new ValueConverter <CommandsList, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <CommandsList>(v));

            dynamicListBuilder.Property(a => a.ListDatasource).HasConversion(jsonDynamicListDatasourceConverter);
            dynamicListBuilder.Property(a => a.ParamsList).HasConversion(jsonParamsListConverter);
            dynamicListBuilder.Property(a => a.FiltersList).HasConversion(jsonFiltersListConverter);
            dynamicListBuilder.Property(a => a.ColumnsList).HasConversion(jsonColumnsListConverter);
            dynamicListBuilder.Property(a => a.CommandsList).HasConversion(jsonCommandsListConverter);

            // Standard
            var standardBuilder = modelBuilder.Entity <StandardComponent>();

            standardBuilder.HasBaseType <Component>();

            var jsonControlsConverter = new ValueConverter <List <PageControl>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PageControl> >(v));

            standardBuilder.Property(a => a.Controls).HasConversion(jsonControlsConverter);

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                standardBuilder.Property(a => a.AllowArrayData).HasColumnType("BIT");
            }

            // Chart
            var chartBuilder = modelBuilder.Entity <Chart>();

            chartBuilder.HasBaseType <Component>();

            var jsonChartDatabaseOptions = new ValueConverter <Entities.Shared.DatabaseOptions, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <Entities.Shared.DatabaseOptions>(v));

            chartBuilder.Property(a => a.DatabaseOptions).HasConversion(jsonChartDatabaseOptions);

            var jsonChartDefinitions = new ValueConverter <ChartDefinitions, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <ChartDefinitions>(v));

            chartBuilder.Property(a => a.Definitions).HasConversion(jsonChartDefinitions);

            var jsonChartFiltersConverter = new ValueConverter <List <ChartFilter>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <ChartFilter> >(v));

            chartBuilder.Property(a => a.ChartFilters).HasConversion(jsonChartFiltersConverter);

            // Page
            var pageBuilder = modelBuilder.Entity <Page>();

            pageBuilder.HasKey(a => a.Id);

            var jsonPortalClaimConverter = new ValueConverter <List <PortalClaim>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PortalClaim> >(v));

            var jsonPageBuilderConverter = new ValueConverter <PageBuilder, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <PageBuilder>(v));

            var jsonPageDatasourceConverter = new ValueConverter <List <PageDatasource>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PageDatasource> >(v));

            var jsonPageEventConverter = new ValueConverter <List <PageEvent>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PageEvent> >(v));

            var jsonPageButtonConverter = new ValueConverter <List <PageButton>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PageButton> >(v));

            pageBuilder.Property(a => a.ShellOptions).HasConversion(jsonShellOptionsConverter);
            pageBuilder.Property(a => a.Claims).HasConversion(jsonPortalClaimConverter);
            pageBuilder.Property(a => a.Builder).HasConversion(jsonPageBuilderConverter);
            pageBuilder.Property(a => a.PageDatasources).HasConversion(jsonPageDatasourceConverter);
            pageBuilder.Property(a => a.Events).HasConversion(jsonPageEventConverter);
            pageBuilder.Property(a => a.Commands).HasConversion(jsonPageButtonConverter);

            // Database Connection
            var databaseConnectionBuilder = modelBuilder.Entity <DatabaseConnection>();

            databaseConnectionBuilder.HasKey(a => a.Id);

            var datasourceBuilder = modelBuilder.Entity <Datasource>();

            datasourceBuilder.HasKey(a => a.Id);
            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                datasourceBuilder.Property(a => a.CanCache).HasColumnType("BIT");
            }

            // Entity Schema
            var entitySchemaBuilder = modelBuilder.Entity <EntitySchema>();

            entitySchemaBuilder.HasKey(a => a.Id);

            var jsonEntityFieldConverter = new ValueConverter <List <EntityField>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <EntityField> >(v));

            entitySchemaBuilder.Property(a => a.EntityFields).HasConversion(jsonEntityFieldConverter);

            // File
            var fileBuilder = modelBuilder.Entity <File>();

            fileBuilder.HasKey(a => a.Id);
            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                fileBuilder.Property(a => a.AllowCompress).HasColumnType("BIT");
            }

            // Backup
            var backupBuilder = modelBuilder.Entity <Backup>();

            backupBuilder.HasKey(a => a.Id);
            var jsonBackupElementsConverter = new ValueConverter <BackupElements, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <BackupElements>(v));

            backupBuilder.Property(a => a.BackupElements).HasConversion(jsonBackupElementsConverter);

            // Localization
            var localizationBuilder = modelBuilder.Entity <Localization>();

            localizationBuilder.HasKey(a => a.Id);
            localizationBuilder.HasMany(a => a.LocalizationContents)
            .WithOne(b => b.Localization)
            .OnDelete(DeleteBehavior.Cascade);

            var localizationContentBuilder = modelBuilder.Entity <LocalizationContent>();

            localizationContentBuilder.HasKey(a => a.Id);

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var property in entity.GetProperties())
                {
                    property.SetColumnName(ToCamelCase(property.GetColumnName()));
                }
            }
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            var serviceBuilder = modelBuilder.Entity <Service>();

            serviceBuilder.HasKey(a => a.Id);

            serviceBuilder.HasOne(a => a.ServiceHardwareInfo).WithOne().OnDelete(DeleteBehavior.Cascade);
            serviceBuilder.HasMany(a => a.MonitorCounters).WithOne(b => b.Service).OnDelete(DeleteBehavior.Cascade);

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                serviceBuilder.Property(a => a.HealthCheckNotifyEnable).HasColumnType("BIT");
                serviceBuilder.Property(a => a.LoggerNotifyEnable).HasColumnType("BIT");
            }

            var logEventBuilder = modelBuilder.Entity <LogEvent>();

            logEventBuilder.HasKey(a => a.Id);

            var jsonStackTracesConverter = new ValueConverter <IEnumerable <string>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <IEnumerable <string> >(v));

            logEventBuilder.Property(a => a.StackTrace).HasConversion(jsonStackTracesConverter);

            var monitorCounterBuilder = modelBuilder.Entity <MonitorCounter>();

            monitorCounterBuilder.HasKey(a => a.Id);

            monitorCounterBuilder.HasOne(a => a.HardwareCounter).WithOne().OnDelete(DeleteBehavior.Cascade);
            monitorCounterBuilder.HasOne(a => a.HttpCounter).WithOne().OnDelete(DeleteBehavior.Cascade);

            var hardwareBuilder = modelBuilder.Entity <HardwareCounter>();

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                hardwareBuilder.Property(a => a.IsCpuBottleneck).HasColumnType("BIT");
                hardwareBuilder.Property(a => a.IsMemoryThreshold).HasColumnType("BIT");
            }

            var monitorHardwareBuilder = modelBuilder.Entity <MonitorHardwareReport>();

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                monitorHardwareBuilder.Property(a => a.IsCpuBottleneck).HasColumnType("BIT");
                monitorHardwareBuilder.Property(a => a.IsMemoryThreshold).HasColumnType("BIT");
            }

            var monitorHttpBuilder = modelBuilder.Entity <MonitorHttpReport>();

            // Declare all model builder
            var jsonMenusConverter = new ValueConverter <List <Menu>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <Menu> >(v));

            var jsonMenuProfilesConverter = new ValueConverter <List <MenuProfile>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <MenuProfile> >(v));

            // App
            var appBuilder = modelBuilder.Entity <App>();

            appBuilder.HasKey(a => a.Id);
            appBuilder.Property(a => a.Menus).HasConversion(jsonMenusConverter);
            appBuilder.Property(a => a.MenuProfiles).HasConversion(jsonMenuProfilesConverter);

            // Portal Version
            var portalVersionBuilder = modelBuilder.Entity <LetPortal.Core.Versions.Version>();

            portalVersionBuilder.HasKey(a => a.Id);

            // Component
            var componentBuilder = modelBuilder.Entity <Component>();

            componentBuilder.HasKey(a => a.Id);

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                componentBuilder.Property(a => a.AllowOverrideOptions).HasColumnType("BIT");
                componentBuilder.Property(a => a.AllowPassingDatasource).HasColumnType("BIT");
            }

            var jsonShellOptionsConverter = new ValueConverter <List <ShellOption>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <ShellOption> >(v));

            componentBuilder.Property(a => a.Options).HasConversion(jsonShellOptionsConverter);

            // Dynamic List
            var dynamicListBuilder = modelBuilder.Entity <DynamicList>();

            dynamicListBuilder.HasBaseType <Component>();

            var jsonDynamicListDatasourceConverter = new ValueConverter <DynamicListDatasource, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <DynamicListDatasource>(v));
            var jsonParamsListConverter = new ValueConverter <ParamsList, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <ParamsList>(v));
            var jsonFiltersListConverter = new ValueConverter <FiltersList, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <FiltersList>(v));
            var jsonColumnsListConverter = new ValueConverter <ColumnsList, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <ColumnsList>(v));
            var jsonCommandsListConverter = new ValueConverter <CommandsList, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <CommandsList>(v));

            dynamicListBuilder.Property(a => a.ListDatasource).HasConversion(jsonDynamicListDatasourceConverter);
            dynamicListBuilder.Property(a => a.ParamsList).HasConversion(jsonParamsListConverter);
            dynamicListBuilder.Property(a => a.FiltersList).HasConversion(jsonFiltersListConverter);
            dynamicListBuilder.Property(a => a.ColumnsList).HasConversion(jsonColumnsListConverter);
            dynamicListBuilder.Property(a => a.CommandsList).HasConversion(jsonCommandsListConverter);

            // Standard
            var standardBuilder = modelBuilder.Entity <StandardComponent>();

            standardBuilder.HasBaseType <Component>();

            var jsonControlsConverter = new ValueConverter <List <PageControl>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PageControl> >(v));

            standardBuilder.Property(a => a.Controls).HasConversion(jsonControlsConverter);

            // Chart
            var chartBuilder = modelBuilder.Entity <Chart>();

            chartBuilder.HasBaseType <Component>();

            var jsonChartDatabaseOptions = new ValueConverter <SharedDatabaseOptions, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <SharedDatabaseOptions>(v));

            chartBuilder.Property(a => a.DatabaseOptions).HasConversion(jsonChartDatabaseOptions);

            var jsonChartDefinitions = new ValueConverter <ChartDefinitions, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <ChartDefinitions>(v));

            chartBuilder.Property(a => a.Definitions).HasConversion(jsonChartDefinitions);

            var jsonChartFiltersConverter = new ValueConverter <List <ChartFilter>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <ChartFilter> >(v));

            chartBuilder.Property(a => a.ChartFilters).HasConversion(jsonChartFiltersConverter);

            // Page
            var pageBuilder = modelBuilder.Entity <Page>();

            pageBuilder.HasKey(a => a.Id);

            var jsonPortalClaimConverter = new ValueConverter <List <PortalClaim>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PortalClaim> >(v));

            var jsonPageBuilderConverter = new ValueConverter <PageBuilder, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <PageBuilder>(v));

            var jsonPageDatasourceConverter = new ValueConverter <List <PageDatasource>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PageDatasource> >(v));

            var jsonPageEventConverter = new ValueConverter <List <PageEvent>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PageEvent> >(v));

            var jsonPageButtonConverter = new ValueConverter <List <PageButton>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <PageButton> >(v));

            pageBuilder.Property(a => a.ShellOptions).HasConversion(jsonShellOptionsConverter);
            pageBuilder.Property(a => a.Claims).HasConversion(jsonPortalClaimConverter);
            pageBuilder.Property(a => a.Builder).HasConversion(jsonPageBuilderConverter);
            pageBuilder.Property(a => a.PageDatasources).HasConversion(jsonPageDatasourceConverter);
            pageBuilder.Property(a => a.Events).HasConversion(jsonPageEventConverter);
            pageBuilder.Property(a => a.Commands).HasConversion(jsonPageButtonConverter);

            // Database Connection
            var databaseConnectionBuilder = modelBuilder.Entity <DatabaseConnection>();

            databaseConnectionBuilder.HasKey(a => a.Id);

            var datasourceBuilder = modelBuilder.Entity <Datasource>();

            datasourceBuilder.HasKey(a => a.Id);
            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                datasourceBuilder.Property(a => a.CanCache).HasColumnType("BIT");
            }

            // Entity Schema
            var entitySchemaBuilder = modelBuilder.Entity <EntitySchema>();

            entitySchemaBuilder.HasKey(a => a.Id);

            var jsonEntityFieldConverter = new ValueConverter <List <EntityField>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <EntityField> >(v));

            entitySchemaBuilder.Property(a => a.EntityFields).HasConversion(jsonEntityFieldConverter);

            // File
            var fileBuilder = modelBuilder.Entity <File>();

            fileBuilder.HasKey(a => a.Id);
            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                fileBuilder.Property(a => a.AllowCompress).HasColumnType("BIT");
            }

            // Backup
            var backupBuilder = modelBuilder.Entity <Backup>();

            backupBuilder.HasKey(a => a.Id);
            var jsonBackupElementsConverter = new ValueConverter <BackupElements, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <BackupElements>(v));

            backupBuilder.Property(a => a.BackupElements).HasConversion(jsonBackupElementsConverter);

            // Localization
            var localizationBuilder = modelBuilder.Entity <Localization>();

            localizationBuilder.HasKey(a => a.Id);
            localizationBuilder.HasMany(a => a.LocalizationContents)
            .WithOne(b => b.Localization)
            .OnDelete(DeleteBehavior.Cascade);

            var localizationContentBuilder = modelBuilder.Entity <LocalizationContent>();

            localizationContentBuilder.HasKey(a => a.Id);

            // Composite control
            var compositeControlBuilder = modelBuilder.Entity <CompositeControl>();

            compositeControlBuilder.HasKey(a => a.Id);

            var userBuilder = modelBuilder.Entity <User>();

            userBuilder.HasKey(a => a.Id);

            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                userBuilder.Property(a => a.IsConfirmedEmail).HasColumnType("BIT");
                userBuilder.Property(a => a.IsLockoutEnabled).HasColumnType("BIT");
            }

            var jsonRolesConverter = new ValueConverter <List <string>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <string> >(v));

            var jsonClaimsConverter = new ValueConverter <List <BaseClaim>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <BaseClaim> >(v));

            userBuilder.Property(a => a.Roles).HasConversion(jsonRolesConverter);
            userBuilder.Property(a => a.Claims).HasConversion(jsonClaimsConverter);

            var roleBuilder = modelBuilder.Entity <Role>();

            roleBuilder.HasKey(a => a.Id);

            roleBuilder.Property(a => a.Claims).HasConversion(jsonClaimsConverter);

            var issueTokenBuilder = modelBuilder.Entity <IssuedToken>();

            issueTokenBuilder.HasKey(a => a.Id);
            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                issueTokenBuilder.Property(a => a.Deactive).HasColumnType("BIT");
            }

            var userSessionBuilder = modelBuilder.Entity <UserSession>();

            userSessionBuilder.HasKey(a => a.Id);
            userSessionBuilder.HasMany(a => a.UserActivities).WithOne().OnDelete(DeleteBehavior.Cascade);
            if (_options.ConnectionType == ConnectionType.MySQL)
            {
                userSessionBuilder.Property(a => a.AlreadySignOut).HasColumnType("BIT");
            }

            var userActivityBuilder = modelBuilder.Entity <UserActivity>();

            userActivityBuilder.HasKey(a => a.Id);

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var property in entity.GetProperties())
                {
                    property.SetColumnName(ToCamelCase(property.GetColumnName()));
                }
            }
        }
Example #15
0
        public async Task <UnpackResponseModel> Unpack(IFormFile uploadFile, string uploader)
        {
            var unpackResponse = new UnpackResponseModel {
            };

            var isFileValid = await _fileSeviceProvider.ValidateFile(uploadFile);

            if (isFileValid)
            {
                var storedFilePath = Path.Combine(Environment.CurrentDirectory, "Temp", "Unpackages");
                Directory.CreateDirectory(storedFilePath);
                var tempFilePath = await SaveFormFileAsync(uploadFile, storedFilePath);

                var unzipFileName   = Path.GetFileNameWithoutExtension(tempFilePath);
                var unzipFolderPath = Path.Combine(storedFilePath, Path.GetFileNameWithoutExtension(tempFilePath));
                if (Directory.Exists(unzipFolderPath))
                {
                    // Delete old directory
                    Directory.Delete(unzipFolderPath, true);
                }

                Directory.CreateDirectory(unzipFolderPath);
                ZipFile.ExtractToDirectory(tempFilePath, unzipFolderPath);
                var jsonFilePath = Path.Combine(unzipFolderPath, unzipFileName + ".json");
                var jsonFound    = File.ReadAllText(jsonFilePath);

                var appFlatternModel = ConvertUtil.DeserializeObject <AppPackageFlatternModel>(jsonFound);

                var app = await _appRepository.GetOneAsync(appFlatternModel.App.Id);

                unpackResponse.IsExistedId   = app != null;
                unpackResponse.IsExistedName = await _appRepository.IsExistAsync(a => a.Name == appFlatternModel.App.Name);

                // Save zip file into file service
                var storedFile = await _fileSeviceProvider.UploadFileAsync(tempFilePath, uploader, true);

                unpackResponse.App          = appFlatternModel.App;
                unpackResponse.UploadFileId = storedFile.FileId;
                unpackResponse.Description  = appFlatternModel.Description;
                unpackResponse.PackagedDate = appFlatternModel.PackagedDate;
                unpackResponse.Creator      = appFlatternModel.Creator;

                unpackResponse.TotalStandards    = appFlatternModel.TotalStandards.GetValueOrDefault();
                unpackResponse.TotalDynamicLists = appFlatternModel.TotalDynamicLists.GetValueOrDefault();
                unpackResponse.TotalCharts       = appFlatternModel.TotalCharts.GetValueOrDefault();
                unpackResponse.TotalPages        = appFlatternModel.TotalPages.GetValueOrDefault();
                unpackResponse.TotalLocales      = appFlatternModel.TotalLocales.GetValueOrDefault();

                foreach (var chainingFile in appFlatternModel.ChainingFiles)
                {
                    switch (chainingFile)
                    {
                    case STANDARD_FILE:
                        var standardFilePath = Path.Combine(unzipFolderPath, STANDARD_FILE);
                        var standardsString  = File.ReadAllText(standardFilePath);
                        var standardsList    = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(standardsString);
                        var standardStates   = new List <ComponentInstallState>();
                        foreach (var standard in standardsList)
                        {
                            standardStates.Add(new ComponentInstallState
                            {
                                Name      = standard.DisplayName,
                                IsExisted = await _standardServiceProvider.CheckStandardExist(a => a.Name == standard.Name || a.Id == standard.Id)
                            });
                        }
                        unpackResponse.Standards = standardStates;
                        break;

                    case DYNAMICLIST_FILE:
                        var dynamicListFilePath = Path.Combine(unzipFolderPath, DYNAMICLIST_FILE);
                        var dynamicListString   = File.ReadAllText(dynamicListFilePath);
                        var dynamicListsList    = ConvertUtil.DeserializeObject <IEnumerable <DynamicList> >(dynamicListString);
                        var dynamicListStates   = new List <ComponentInstallState>();
                        foreach (var dynamicList in dynamicListsList)
                        {
                            dynamicListStates.Add(new ComponentInstallState
                            {
                                Name      = dynamicList.DisplayName,
                                IsExisted = await _dynamicListServiceProvider.CheckDynamicListExist(a => a.Name == dynamicList.Name || a.Id == dynamicList.Id)
                            });
                        }
                        unpackResponse.DynamicLists = dynamicListStates;
                        break;

                    case CHART_FILE:
                        var chartFilePath    = Path.Combine(unzipFolderPath, CHART_FILE);
                        var chartsString     = File.ReadAllText(chartFilePath);
                        var chartsList       = ConvertUtil.DeserializeObject <IEnumerable <Chart> >(chartsString);
                        var chartsListStates = new List <ComponentInstallState>();
                        foreach (var chart in chartsList)
                        {
                            chartsListStates.Add(new ComponentInstallState
                            {
                                Name      = chart.DisplayName,
                                IsExisted = await _chartServiceProvider.CheckChartExist(a => a.Name == chart.Name || a.Id == chart.Id)
                            });
                        }
                        unpackResponse.Charts = chartsListStates;
                        break;

                    case PAGE_FILE:
                        var pageFilePath    = Path.Combine(unzipFolderPath, PAGE_FILE);
                        var pagesString     = File.ReadAllText(pageFilePath);
                        var pagesList       = ConvertUtil.DeserializeObject <IEnumerable <Page> >(pagesString);
                        var pagesListStates = new List <ComponentInstallState>();
                        foreach (var page in pagesList)
                        {
                            pagesListStates.Add(new ComponentInstallState
                            {
                                Name      = page.DisplayName,
                                IsExisted = await _pageServiceProvider.CheckPageExist(a => a.Name == page.Name || a.Id == page.Id)
                            });
                        }
                        unpackResponse.Pages = pagesListStates;
                        break;

                    case LOCALE_FILE:
                        var localeFilePath    = Path.Combine(unzipFolderPath, LOCALE_FILE);
                        var localesString     = File.ReadAllText(localeFilePath);
                        var localesList       = ConvertUtil.DeserializeObject <IEnumerable <Localization> >(localesString);
                        var localesListStates = new List <ComponentInstallState>();
                        foreach (var locale in localesList)
                        {
                            localesListStates.Add(new ComponentInstallState
                            {
                                Name      = locale.LocaleId,
                                IsExisted = await _localizationProvider.CheckLocaleExist(a => a.LocaleId == locale.LocaleId && a.AppId == locale.AppId)
                            });
                        }
                        unpackResponse.Locales = localesListStates;
                        break;
                    }
                }
            }

            return(unpackResponse);
        }
Example #16
0
        public async Task RestoreBackupPoint(string backupId)
        {
            var backup = await _backupRepository.GetOneAsync(backupId);

            var zipFile = await _fileSeviceProvider.DownloadFileAsync(backup.FileId);

            var fileNameWithoutExt = FileUtil.GetFileNameWithoutExt(zipFile.FileName);
            var restoreFilePath    = Path.Combine(_backupOptions.CurrentValue.RestoreFolderPath, zipFile.FileName);

            Directory.CreateDirectory(_backupOptions.CurrentValue.RestoreFolderPath);
            using (var fileStream = File.Create(restoreFilePath))
            {
                fileStream.Write(zipFile.FileBytes, 0, zipFile.FileBytes.Length);
            }

            // Release file in memory
            zipFile.FileBytes = null;
            var folderExtractingPath = Path.Combine(_backupOptions.CurrentValue.RestoreFolderPath, fileNameWithoutExt);

            if (Directory.Exists(folderExtractingPath))
            {
                Directory.Delete(folderExtractingPath, true);
            }
            ZipFile.ExtractToDirectory(restoreFilePath, folderExtractingPath);

            var jsonBackupFilePath = Path.Combine(folderExtractingPath, fileNameWithoutExt + ".json");

            var jsonBackupString    = File.ReadAllText(jsonBackupFilePath);
            var backupFlatternModel = ConvertUtil.DeserializeObject <BackupFlatternFileModel>(jsonBackupString);

            foreach (var chainingFile in backupFlatternModel.ChainingFiles)
            {
                switch (chainingFile)
                {
                case APP_FILE:
                    var appFilePath    = Path.Combine(folderExtractingPath, APP_FILE);
                    var appsListString = File.ReadAllText(appFilePath);
                    var appsList       = ConvertUtil.DeserializeObject <IEnumerable <App> >(appsListString);
                    await _appServiceProvider.ForceUpdateApps(appsList);

                    break;

                case STANDARD_FILE:
                    var standardFilePath = Path.Combine(folderExtractingPath, STANDARD_FILE);
                    var standardsString  = File.ReadAllText(standardFilePath);
                    var standardsList    = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(standardsString);
                    await _standardServiceProvider.ForceUpdateStandards(standardsList);

                    break;

                case TREE_FILE:
                    var treeFilePath = Path.Combine(folderExtractingPath, TREE_FILE);
                    var treeString   = File.ReadAllText(treeFilePath);
                    var treeList     = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(treeString);
                    await _standardServiceProvider.ForceUpdateStandards(treeList);

                    break;

                case ARRAY_FILE:
                    var arrayFilePath = Path.Combine(folderExtractingPath, ARRAY_FILE);
                    var arrayString   = File.ReadAllText(arrayFilePath);
                    var arrayList     = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(arrayString);
                    await _standardServiceProvider.ForceUpdateStandards(arrayList);

                    break;

                case CHART_FILE:
                    var chartFilePath = Path.Combine(folderExtractingPath, CHART_FILE);
                    var chartsString  = File.ReadAllText(chartFilePath);
                    var chartsList    = ConvertUtil.DeserializeObject <IEnumerable <Chart> >(chartsString);
                    await _chartServiceProvider.ForceUpdateCharts(chartsList);

                    break;

                case DATABASE_FILE:
                    var databaseFilePath = Path.Combine(folderExtractingPath, DATABASE_FILE);
                    var databasesString  = File.ReadAllText(databaseFilePath);
                    var databasesList    = ConvertUtil.DeserializeObject <IEnumerable <DatabaseConnection> >(databasesString);
                    await _databaseServiceProvider.ForceUpdateDatabases(databasesList);

                    break;

                case PAGE_FILE:
                    var pageFilePath = Path.Combine(folderExtractingPath, PAGE_FILE);
                    var pagesString  = File.ReadAllText(pageFilePath);
                    var pagesList    = ConvertUtil.DeserializeObject <IEnumerable <Page> >(pagesString);
                    await _pageServiceProvider.ForceUpdatePages(pagesList);

                    break;

                case DYNAMICLIST_FILE:
                    var dynamicListFilePath = Path.Combine(folderExtractingPath, DYNAMICLIST_FILE);
                    var dynamicListString   = File.ReadAllText(dynamicListFilePath);
                    var dynamicListsList    = ConvertUtil.DeserializeObject <IEnumerable <DynamicList> >(dynamicListString);
                    await _dynamicListServiceProvider.ForceUpdateDynamicLists(dynamicListsList);

                    break;

                case COMPOSITE_CONTROL_FILE:
                    var compositeFilePath = Path.Combine(folderExtractingPath, COMPOSITE_CONTROL_FILE);
                    var compositeString   = File.ReadAllText(compositeFilePath);
                    var compositeList     = ConvertUtil.DeserializeObject <IEnumerable <CompositeControl> >(compositeString);
                    await _compositeControlServiceProvider.ForceUpdate(compositeList);

                    break;

                default:
                    break;
                }
            }

            Directory.Delete(folderExtractingPath, true);
            File.Delete(restoreFilePath);
        }
Example #17
0
        public async Task Install(string uploadFileId, InstallWay installWay = InstallWay.Merge)
        {
            var zipFile = await _fileSeviceProvider.DownloadFileAsync(uploadFileId);

            var fileNameWithoutExt = FileUtil.GetFileNameWithoutExt(zipFile.FileName);
            var restoreFolderPath  = Path.Combine(Environment.CurrentDirectory, "Temp", "InstallationPackages");

            Directory.CreateDirectory(restoreFolderPath);
            var restoreFilePath = Path.Combine(restoreFolderPath, zipFile.FileName);

            using (var fileStream = File.Create(restoreFilePath))
            {
                fileStream.Write(zipFile.FileBytes, 0, zipFile.FileBytes.Length);
            }
            // Release file in memory
            zipFile.FileBytes = null;
            var folderExtractingPath = Path.Combine(restoreFolderPath, fileNameWithoutExt);

            if (Directory.Exists(folderExtractingPath))
            {
                Directory.Delete(folderExtractingPath, true);
            }
            ZipFile.ExtractToDirectory(restoreFilePath, folderExtractingPath);

            var jsonAppPackageFilePath = Path.Combine(folderExtractingPath, fileNameWithoutExt + ".json");

            var jsonAppPackageString = File.ReadAllText(jsonAppPackageFilePath);
            var appFlatternModel     = ConvertUtil.DeserializeObject <AppPackageFlatternModel>(jsonAppPackageString);

            var isExist = await _appRepository.IsExistAsync(a => a.Id == appFlatternModel.App.Id);

            switch (installWay)
            {
            case InstallWay.Merge:
                break;

            case InstallWay.Wipe:
                if (isExist)
                {
                    // Wipe all data
                    await _standardServiceProvider.DeleteAllByAppIdAsync(appFlatternModel.App.Id);

                    await _dynamicListServiceProvider.DeleteByAppIdAsync(appFlatternModel.App.Id);

                    await _chartServiceProvider.DeleteByAppIdAsync(appFlatternModel.App.Id);

                    await _pageServiceProvider.DeleteByAppIdAsync(appFlatternModel.App.Id);

                    await _localizationProvider.DeleteByAppIdAsync(appFlatternModel.App.Id);
                }
                break;
            }

            foreach (var chainingFile in appFlatternModel.ChainingFiles)
            {
                switch (chainingFile)
                {
                case STANDARD_FILE:
                    var standardFilePath = Path.Combine(folderExtractingPath, STANDARD_FILE);
                    var standardsString  = File.ReadAllText(standardFilePath);
                    var standardsList    = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(standardsString);
                    await _standardServiceProvider.ForceUpdateStandards(standardsList);

                    break;

                case DYNAMICLIST_FILE:
                    var dynamicListFilePath = Path.Combine(folderExtractingPath, DYNAMICLIST_FILE);
                    var dynamicListString   = File.ReadAllText(dynamicListFilePath);
                    var dynamicListsList    = ConvertUtil.DeserializeObject <IEnumerable <DynamicList> >(dynamicListString);
                    await _dynamicListServiceProvider.ForceUpdateDynamicLists(dynamicListsList);

                    break;

                case CHART_FILE:
                    var chartFilePath = Path.Combine(folderExtractingPath, CHART_FILE);
                    var chartsString  = File.ReadAllText(chartFilePath);
                    var chartsList    = ConvertUtil.DeserializeObject <IEnumerable <Chart> >(chartsString);
                    await _chartServiceProvider.ForceUpdateCharts(chartsList);

                    break;

                case PAGE_FILE:
                    var pageFilePath = Path.Combine(folderExtractingPath, PAGE_FILE);
                    var pagesString  = File.ReadAllText(pageFilePath);
                    var pagesList    = ConvertUtil.DeserializeObject <IEnumerable <Page> >(pagesString);
                    await _pageServiceProvider.ForceUpdatePages(pagesList);

                    break;

                case LOCALE_FILE:
                    var localeFilePath = Path.Combine(folderExtractingPath, LOCALE_FILE);
                    var localesString  = File.ReadAllText(localeFilePath);
                    var localesList    = ConvertUtil.DeserializeObject <IEnumerable <Localization> >(localesString);
                    await _localizationProvider.ForceUpdateLocalizations(localesList);

                    break;
                }
            }

            await _appRepository.ForceUpdateAsync(appFlatternModel.App.Id, appFlatternModel.App);

            Directory.Delete(folderExtractingPath, true);
            File.Delete(restoreFilePath);
        }
Example #18
0
        public async Task <IEnumerable <string> > Proceed(
            string folderPath,
            DatabaseOptions databaseOptions)
        {
            // Ensure this folder is exist
            if (!Directory.Exists(folderPath))
            {
                return(Enumerable.Empty <string>());
            }
            var allZipFiles     = Directory.GetFiles(folderPath, "*.zip");
            var allRunningFiles = new List <string>();

            if (allZipFiles != null && allZipFiles.Length > 0)
            {
                if (Directory.Exists("Temp"))
                {
                    Directory.Delete("Temp", true);
                }

                Directory.CreateDirectory("Temp");

                foreach (var file in allZipFiles)
                {
                    var fileNameWithoutExt = Path.GetFileNameWithoutExtension(file);
                    var extractFolder      = Path.Combine("Temp", fileNameWithoutExt);
                    ZipFile.ExtractToDirectory(file, extractFolder);

                    var backupFlatternModel = ConvertUtil.DeserializeObject <BackupFlatternFileModel>(File.ReadAllText(Path.Combine(extractFolder, fileNameWithoutExt + ".json")));

                    foreach (var chainingFile in backupFlatternModel.ChainingFiles)
                    {
                        switch (chainingFile)
                        {
                        case BackupService.APP_FILE:
                            var            appFilePath    = Path.Combine(extractFolder, BackupService.APP_FILE);
                            var            appsListString = File.ReadAllText(appFilePath);
                            var            appsList       = ConvertUtil.DeserializeObject <IEnumerable <App> >(appsListString);
                            IAppRepository appRepository;
                            if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                appRepository = new AppMongoRepository(new MongoConnection(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            else
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                appRepository = new AppEFRepository(new Portal.Repositories.PortalDbContext(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }

                            var appServiceProvider = new InternalAppServiceProvider(appRepository);
                            await appServiceProvider.ForceUpdateApps(appsList);

                            appServiceProvider.Dispose();
                            break;

                        case BackupService.STANDARD_FILE:
                            var standardFilePath = Path.Combine(extractFolder, BackupService.STANDARD_FILE);
                            var standardsString  = File.ReadAllText(standardFilePath);
                            var standardsList    = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(standardsString);
                            IStandardRepository standardRepository;
                            if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                standardRepository = new StandardMongoRepository(new MongoConnection(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            else
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                standardRepository = new StandardEFRepository(new Portal.Repositories.PortalDbContext(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            var standardServiceProvider = new InternalStandardServiceProvider(standardRepository);
                            await standardServiceProvider.ForceUpdateStandards(standardsList);

                            standardServiceProvider.Dispose();
                            break;

                        case BackupService.CHART_FILE:
                            var chartFilePath = Path.Combine(extractFolder, BackupService.CHART_FILE);
                            var chartsString  = File.ReadAllText(chartFilePath);
                            var chartsList    = ConvertUtil.DeserializeObject <IEnumerable <Chart> >(chartsString);
                            IChartRepository chartRepository;
                            if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                chartRepository = new ChartMongoRepository(new MongoConnection(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            else
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                chartRepository = new ChartEFRepository(new Portal.Repositories.PortalDbContext(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            var chartServiceProvider = new InternalChartServiceProvider(chartRepository);
                            await chartServiceProvider.ForceUpdateCharts(chartsList);

                            chartServiceProvider.Dispose();
                            break;

                        case BackupService.DATABASE_FILE:
                            var databaseFilePath = Path.Combine(extractFolder, BackupService.DATABASE_FILE);
                            var databasesString  = File.ReadAllText(databaseFilePath);
                            var databasesList    = ConvertUtil.DeserializeObject <IEnumerable <DatabaseConnection> >(databasesString);
                            IDatabaseRepository databaseRepository;
                            if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                databaseRepository = new DatabaseMongoRepository(new MongoConnection(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            else
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                databaseRepository = new DatabaseEFRepository(new PortalDbContext(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            var databaseServiceProvider = new InternalDatabaseServiceProvider(new DatabaseService(null, null), databaseRepository);
                            await databaseServiceProvider.ForceUpdateDatabases(databasesList);

                            databaseServiceProvider.Dispose();
                            break;

                        case BackupService.PAGE_FILE:
                            var             pageFilePath = Path.Combine(extractFolder, BackupService.PAGE_FILE);
                            var             pagesString  = File.ReadAllText(pageFilePath);
                            var             pagesList    = ConvertUtil.DeserializeObject <IEnumerable <Page> >(pagesString);
                            IPageRepository pageRepository;
                            if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                pageRepository = new PageMongoRepository(new MongoConnection(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            else
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                pageRepository = new PageEFRepository(new PortalDbContext(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            var pageServiceProvider = new InternalPageServiceProvider(pageRepository, null, null, null);
                            await pageServiceProvider.ForceUpdatePages(pagesList);

                            pageServiceProvider.Dispose();
                            break;

                        case BackupService.DYNAMICLIST_FILE:
                            var dynamicListFilePath = Path.Combine(extractFolder, BackupService.DYNAMICLIST_FILE);
                            var dynamicListString   = File.ReadAllText(dynamicListFilePath);
                            var dynamicListsList    = ConvertUtil.DeserializeObject <IEnumerable <DynamicList> >(dynamicListString);
                            IDynamicListRepository dynamicListRepository;
                            if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                dynamicListRepository = new DynamicListMongoRepository(new MongoConnection(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            else
                            {
#pragma warning disable CA2000 // Dispose objects before losing scope
                                dynamicListRepository = new DynamicListEFRepository(new PortalDbContext(databaseOptions));
#pragma warning restore CA2000 // Dispose objects before losing scope
                            }
                            var dynamicListServiceProvider = new InternalDynamicListServiceProvider(dynamicListRepository);
                            await dynamicListServiceProvider.ForceUpdateDynamicLists(dynamicListsList);

                            dynamicListServiceProvider.Dispose();
                            break;

                        default:
                            break;
                        }
                    }

                    allRunningFiles.Add(fileNameWithoutExt + ".zip");
                }
            }

            return(allRunningFiles);
        }
Example #19
0
        public async Task <PreviewRestoreModel> PreviewBackup(string backupId)
        {
            var previewModel = new PreviewRestoreModel();
            var backup       = await _backupRepository.GetOneAsync(backupId);

            var zipFile = await _fileSeviceProvider.DownloadFileAsync(backup.FileId);

            var fileNameWithoutExt = FileUtil.GetFileNameWithoutExt(zipFile.FileName);
            var restoreFilePath    = Path.Combine(_backupOptions.CurrentValue.RestoreFolderPath, zipFile.FileName);

            using (var fileStream = File.Create(restoreFilePath))
            {
                fileStream.Write(zipFile.FileBytes, 0, zipFile.FileBytes.Length);
            }

            // Release file in memory
            zipFile.FileBytes = null;
            var folderExtractingPath = Path.Combine(_backupOptions.CurrentValue.RestoreFolderPath, fileNameWithoutExt);

            if (Directory.Exists(folderExtractingPath))
            {
                Directory.Delete(folderExtractingPath, true);
            }
            ZipFile.ExtractToDirectory(restoreFilePath, folderExtractingPath);

            var jsonBackupFilePath = Path.Combine(folderExtractingPath, fileNameWithoutExt + ".json");

            var jsonBackupString    = File.ReadAllText(jsonBackupFilePath);
            var backupFlatternModel = ConvertUtil.DeserializeObject <BackupFlatternFileModel>(jsonBackupString);

            foreach (var chainingFile in backupFlatternModel.ChainingFiles)
            {
                switch (chainingFile)
                {
                case APP_FILE:
                    var appFilePath    = Path.Combine(folderExtractingPath, APP_FILE);
                    var appsListString = File.ReadAllText(appFilePath);
                    var appsList       = ConvertUtil.DeserializeObject <IEnumerable <App> >(appsListString);
                    previewModel.Apps = await _appServiceProvider.CompareEntities(appsList);

                    break;

                case STANDARD_FILE:
                    var standardFilePath = Path.Combine(folderExtractingPath, STANDARD_FILE);
                    var standardsString  = File.ReadAllText(standardFilePath);
                    var standarsList     = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(standardsString);
                    previewModel.Standards = await _standardServiceProvider.CompareStandardComponent(standarsList);

                    break;

                case CHART_FILE:
                    var chartFilePath = Path.Combine(folderExtractingPath, CHART_FILE);
                    var chartsString  = File.ReadAllText(chartFilePath);
                    var chartsList    = ConvertUtil.DeserializeObject <IEnumerable <Chart> >(chartsString);
                    previewModel.Charts = await _chartServiceProvider.CompareCharts(chartsList);

                    break;

                case DATABASE_FILE:
                    var databaseFilePath = Path.Combine(folderExtractingPath, DATABASE_FILE);
                    var databasesString  = File.ReadAllText(databaseFilePath);
                    var databasesList    = ConvertUtil.DeserializeObject <IEnumerable <DatabaseConnection> >(databasesString);
                    previewModel.Databases = await _databaseServiceProvider.CompareDatabases(databasesList);

                    break;

                case PAGE_FILE:
                    var pageFilePath = Path.Combine(folderExtractingPath, PAGE_FILE);
                    var pagesString  = File.ReadAllText(pageFilePath);
                    var pagesList    = ConvertUtil.DeserializeObject <IEnumerable <Page> >(pagesString);
                    previewModel.Pages = await _pageServiceProvider.ComparePages(pagesList);

                    break;

                case DYNAMICLIST_FILE:
                    var dynamicListFilePath = Path.Combine(folderExtractingPath, DYNAMICLIST_FILE);
                    var dynamicListString   = File.ReadAllText(dynamicListFilePath);
                    var dynamicListsList    = ConvertUtil.DeserializeObject <IEnumerable <DynamicList> >(dynamicListString);
                    previewModel.DynamicLists = await _dynamicListServiceProvider.CompareDynamicLists(dynamicListsList);

                    break;

                default:
                    break;
                }
            }

            Directory.Delete(folderExtractingPath, true);
            File.Delete(restoreFilePath);

            previewModel.TotalObjects =
                (previewModel.Apps != null ? previewModel.Apps.Count() : 0) +
                (previewModel.Charts != null ? previewModel.Charts.Count() : 0) +
                (previewModel.Databases != null ? previewModel.Databases.Count() : 0) +
                (previewModel.DynamicLists != null ? previewModel.DynamicLists.Count() : 0) +
                (previewModel.Pages != null ? previewModel.Pages.Count() : 0) +
                (previewModel.Standards != null ? previewModel.Standards.Count() : 0);

            previewModel.TotalNewObjects =
                (previewModel.Apps != null ? previewModel.Apps.Count(a => a.IsTotallyNew) : 0) +
                (previewModel.Charts != null ? previewModel.Charts.Count(a => a.IsTotallyNew) : 0) +
                (previewModel.Databases != null ? previewModel.Databases.Count(a => a.IsTotallyNew) : 0) +
                (previewModel.DynamicLists != null ? previewModel.DynamicLists.Count(a => a.IsTotallyNew) : 0) +
                (previewModel.Pages != null ? previewModel.Pages.Count(a => a.IsTotallyNew) : 0) +
                (previewModel.Standards != null ? previewModel.Standards.Count(a => a.IsTotallyNew) : 0);

            previewModel.TotalUnchangedObjects =
                (previewModel.Apps != null ? previewModel.Apps.Count(a => a.IsUnchanged) : 0) +
                (previewModel.Charts != null ? previewModel.Charts.Count(a => a.IsUnchanged) : 0) +
                (previewModel.Databases != null ? previewModel.Databases.Count(a => a.IsUnchanged) : 0) +
                (previewModel.DynamicLists != null ? previewModel.DynamicLists.Count(a => a.IsUnchanged) : 0) +
                (previewModel.Pages != null ? previewModel.Pages.Count(a => a.IsUnchanged) : 0) +
                (previewModel.Standards != null ? previewModel.Standards.Count(a => a.IsUnchanged) : 0);

            previewModel.TotalChangedObjects =
                previewModel.TotalObjects - previewModel.TotalNewObjects - previewModel.TotalUnchangedObjects;

            return(previewModel);
        }
Example #20
0
        public async Task <T> LoadAsync <T>(T target, string siteId)
        {
            var typeOfT = typeof(T);

            if (target == null)
            {
                target = (T)Activator.CreateInstance(typeof(T));
            }

            if (target is IThemeManifest)
            {
                var properties = typeOfT.GetProperties();
                var list       = new List <Tuple <string, object, PropertyInfo> >();
                foreach (var prop in properties)
                {
                    // Ensure this prop has Setter method
                    if (prop.GetSetMethod() != null &&
                        prop.GetCustomAttribute <NotManifestAttribute>() == null)
                    {
                        var key           = prop.Name;
                        var nameAttribute = prop.GetCustomAttribute <ManifestNameAttribute>();
                        if (nameAttribute != null)
                        {
                            key = nameAttribute.GetName();
                        }

                        list.Add(new Tuple <string, object, PropertyInfo>(key, null, prop));
                    }
                }

                if (list.Count > 0)
                {
                    var siteManifests = await _siteManifestRepository.GetSiteManifestsAsync(list.Select(a => a.Item1), siteId);

                    foreach (var siteManifest in siteManifests)
                    {
                        var propReflector = list.First(a => a.Item1 == siteManifest.Key);
                        var foundValue    = siteManifest.ConfigurableValue;
                        var prop          = propReflector.Item3;
                        if (foundValue != null)
                        {
                            if (prop.PropertyType == typeof(string) ||
                                prop.PropertyType == typeof(decimal) ||
                                prop.PropertyType.IsValueType ||
                                prop.PropertyType.IsEnum)
                            {
                                var typeConverter    = TypeDescriptor.GetConverter(prop.PropertyType);
                                var typeConverterObj = typeConverter.ConvertFromString(foundValue);
                                prop.SetValue(target, typeConverterObj);
                            }
                            else
                            {
                                var convertingObj = ConvertUtil.DeserializeObject(foundValue, prop.PropertyType);
                                prop.SetValue(target, convertingObj);
                            }
                        }
                    }
                }

                return(target);
            }

            throw new NotImplementedException();
        }
Example #21
0
        private string GenerateFilterColumns(IEnumerable <ChartFilterValue> filterValues, ref List <ChartReportParameter> parameters)
        {
            var filterStr = string.Empty;

            var counter = 0;

            foreach (var filter in filterValues)
            {
                switch (filter.FilterType)
                {
                case Entities.Components.FilterType.Checkbox:
                    var tempCheckBoxParam = StringUtil.GenerateUniqueName();
                    filterStr += string.Format("{0}={1}", GetFieldFormat(filter.Name), GetFieldWithParamSign(tempCheckBoxParam));

                    // Only for MySQL, bool is 0 or 1
                    var passValue = 0;
                    if (filter.Value == "0" || filter.Value == "1")
                    {
                        passValue = filter.Value == "0" ? 0 : 1;
                    }
                    else
                    {
                        passValue = !bool.Parse(filter.Value) ? 0 : 1;
                    }
                    parameters.Add(new ChartReportParameter
                    {
                        Name        = tempCheckBoxParam,
                        CastedValue = passValue == 1,
                        ValueType   = "bool"
                    });
                    break;

                case Entities.Components.FilterType.Select:
                    if (filter.IsMultiple)
                    {
                        var isArrayStr = filter.Value.Any(a => a == '\'' || a == '"');
                        if (isArrayStr)
                        {
                            var arrayStr = ConvertUtil.DeserializeObject <List <string> >(filter.Value);
                            foreach (var str in arrayStr)
                            {
                                if (arrayStr.IndexOf(str) == 0)
                                {
                                    filterStr += "(";
                                }
                                var tempSelectParam = StringUtil.GenerateUniqueName();
                                filterStr += string.Format("{0}={1}", GetFieldFormat(filter.Name), GetFieldWithParamSign(tempSelectParam));
                                if (arrayStr.IndexOf(str) < arrayStr.Count - 1)
                                {
                                    filterStr += " OR ";
                                }
                                else
                                {
                                    filterStr += ")";
                                }

                                parameters.Add(new ChartReportParameter
                                {
                                    Name        = tempSelectParam,
                                    CastedValue = str,
                                    ValueType   = "string"
                                });
                            }
                        }
                        else
                        {
                            var longStr = ConvertUtil.DeserializeObject <List <long> >(filter.Value);
                            foreach (var longElem in longStr)
                            {
                                if (longStr.IndexOf(longElem) == 0)
                                {
                                    filterStr += "(";
                                }
                                var tempSelectParam = StringUtil.GenerateUniqueName();
                                filterStr += string.Format("{0}={1}", GetFieldFormat(filter.Name), GetFieldWithParamSign(tempSelectParam));
                                if (longStr.IndexOf(longElem) < longStr.Count - 1)
                                {
                                    filterStr += " OR ";
                                }
                                else
                                {
                                    filterStr += ")";
                                }

                                parameters.Add(new ChartReportParameter
                                {
                                    Name        = tempSelectParam,
                                    CastedValue = longElem,
                                    ValueType   = "long"
                                });
                            }
                        }
                    }
                    else
                    {
                        var tempSelectParam = StringUtil.GenerateUniqueName();
                        filterStr += string.Format("{0}={1}", GetFieldFormat(filter.Name), GetFieldWithParamSign(tempSelectParam));

                        // Check value is int or string
                        long selectValue = 0;
                        var  isLong      = false;
                        if (long.TryParse(filter.Value, out selectValue))
                        {
                            isLong = true;
                        }
                        ChartReportParameter selectMySqlParameter;
                        if (isLong)
                        {
                            selectMySqlParameter = new ChartReportParameter
                            {
                                Name        = tempSelectParam,
                                CastedValue = selectValue,
                                ValueType   = "long"
                            };
                        }
                        else
                        {
                            selectMySqlParameter = new ChartReportParameter
                            {
                                Name        = tempSelectParam,
                                CastedValue = filter.Value,
                                ValueType   = "string"
                            };
                        }
                        parameters.Add(selectMySqlParameter);
                    }
                    break;

                case Entities.Components.FilterType.NumberPicker:
                    var tempNumberRangeParam = StringUtil.GenerateUniqueName();
                    if (filter.IsMultiple)
                    {
                        var arrayStrings         = ConvertUtil.DeserializeObject <string[]>(filter.Value);
                        var containsNumberMinMax = arrayStrings[0].Contains("-");
                        if (containsNumberMinMax)
                        {
                            // Ex: [10-20,20-30]
                            var compareStr  = string.Empty;
                            var counterTemp = 0;
                            foreach (var numRange in arrayStrings)
                            {
                                var splitted = numRange.Split("-");

                                var tempStartNumParam = StringUtil.GenerateUniqueName();
                                var tempEndNumParam   = StringUtil.GenerateUniqueName();
                                if (counterTemp < arrayStrings.Length - 1)
                                {
                                    compareStr +=
                                        string.Format(options.NumberRangeCompare + " OR ",
                                                      GetFieldFormat(filter.Name), GetFieldWithParamSign(tempStartNumParam), GetFieldWithParamSign(tempEndNumParam));
                                }
                                else
                                {
                                    compareStr += string.Format(options.NumberRangeCompare,
                                                                GetFieldFormat(filter.Name), GetFieldWithParamSign(tempStartNumParam), GetFieldWithParamSign(tempEndNumParam));
                                }
                                counterTemp++;
                                parameters.Add(new ChartReportParameter
                                {
                                    Name        = tempStartNumParam,
                                    CastedValue = long.Parse(splitted[0]),
                                    ValueType   = "long"
                                });
                                parameters.Add(new ChartReportParameter
                                {
                                    Name        = tempEndNumParam,
                                    CastedValue = long.Parse(splitted[1]),
                                    ValueType   = "long"
                                });
                            }

                            filterStr += string.Format("({0})", compareStr);
                        }
                        else
                        {
                            var inNumberStr = string.Join(",", arrayStrings);
                            inNumberStr = string.Format(options.InOperator, GetFieldFormat(filter.Name), inNumberStr);
                            filterStr  += inNumberStr;
                        }
                    }
                    else
                    {
                        var containsNumberMinMax = filter.Value.Contains("-");
                        if (containsNumberMinMax)
                        {
                            var splitted          = filter.Value.Split("-");
                            var tempStartNumParam = StringUtil.GenerateUniqueName();
                            var tempEndNumParam   = StringUtil.GenerateUniqueName();
                            filterStr += string.Format(
                                options.NumberRangeCompare,
                                GetFieldFormat(filter.Name),
                                GetFieldWithParamSign(tempStartNumParam),
                                GetFieldWithParamSign(tempEndNumParam));
                            parameters.Add(new ChartReportParameter
                            {
                                Name        = tempStartNumParam,
                                CastedValue = long.Parse(splitted[0]),
                                ValueType   = "long"
                            });
                            parameters.Add(new ChartReportParameter
                            {
                                Name        = tempEndNumParam,
                                CastedValue = long.Parse(splitted[1]),
                                ValueType   = "long"
                            });
                        }
                        else
                        {
                            filterStr += string.Format("{0}={1}",
                                                       GetFieldFormat(filter.Name),
                                                       GetFieldWithParamSign(tempNumberRangeParam));
                            parameters.Add(new ChartReportParameter
                            {
                                Name        = tempNumberRangeParam,
                                CastedValue = long.Parse(filter.Value),
                                ValueType   = "long"
                            });
                        }
                    }
                    break;

                case Entities.Components.FilterType.DatePicker:
                    if (filter.IsMultiple)
                    {
                        // Ex: ['10/10/2019', '11/10/2019']
                        var tempStartDateParam = StringUtil.GenerateUniqueName();
                        var tempEndDateParam   = StringUtil.GenerateUniqueName();
                        filterStr +=
                            string.Format("({0} AND {1})",
                                          string.Format(
                                              options.DateCompare,
                                              GetFieldFormat(filter.Name),
                                              ">=",
                                              GetFieldWithParamSign(tempStartDateParam)),
                                          string.Format(
                                              options.DateCompare,
                                              GetFieldFormat(filter.Name),
                                              "<=",
                                              GetFieldWithParamSign(tempEndDateParam)));
                        var arrayDates        = ConvertUtil.DeserializeObject <string[]>(filter.Value);
                        var startDatePickerDt = DateTime.Parse(arrayDates[0]);
                        var endDatePickerDt   = DateTime.Parse(arrayDates[1]);
                        parameters.Add(new ChartReportParameter
                        {
                            Name        = tempStartDateParam,
                            CastedValue = startDatePickerDt,
                            ValueType   = "date"
                        });
                        parameters.Add(new ChartReportParameter
                        {
                            Name        = tempEndDateParam,
                            CastedValue = endDatePickerDt,
                            ValueType   = "date"
                        });
                    }
                    else
                    {
                        var tempDatePickerParam = StringUtil.GenerateUniqueName();
                        filterStr += string.Format(
                            options.DateCompare,
                            GetFieldFormat(filter.Name),
                            "=",
                            GetFieldWithParamSign(tempDatePickerParam));
                        // Support Date Format: MM/DD/YYYY
                        var datePickerDt = DateTime.Parse(filter.Value);
                        parameters.Add(new ChartReportParameter
                        {
                            Name        = tempDatePickerParam,
                            CastedValue = datePickerDt,
                            ValueType   = "date"
                        });
                    }
                    break;

                case Entities.Components.FilterType.MonthYearPicker:
                    if (filter.IsMultiple)
                    {
                        var tempStartDateParam = StringUtil.GenerateUniqueName();
                        var tempEndDateParam   = StringUtil.GenerateUniqueName();
                        filterStr +=
                            string.Format("({0} AND {1})",
                                          string.Format(
                                              options.DateCompare,
                                              GetFieldFormat(filter.Name),
                                              ">=",
                                              GetFieldWithParamSign(tempStartDateParam)),
                                          string.Format(
                                              options.DateCompare,
                                              GetFieldFormat(filter.Name),
                                              "<=",
                                              GetFieldWithParamSign(tempEndDateParam)));

                        var arrayDates        = ConvertUtil.DeserializeObject <string[]>(filter.Value);
                        var startDatePickerDt = DateTime.Parse(arrayDates[0]);
                        var endDatePickerDt   = DateTime.Parse(arrayDates[1]);
                        parameters.Add(new ChartReportParameter
                        {
                            Name        = tempStartDateParam,
                            CastedValue = startDatePickerDt,
                            ValueType   = "date"
                        });
                        parameters.Add(new ChartReportParameter
                        {
                            Name        = tempEndDateParam,
                            CastedValue = endDatePickerDt,
                            ValueType   = "date"
                        });
                    }
                    else
                    {
                        var tempMonthPickerParam = StringUtil.GenerateUniqueName();
                        var tempYearPickerParam  = StringUtil.GenerateUniqueName();
                        filterStr +=
                            string.Format("({0} AND {1})",
                                          string.Format(
                                              options.MonthCompare,
                                              GetFieldFormat(filter.Name),
                                              "=",
                                              GetFieldWithParamSign(tempMonthPickerParam)),
                                          string.Format(
                                              options.YearCompare,
                                              GetFieldFormat(filter.Name),
                                              "=",
                                              GetFieldWithParamSign(tempYearPickerParam)));
                        // Support Date Format: MM/DD/YYYY
                        var dateMonthPickerDt = DateTime.Parse(filter.Value);
                        parameters.Add(new ChartReportParameter
                        {
                            Name        = tempMonthPickerParam,
                            CastedValue = dateMonthPickerDt,
                            ValueType   = "date"
                        });
                        parameters.Add(new ChartReportParameter
                        {
                            Name        = tempYearPickerParam,
                            CastedValue = dateMonthPickerDt,
                            ValueType   = "date"
                        });
                    }
                    break;
                }
                counter++;
                if (counter < filterValues.Count())
                {
                    filterStr += " AND ";
                }
            }

            return(filterStr);
        }
        private BsonDocument GetFilter(ChartFilterValue chartFilterValue)
        {
            switch (chartFilterValue.FilterType)
            {
            case Entities.Components.FilterType.Checkbox:
                var checkboxDoc = new BsonDocument();
                checkboxDoc.Add(new BsonElement(chartFilterValue.Name, new BsonBoolean(bool.Parse(chartFilterValue.Value))));
                return(new BsonDocument
                {
                    { "$match", checkboxDoc }
                });

            case Entities.Components.FilterType.Select:
                var selectDoc = new BsonDocument();
                if (decimal.TryParse(chartFilterValue.Value, out var tempDecimal))
                {
                    selectDoc.Add(new BsonElement(chartFilterValue.Name, new BsonDecimal128(tempDecimal)));
                }
                else if (long.TryParse(chartFilterValue.Value, out var tempLong))
                {
                    selectDoc.Add(new BsonElement(chartFilterValue.Name, new BsonInt64(tempLong)));
                }
                else if (int.TryParse(chartFilterValue.Value, out var tempInt))
                {
                    selectDoc.Add(new BsonElement(chartFilterValue.Name, new BsonInt32(tempInt)));
                }
                else
                {
                    selectDoc.Add(new BsonElement(chartFilterValue.Name, new BsonString(chartFilterValue.Value)));
                    selectDoc.Add(new BsonElement(chartFilterValue.Name, new BsonInt32(tempInt)));
                }
                return(new BsonDocument
                {
                    { "$match", selectDoc }
                });

            case Entities.Components.FilterType.NumberPicker:
                if (chartFilterValue.IsMultiple)
                {
                    var orDoc          = new BsonArray();
                    var selectMultiDoc = new BsonDocument();
                    var isArrayStr     = chartFilterValue.Value.Any(a => a == '\'' || a == '"');
                    if (isArrayStr)
                    {
                        var arrayStr             = ConvertUtil.DeserializeObject <List <string> >(chartFilterValue.Value);
                        var containsNumberMinMax = chartFilterValue.Value.Contains("-");
                        foreach (var elem in arrayStr)
                        {
                            var splitted = elem.Split("-");
                            var beginNum = long.Parse(splitted[0]);
                            var endNum   = long.Parse(splitted[1]);
                            var andDoc   = new BsonDocument
                            {
                                { "$and", new BsonArray(new List <BsonDocument>
                                    {
                                        new BsonDocument
                                        {
                                            { chartFilterValue.Name, new BsonDocument
                                              {
                                                  { "$gte", new BsonInt64(beginNum) }
                                              } }
                                        },
                                        new BsonDocument
                                        {
                                            { chartFilterValue.Name, new BsonDocument
                                              {
                                                  { "$lte", new BsonInt64(endNum) }
                                              } }
                                        }
                                    }) }
                            };

                            orDoc.Add(andDoc);
                        }

                        selectMultiDoc = new BsonDocument
                        {
                            { "$or", orDoc }
                        };
                    }
                    else
                    {
                        var arrayStr = ConvertUtil.DeserializeObject <List <long> >(chartFilterValue.Value);
                        foreach (var elem in arrayStr)
                        {
                            orDoc.Add(new BsonDocument
                            {
                                new BsonElement(chartFilterValue.Name, new BsonInt64(elem))
                            });
                        }
                        ;

                        selectMultiDoc = new BsonDocument
                        {
                            { "$or", orDoc }
                        };
                    }

                    return(new BsonDocument
                    {
                        { "$match", selectMultiDoc }
                    });
                }
                else
                {
                    var containsNumberMinMax = chartFilterValue.Value.Contains("-");
                    if (containsNumberMinMax)
                    {
                        // Ex: 10-30, 30-50
                        var splitted = chartFilterValue.Value.Split("-");
                        var beginNum = long.Parse(splitted[0]);
                        var endNum   = long.Parse(splitted[1]);
                        var andDoc   = new BsonDocument
                        {
                            { "$and", new BsonArray(new List <BsonDocument>
                                {
                                    new BsonDocument
                                    {
                                        { chartFilterValue.Name, new BsonDocument
                                          {
                                              { "$gte", new BsonInt64(beginNum) }
                                          } }
                                    },
                                    new BsonDocument
                                    {
                                        { chartFilterValue.Name, new BsonDocument
                                          {
                                              { "$lte", new BsonInt64(endNum) }
                                          } }
                                    }
                                }) }
                        };

                        return(new BsonDocument
                        {
                            { "$match", andDoc }
                        });
                    }
                    else
                    {
                        var numberDoc = new BsonDocument();
                        if (long.TryParse(chartFilterValue.Value, out var tempLong))
                        {
                            numberDoc.Add(new BsonElement(chartFilterValue.Name, new BsonInt64(tempLong)));
                        }
                        else if (int.TryParse(chartFilterValue.Value, out var tempInt))
                        {
                            numberDoc.Add(new BsonElement(chartFilterValue.Name, new BsonInt32(tempInt)));
                        }

                        return(new BsonDocument
                        {
                            { "$match", numberDoc }
                        });
                    }
                }

            case Entities.Components.FilterType.DatePicker:
                if (chartFilterValue.IsMultiple)
                {
                    var arrayDates        = ConvertUtil.DeserializeObject <string[]>(chartFilterValue.Value);
                    var startDatePickerDt = DateTime.Parse(arrayDates[0]);
                    var endDatePickerDt   = DateTime.Parse(arrayDates[1]);
                    var month             = startDatePickerDt.Month;
                    var day  = startDatePickerDt.Day;
                    var year = startDatePickerDt.Year;
                    // Support Format MM/DD/YYYY, we can change its in configuration later
                    var filterStartDate = new DateTime(year, month, day);

                    var monthEnd = endDatePickerDt.Month;
                    var dayEnd   = endDatePickerDt.Day;
                    var yearEnd  = endDatePickerDt.Year;
                    // Support Format MM/DD/YYYY, we can change its in configuration later
                    var filterEndDate = new DateTime(yearEnd, monthEnd, dayEnd);

                    var gteDoc = new BsonDocument
                    {
                        { chartFilterValue.Name, new BsonDocument(new BsonElement("$gte", new BsonDateTime(filterStartDate))) }
                    };
                    var lteDoc = new BsonDocument
                    {
                        { chartFilterValue.Name, new BsonDocument(new BsonElement("$lte", new BsonDateTime(filterEndDate))) }
                    };

                    var andDoc = new BsonDocument
                    {
                        {
                            "$and",
                            new BsonArray(new List <BsonDocument> {
                                gteDoc, lteDoc
                            })
                        }
                    };

                    return(new BsonDocument
                    {
                        { "$match", andDoc }
                    });
                }
                else
                {
                    var datetime = DateTime.Parse(chartFilterValue.Value);
                    var month    = datetime.Month;
                    var day      = datetime.Day;
                    var year     = datetime.Year;
                    // Support Format MM/DD/YYYY, we can change its in configuration later
                    var filterDateGt = new DateTime(year, month, day);
                    var filterDateLt = new DateTime(year, month, day + 1);
                    filterDateLt = filterDateLt.Subtract(TimeSpan.FromSeconds(1));
                    var gteDoc = new BsonDocument
                    {
                        { chartFilterValue.Name, new BsonDocument(new BsonElement("$gte", new BsonDateTime(filterDateGt))) }
                    };
                    var lteDoc = new BsonDocument
                    {
                        { chartFilterValue.Name, new BsonDocument(new BsonElement("$lte", new BsonDateTime(filterDateLt))) }
                    };

                    var andDoc = new BsonDocument
                    {
                        {
                            "$and",
                            new BsonArray(new List <BsonDocument> {
                                gteDoc, lteDoc
                            })
                        }
                    };

                    return(new BsonDocument
                    {
                        { "$match", andDoc }
                    });
                }

            case Entities.Components.FilterType.MonthYearPicker:
                if (chartFilterValue.IsMultiple)
                {
                    var arrayDates        = ConvertUtil.DeserializeObject <string[]>(chartFilterValue.Value);
                    var startDatePickerDt = DateTime.Parse(arrayDates[0]);
                    var endDatePickerDt   = DateTime.Parse(arrayDates[1]);
                    var month             = startDatePickerDt.Month;
                    var day  = startDatePickerDt.Day;
                    var year = startDatePickerDt.Year;
                    // Support Format MM/DD/YYYY, we can change its in configuration later
                    var filterStartDate = new DateTime(year, month, 1);

                    var monthEnd = endDatePickerDt.Month;
                    var dayEnd   = endDatePickerDt.Day;
                    var yearEnd  = endDatePickerDt.Year;
                    // Support Format MM/DD/YYYY, we can change its in configuration later
                    var filterEndDate = new DateTime(yearEnd, monthEnd + 1, 1);
                    filterEndDate = filterEndDate.Subtract(TimeSpan.FromDays(1));
                    var gteDoc = new BsonDocument
                    {
                        { chartFilterValue.Name, new BsonDocument(new BsonElement("$gte", new BsonDateTime(filterStartDate))) }
                    };
                    var lteDoc = new BsonDocument
                    {
                        { chartFilterValue.Name, new BsonDocument(new BsonElement("$lte", new BsonDateTime(filterEndDate))) }
                    };

                    var andDoc = new BsonDocument
                    {
                        {
                            "$and",
                            new BsonArray(new List <BsonDocument> {
                                gteDoc, lteDoc
                            })
                        }
                    };

                    return(new BsonDocument
                    {
                        { "$match", andDoc }
                    });
                }
                else
                {
                    var datetime = DateTime.Parse(chartFilterValue.Value);
                    var month    = datetime.Month;
                    var day      = datetime.Day;
                    var year     = datetime.Year;
                    // Support Format MM/DD/YYYY, we can change its in configuration later
                    var filterDateGt = new DateTime(year, month + 1, 1);
                    var filterDateLt = new DateTime(year, month + 1, 1);
                    filterDateLt = filterDateLt.Subtract(TimeSpan.FromDays(1));
                    var gteDoc = new BsonDocument
                    {
                        { chartFilterValue.Name, new BsonDocument(new BsonElement("$gte", new BsonDateTime(filterDateGt))) }
                    };
                    var lteDoc = new BsonDocument
                    {
                        { chartFilterValue.Name, new BsonDocument(new BsonElement("$lte", new BsonDateTime(filterDateLt))) }
                    };

                    var andDoc = new BsonDocument
                    {
                        {
                            "$and",
                            new BsonArray(new List <BsonDocument> {
                                gteDoc, lteDoc
                            })
                        }
                    };

                    return(new BsonDocument
                    {
                        { "$match", andDoc }
                    });
                }

            default:
                return(null);
            }
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            var userBuilder = modelBuilder.Entity <User>();

            userBuilder.HasKey(a => a.Id);

            if (ConnectionType == ConnectionType.MySQL)
            {
                userBuilder.Property(a => a.IsConfirmedEmail).HasColumnType("BIT");
                userBuilder.Property(a => a.IsLockoutEnabled).HasColumnType("BIT");
            }

            var jsonRolesConverter = new ValueConverter <List <string>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <string> >(v));

            var jsonClaimsConverter = new ValueConverter <List <BaseClaim>, string>(
                v => ConvertUtil.SerializeObject(v, true),
                v => ConvertUtil.DeserializeObject <List <BaseClaim> >(v));

            userBuilder.Property(a => a.Roles).HasConversion(jsonRolesConverter);
            userBuilder.Property(a => a.Claims).HasConversion(jsonClaimsConverter);

            var roleBuilder = modelBuilder.Entity <Role>();

            roleBuilder.HasKey(a => a.Id);

            roleBuilder.Property(a => a.Claims).HasConversion(jsonClaimsConverter);

            var issueTokenBuilder = modelBuilder.Entity <IssuedToken>();

            issueTokenBuilder.HasKey(a => a.Id);
            if (ConnectionType == ConnectionType.MySQL)
            {
                issueTokenBuilder.Property(a => a.Deactive).HasColumnType("BIT");
            }

            var userSessionBuilder = modelBuilder.Entity <UserSession>();

            userSessionBuilder.HasKey(a => a.Id);
            userSessionBuilder.HasMany(a => a.UserActivities).WithOne().OnDelete(DeleteBehavior.Cascade);
            if (ConnectionType == ConnectionType.MySQL)
            {
                userSessionBuilder.Property(a => a.AlreadySignOut).HasColumnType("BIT");
            }

            var userActivityBuilder = modelBuilder.Entity <UserActivity>();

            userActivityBuilder.HasKey(a => a.Id);

            var versionBuilder = modelBuilder.Entity <Version>();

            versionBuilder.HasKey(a => a.Id);

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var property in entity.GetProperties())
                {
                    property.SetColumnName(ToCamelCase(property.GetColumnName()));
                }
            }
        }