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); } } }
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(); }