Example #1
0
        private static void AddBoard(AutomaticaContext context, IDatabaseBoardType boardType)
        {
            var board             = context.BoardTypes.SingleOrDefault(a => a.Type == GuidTemplateTypeAttribute.GetFromEnum(boardType.BoardType));
            var boardNodeTemplate = context.NodeTemplates.SingleOrDefault(a => a.ObjId == board.Type);

            var boardInterfaceType = context.InterfaceTypes.SingleOrDefault(a => a.Type == board.Type);

            if (boardInterfaceType == null)
            {
                boardInterfaceType = new InterfaceType
                {
                    Type                = board.Type,
                    Name                = board.Name,
                    Description         = board.Description,
                    IsDriverInterface   = false,
                    MaxChilds           = int.MaxValue,
                    MaxInstances        = 1,
                    CanProvideBoardType = false
                };

                context.InterfaceTypes.Add(boardInterfaceType);
            }

            if (boardNodeTemplate == null)
            {
                boardNodeTemplate = new NodeTemplate
                {
                    ObjId              = board.Type,
                    DefaultCreated     = false,
                    Description        = board.Description,
                    Name               = board.Name,
                    IsAdapterInterface = false,
                    IsDeleteable       = false,
                    IsReadable         = false,
                    IsReadableFixed    = true,
                    IsWriteable        = false,
                    IsWriteableFixed   = true,
                    Key          = board.Name.Replace(" ", ""),
                    MaxInstances = 1,
                    NeedsInterface2InterfacesType   = board.Type,
                    ProvidesInterface2InterfaceType = board.Type,
                    This2NodeDataType = (int)NodeDataType.NoAttribute,
                    This2DefaultMobileVisuTemplate = VisuMobileObjectTemplateTypeAttribute.GetFromEnum(VisuMobileObjectTemplateTypes.Label),
                };

                context.NodeTemplates.Add(boardNodeTemplate);
            }
            context.SaveChanges();


            foreach (var boardInterface in boardType.GetBoardInterfaces())
            {
                var boardInt = context.BoardInterfaces.SingleOrDefault(a => a.ObjId == boardInterface.ObjId);
                if (boardInt == null)
                {
                    context.BoardInterfaces.Add(boardInterface);

                    var nodeTemplate = new NodeTemplate
                    {
                        ObjId              = boardInterface.ObjId,
                        DefaultCreated     = false,
                        Description        = boardInterface.Description,
                        Name               = boardInterface.Name,
                        IsAdapterInterface = false,
                        IsDeleteable       = false,
                        IsReadable         = false,
                        IsReadableFixed    = true,
                        IsWriteable        = false,
                        IsWriteableFixed   = true,
                        Key          = boardInterface.Name.Replace(" ", ""),
                        MaxInstances = 1,
                        NeedsInterface2InterfacesType   = boardNodeTemplate.ObjId,
                        ProvidesInterface2InterfaceType = boardInterface.This2InterfaceType,
                        This2NodeDataType = (int)NodeDataType.NoAttribute,
                        This2DefaultMobileVisuTemplate = VisuMobileObjectTemplateTypeAttribute.GetFromEnum(VisuMobileObjectTemplateTypes.Label),
                    };

                    context.NodeTemplates.Add(nodeTemplate);
                }
            }
        }
Example #2
0
        public static void EnsureDatabaseCreated(IServiceProvider services)
        {
            var context         = services.GetRequiredService <AutomaticaContext>();
            var visuInitFactory = services.GetRequiredService <IVisualisationFactory>();
            var config          = services.GetRequiredService <IConfiguration>();

            context.Database.Migrate();

            bool dbCreated = !context.BoardTypes.Any();

            if (dbCreated)
            {
                context.RuleInterfaceDirections.Add(new EF.Models.RuleInterfaceDirection()
                {
                    ObjId       = 1,
                    Name        = "Input",
                    Description = "Input",
                    Key         = "I"
                });
                context.RuleInterfaceDirections.Add(new EF.Models.RuleInterfaceDirection()
                {
                    ObjId       = 2,
                    Name        = "Output",
                    Description = "Output",
                    Key         = "O"
                });
                context.RuleInterfaceDirections.Add(new EF.Models.RuleInterfaceDirection()
                {
                    ObjId       = 3,
                    Name        = "Parameter",
                    Description = "Parameter",
                    Key         = "P"
                });

                context.RulePageTypes.Add(new RulePageType()
                {
                    ObjId       = 1,
                    Name        = "Rules",
                    Description = "Rules",
                    Key         = "rules"
                });
                context.VisuPageTypes.Add(new VisuPageType()
                {
                    ObjId       = 1,
                    Name        = "PC",
                    Description = "PC",
                    Key         = "pc"
                });
                context.VisuPageTypes.Add(new VisuPageType()
                {
                    ObjId       = 2,
                    Name        = "Mobile",
                    Description = "Mobile",
                    Key         = "mobile"
                });
                context.SaveChanges();

                context.Slaves.Add(new Slave()
                {
                    ObjId       = new Guid(ServerInfo.SelfSlaveId),
                    Name        = "local",
                    Description = "this is me",
                    ClientId    = "",
                    ClientKey   = ""
                });


                context.Settings.Add(new Setting
                {
                    ObjId     = 1,
                    ValueKey  = "ConfigVersion",
                    Type      = (long)PropertyTemplateType.Numeric,
                    Value     = 0,
                    Group     = "ConfigVersion",
                    IsVisible = false,
                    Order     = 10
                });
                context.SaveChanges();
            }

            var lat = context.Settings.SingleOrDefault(a => a.ValueKey == "Latitude");

            if (lat == null)
            {
                context.Settings.Add(new Setting
                {
                    ValueKey  = "Latitude",
                    Type      = (long)PropertyTemplateType.Numeric,
                    Value     = 0,
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 10
                });

                context.Settings.Add(new Setting
                {
                    ValueKey  = "Longitude",
                    Type      = (long)PropertyTemplateType.Numeric,
                    Value     = 0,
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 11
                });
            }
            else
            {
                var longi = context.Settings.SingleOrDefault(a => a.ValueKey == "Longitude");

                if (lat.ValueDouble == null)
                {
                    lat.ValueDouble = 0;
                }

                if (longi.ValueDouble == null)
                {
                    longi.ValueDouble = 0;
                }

                context.Settings.Update(longi);
                context.Settings.Update(lat);
            }

            var apiKey = context.Settings.SingleOrDefault(a => a.ValueKey == "apiKey");

            if (apiKey == null)
            {
                context.Settings.Add(new Setting
                {
                    ValueKey  = "apiKey",
                    Type      = (long)PropertyTemplateType.Text,
                    Value     = "",
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 0
                });
            }

            var autoUpdate      = context.Settings.SingleOrDefault(a => a.ValueKey == "autoUpdate");
            var autoUpdateTime  = context.Settings.SingleOrDefault(a => a.ValueKey == "autoUpdateTime");
            var reportCrashLogs = context.Settings.SingleOrDefault(a => a.ValueKey == "reportCrashLogs");

            if (autoUpdate == null)
            {
                context.Settings.Add(new Setting
                {
                    ValueKey  = "autoUpdate",
                    Type      = (long)PropertyTemplateType.Bool,
                    Value     = false,
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 20
                });
            }
            else
            {
                autoUpdate.Order = 20;
                context.Update(autoUpdate);
            }

            if (autoUpdateTime == null)
            {
                context.Settings.Add(new Setting
                {
                    ValueKey  = "autoUpdateTime",
                    Type      = (long)PropertyTemplateType.Time,
                    Value     = new DateTime(2000, 12, 31, 2, 0, 0),
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 21
                });
            }
            else
            {
                autoUpdateTime.Order = 21;
                autoUpdateTime.Type  = (long)PropertyTemplateType.Time;
                context.Update(autoUpdateTime);
            }

            if (reportCrashLogs == null)
            {
                context.Settings.Add(new Setting
                {
                    ValueKey  = "reportCrashLogs",
                    Type      = (long)PropertyTemplateType.Bool,
                    Value     = false,
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 22
                });
            }
            else
            {
                reportCrashLogs.Order = 22;
                context.Update(reportCrashLogs);
            }

            var cloudUrl = context.Settings.SingleOrDefault(a => a.ValueKey == "cloudUrl");

            if (cloudUrl == null)
            {
                context.Settings.Add(new Setting
                {
                    ValueKey  = "cloudUrl",
                    Type      = (long)PropertyTemplateType.Text,
                    Value     = "https://automatica-core-cloud.azurewebsites.net",
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 1
                });
            }

            var cloudEnvironment = context.Settings.SingleOrDefault(a => a.ValueKey == "cloudEnvironment");

            if (cloudEnvironment == null)
            {
                var cloudEnvironmentType = "master";
#if DEBUG
                cloudEnvironmentType = "develop";
#else
                cloudEnvironmentType = "master";
#endif

                context.Settings.Add(new Setting
                {
                    ValueKey  = "cloudEnvironment",
                    Type      = (long)PropertyTemplateType.Text,
                    Value     = cloudEnvironmentType,
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 2
                });
            }

            var projectName = context.Settings.SingleOrDefault(a => a.ValueKey == "projectName");

            if (projectName == null)
            {
                context.Settings.Add(new Setting
                {
                    ValueKey  = "projectName",
                    Type      = (long)PropertyTemplateType.Text,
                    Value     = "Automatica.Core",
                    Group     = "SERVER.SETTINGS",
                    IsVisible = true,
                    Order     = 3
                });
            }

            var propertyTypes = Enum.GetValues(typeof(PropertyTemplateType));

            foreach (var propertyType in propertyTypes)
            {
                var propertyTypeDb = context.PropertyTypes.SingleOrDefault(a => a.Type == Convert.ToInt64(propertyType));
                var isNewObject    = false;
                if (propertyTypeDb == null)
                {
                    propertyTypeDb = new PropertyType {
                        Type = (int)propertyType
                    };
                    isNewObject = true;
                }

                var type       = propertyType.GetType();
                var memInfo    = type.GetMember(propertyType.ToString());
                var attributes = memInfo[0].GetCustomAttributes(typeof(PropertyTemplateTypeAttribute), false);

                if (attributes.Length > 0 && attributes[0] is PropertyTemplateTypeAttribute attribute)
                {
                    propertyTypeDb.Name        = attribute.Name;
                    propertyTypeDb.Description = attribute.Description;
                    propertyTypeDb.Meta        = attribute.Meta;
                }
                else
                {
                    propertyTypeDb.Name        = propertyType.GetType().Name;
                    propertyTypeDb.Description = propertyType.GetType().Name;
                    propertyTypeDb.Meta        = null;
                }

                if (isNewObject)
                {
                    context.PropertyTypes.Add(propertyTypeDb);
                }
                else
                {
                    context.PropertyTypes.Update(propertyTypeDb);
                }
            }

            var nodeDataTypes = Enum.GetValues(typeof(NodeDataType));

            foreach (var nodeDataType in nodeDataTypes)
            {
                var nodeDataTypeDb = context.NodeDataTypes.SingleOrDefault(a => a.Type == Convert.ToInt64(nodeDataType));
                var isNewObject    = false;
                if (nodeDataTypeDb == null)
                {
                    nodeDataTypeDb      = new EF.Models.NodeDataType();
                    nodeDataTypeDb.Type = (int)nodeDataType;
                    isNewObject         = true;
                }

                var type       = nodeDataType.GetType();
                var memInfo    = type.GetMember(nodeDataType.ToString());
                var attributes = memInfo[0].GetCustomAttributes(typeof(NodeDataTypeEnumAttribute), false);

                if (attributes.Length > 0 && attributes[0] is NodeDataTypeEnumAttribute attribute)
                {
                    nodeDataTypeDb.Name        = attribute.Name;
                    nodeDataTypeDb.Description = attribute.Description;
                }
                else
                {
                    nodeDataTypeDb.Name        = nodeDataType.GetType().Name;
                    nodeDataTypeDb.Description = nodeDataType.GetType().Name;
                }

                if (isNewObject)
                {
                    context.NodeDataTypes.Add(nodeDataTypeDb);
                }
                else
                {
                    context.NodeDataTypes.Update(nodeDataTypeDb);
                }
            }


            context.SaveChanges();
            visuInitFactory.Initialize(context, config);
            context.SaveChanges();

            CreateInterfaceTypes(context);
            context.SaveChanges();

            AddSystemTemplates(context);

            IDatabaseBoardType boardType = null;

            if (BoardTypes.Docker.Docker.InDocker)
            {
                boardType = new BoardTypes.Docker.Docker();
            }
            else
            {
                boardType = new RaspberryPi();
            }

            ServerInfo.BoardType = boardType;

            AddBoard(context, boardType);

            AddAreaData(context);
            CategoryGroup.GenerateDefault(context);
            context.SaveChanges();
            CategoryInstance.GenerateDefault(context);

            context.SaveChanges();


            if (!context.AreaInstances.Any())
            {
                var projectInstance = new AreaInstance
                {
                    ObjId             = Guid.NewGuid(),
                    Name              = "Project",
                    Description       = "",
                    Icon              = "home",
                    This2AreaTemplate = AreaTemplateAttribute.GetFromEnum(AreaTemplates.Project),
                    This2Parent       = null
                };
                context.AreaInstances.Add(projectInstance);
            }

            if (dbCreated)
            {
                var rootNodeTemplate = context.NodeTemplates.SingleOrDefault(a => a.ObjId == GuidTemplateTypeAttribute.GetFromEnum(boardType.BoardType));
                var rootNode         = NodeInstanceFactory.CreateNodeInstanceFromTemplate(rootNodeTemplate);

                rootNode.Name        = boardType.Name;
                rootNode.Description = "";

                context.NodeInstances.Add(rootNode);

                var childs = context.NodeTemplates.Where(a => a.NeedsInterface2InterfacesType == rootNodeTemplate.ObjId);

                foreach (var child in childs)
                {
                    if (child.NeedsInterface2InterfacesType == child.ProvidesInterface2InterfaceType)
                    {
                        continue;
                    }
                    var node = NodeInstanceFactory.CreateNodeInstanceFromTemplate(child);
                    node.This2ParentNodeInstance = rootNode.ObjId;
                    context.NodeInstances.Add(node);
                }


                var rulePage = new RulePage
                {
                    ObjId             = Guid.NewGuid(),
                    Name              = "Page1",
                    Description       = "",
                    This2RulePageType = 1
                };

                context.RulePages.Add(rulePage);


                var visuPage = new VisuPage
                {
                    ObjId             = Guid.NewGuid(),
                    Name              = "Page1",
                    Description       = "",
                    This2VisuPageType = 2,
                    DefaultPage       = true
                };

                context.VisuPages.Add(visuPage);

                AddInitUserManagementData(context);

                context.SaveChanges();
            }


            context.SaveChanges();
        }