private static DashboardUI MakeUiModel(DashboardModel model, ViewType[] viewTypes) { DashboardUI result = new DashboardUI(); foreach (View v in model.Views) { ViewType viewType = viewTypes.FirstOrDefault(vt => vt.Name.Equals(v.Type, StringComparison.InvariantCultureIgnoreCase)); if (viewType == null) { throw new Exception($"No view type '{v.Type}' found!"); } bool url = viewType.Type == typeof(View_ExtURL); var viewInstance = new ViewInstance() { viewID = v.ID, viewName = v.Name, viewURL = url ? v.Config.Object <ViewURLConfig>() !.URL : viewType.HtmlPath, viewIcon = viewType.Icon, viewGroup = v.Group, viewType = v.Type, }; result.views.Add(viewInstance); } return(result); }
public override async Task Init(ModuleInitInfo info, VariableValue[] restoreVariableValues, Notifier notifier, ModuleThread moduleThread) { theSyncContext = SynchronizationContext.Current; await base.Init(info, restoreVariableValues, notifier, moduleThread); var config = info.GetConfigReader(); clientPort = info.LoginPort; string baseDir = config.GetString("base-dir"); string host = config.GetString("listen-host"); int port = config.GetInt("listen-port"); string strViewAssemblies = config.GetString("view-assemblies"); const string releaseDebugPlaceHolder = "{RELEASE_OR_DEBUG}"; if (strViewAssemblies.Contains(releaseDebugPlaceHolder)) { #if DEBUG strViewAssemblies = strViewAssemblies.Replace(releaseDebugPlaceHolder, "Debug"); #else strViewAssemblies = strViewAssemblies.Replace(releaseDebugPlaceHolder, "Release"); #endif } string[] viewAssemblies = strViewAssemblies .Split(new char[] { ';', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries) .Select(s => s.Trim()) .ToArray(); absolutBaseDir = Path.GetFullPath(baseDir); if (!Directory.Exists(absolutBaseDir)) { throw new Exception($"base-dir does not exist: {absolutBaseDir}"); } string[] absoluteViewAssemblies = viewAssemblies.Select(d => Path.GetFullPath(d)).ToArray(); foreach (string dir in absoluteViewAssemblies) { if (!File.Exists(dir)) { throw new Exception($"view-assembly does not exist: {dir}"); } } viewTypes = ReadAvailableViewTypes(absolutBaseDir, BundlesPrefix, absoluteViewAssemblies); uiModel = MakeUiModel(model, viewTypes); var builder = new WebHostBuilder(); builder.UseKestrel((KestrelServerOptions options) => { if (host.Equals("localhost", StringComparison.InvariantCultureIgnoreCase)) { options.ListenLocalhost(port); } else { options.Listen(IPAddress.Parse(host), port); } }); builder.UseWebRoot(absolutBaseDir); builder.UseStartup <Module>(); //builder.ConfigureLogging(logging => { // logging.AddConsole(); // Microsoft.Extensions.Logging.Console // logging.SetMinimumLevel(LogLevel.Information); //}); webHost = builder.Build(); webHost.Start(); }
private async Task <ReqResult> HandlePost(HttpRequest request, HttpResponse response) { string path = request.Path; try { if (path == Path_Login) { string?user; string?pass; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { var obj = await StdJson.JObjectFromReaderAsync(reader); user = (string?)obj["user"]; pass = (string?)obj["pass"]; if (user == null || pass == null) { return(ReqResult.Bad("Missing user and password.")); } } var session = new Session(); Connection connection; try { connection = await HttpConnection.ConnectWithUserLogin("localhost", clientPort, user, pass, null, session, timeoutSeconds : 90); } catch (Exception exp) { logWarn(exp.Message); return(ReqResult.Bad(exp.Message)); } await session.SetConnection(connection, model, moduleID, viewTypes); sessions[session.ID] = session; var result = new JObject(); result["sessionID"] = session.ID; string str = StdJson.ObjectToString(uiModel); JRaw raw = new JRaw(str); result["model"] = raw; return(ReqResult.OK(result)); } else if (path.StartsWith(Path_ViewReq)) { string viewRequest = path.Substring(Path_ViewReq.Length); (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); string content; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { content = await reader.ReadToEndAsync(); } return(await session.OnViewCommand(viewID, viewRequest, DataValue.FromJSON(content))); } else if (path == Path_ActivateView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); await session.OnActivateView(viewID); return(ReqResult.OK()); } else if (path == Path_DuplicateView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); string newViewID = await session.OnDuplicateView(viewID); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { newViewID, model = uiModel })); } else if (path == Path_DuplicateConvertView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); string newViewID = await session.OnDuplicateConvertHistoryPlot(viewID); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { newViewID, model = uiModel })); } else if (path == Path_RenameView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); string?newViewName; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { var obj = await StdJson.JObjectFromReaderAsync(reader); newViewName = (string?)obj["newViewName"]; if (newViewName == null) { return(ReqResult.Bad("Missing newViewName")); } } await session.OnRenameView(viewID, newViewName); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { model = uiModel })); } else if (path == Path_MoveView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); bool up = false; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { var obj = await StdJson.JObjectFromReaderAsync(reader); up = (bool)obj["up"] !; } await session.OnMoveView(viewID, up); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { model = uiModel })); } else if (path == Path_DeleteView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); await session.OnDeleteView(viewID); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { model = uiModel })); } else if (path == Path_Logout) { string sessionID; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { sessionID = await reader.ReadToEndAsync(); } if (sessions.ContainsKey(sessionID)) { Session session = sessions[sessionID]; var ignored = session.Close(); sessions.Remove(sessionID); } return(ReqResult.OK()); } else { return(ReqResult.Bad("Invalid path: " + path)); } } catch (InvalidSessionException exp) { logWarn("HandlePost: " + exp.Message); return(ReqResult.Bad(exp.Message)); } catch (Exception exp) { logWarn("HandlePost:", exp); return(ReqResult.Bad(exp.Message)); } }