From 6a18e56cf7118028e7c66a79642045681fe61702 Mon Sep 17 00:00:00 2001 From: Noe Date: Wed, 15 Nov 2023 17:22:42 +0100 Subject: [PATCH] Created error table, provided error handling --- csharp/App/Backend/Backend.csproj | 6 +- csharp/App/Backend/Controller.cs | 19 ++ csharp/App/Backend/DataTypes/Error.cs | 14 ++ .../App/Backend/DataTypes/Methods/Folder.cs | 1 - .../Backend/DataTypes/Methods/Installation.cs | 2 +- csharp/App/Backend/DataTypes/TreeNode.cs | 2 +- csharp/App/Backend/Database/Create.cs | 31 +++ csharp/App/Backend/Database/Db.cs | 68 +++-- csharp/App/Backend/Database/Delete.cs | 14 ++ csharp/App/Backend/Database/Update.cs | 3 - .../App/Backend/Websockets/StatusMessage.cs | 7 +- .../Backend/Websockets/WebsockerManager.cs | 22 +- .../src/MiddlewareClasses/StatusMessage.cs | 8 +- csharp/App/SaliMax/src/Program.cs | 19 +- .../Trumpf/TruConvertAc/AcDcDevicesRecord.cs | 4 + .../TruConvertAc/DataTypes/WarningMessage.cs | 4 +- .../src/Resources/axiosConfig.tsx | 8 +- .../dashboards/Installations/Installation.tsx | 9 +- .../src/content/dashboards/Log/Log.tsx | 234 ++++++++++-------- .../src/content/dashboards/Log/fetchData.tsx | 37 --- .../src/interfaces/S3Types.tsx | 11 +- 21 files changed, 318 insertions(+), 205 deletions(-) create mode 100644 csharp/App/Backend/DataTypes/Error.cs delete mode 100644 typescript/frontend-marios2/src/content/dashboards/Log/fetchData.tsx diff --git a/csharp/App/Backend/Backend.csproj b/csharp/App/Backend/Backend.csproj index 999e039c1..0078c9897 100644 --- a/csharp/App/Backend/Backend.csproj +++ b/csharp/App/Backend/Backend.csproj @@ -226,8 +226,8 @@ - - - + + + diff --git a/csharp/App/Backend/Controller.cs b/csharp/App/Backend/Controller.cs index 9feff6d72..67cce6e07 100644 --- a/csharp/App/Backend/Controller.cs +++ b/csharp/App/Backend/Controller.cs @@ -54,6 +54,8 @@ public class Controller : ControllerBase : Unauthorized(); } + + [HttpGet(nameof(CreateWebSocket))] public async Task CreateWebSocket(Token authToken) { @@ -81,6 +83,23 @@ public class Controller : ControllerBase //Handle the WebSocket connection await WebsocketManager.HandleWebSocketConnection(webSocket); } + + [HttpGet(nameof(GetAllErrorsForInstallation))] + public ActionResult> GetAllErrorsForInstallation(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var installation = Db.GetInstallationById(id); + + if (installation is null || !user.HasAccessTo(installation)) + return Unauthorized(); + + return Db.Errors + .Where(error => error.InstallationId == id) + .ToList(); + } [HttpGet(nameof(GetUserById))] public ActionResult GetUserById(Int64 id, Token authToken) diff --git a/csharp/App/Backend/DataTypes/Error.cs b/csharp/App/Backend/DataTypes/Error.cs new file mode 100644 index 000000000..1d10bf2ff --- /dev/null +++ b/csharp/App/Backend/DataTypes/Error.cs @@ -0,0 +1,14 @@ +using SQLite; + +namespace InnovEnergy.App.Backend.DataTypes; + +public class Error +{ + [PrimaryKey, AutoIncrement] + public Int64 Id { get; set; } + public Int64 InstallationId { get; set; } + public String ErrorDescription { get; set; } = null!; + public DateTime CreatedAt { get; set; } + public String DeviceCreatedTheError { get; set; } = null!; + public Boolean Seen { get; set; } +} \ No newline at end of file diff --git a/csharp/App/Backend/DataTypes/Methods/Folder.cs b/csharp/App/Backend/DataTypes/Methods/Folder.cs index f2595d00b..b6f8afd78 100644 --- a/csharp/App/Backend/DataTypes/Methods/Folder.cs +++ b/csharp/App/Backend/DataTypes/Methods/Folder.cs @@ -5,7 +5,6 @@ namespace InnovEnergy.App.Backend.DataTypes.Methods; public static class FolderMethods { - public static IEnumerable UsersWithAccess(this Folder folder) { var direct = folder.UsersWithDirectAccess(); diff --git a/csharp/App/Backend/DataTypes/Methods/Installation.cs b/csharp/App/Backend/DataTypes/Methods/Installation.cs index 4b2342f85..93ecee76e 100644 --- a/csharp/App/Backend/DataTypes/Methods/Installation.cs +++ b/csharp/App/Backend/DataTypes/Methods/Installation.cs @@ -141,7 +141,7 @@ public static class InstallationMethods foreach (var orderNumber in installation.OrderNumbers.Split(",")) { var rel = relations.FirstOrDefault(i => i.OrderNumber == orderNumber); - if ( rel != null) relations.Remove(rel); + if ( rel != null) {relations.Remove(rel); continue;} var o2I = new OrderNumber2Installation { OrderNumber = orderNumber, diff --git a/csharp/App/Backend/DataTypes/TreeNode.cs b/csharp/App/Backend/DataTypes/TreeNode.cs index 5613fbbdf..a19d05598 100644 --- a/csharp/App/Backend/DataTypes/TreeNode.cs +++ b/csharp/App/Backend/DataTypes/TreeNode.cs @@ -5,7 +5,7 @@ namespace InnovEnergy.App.Backend.DataTypes; public abstract partial class TreeNode { [PrimaryKey, AutoIncrement] - public virtual Int64 Id { get; set; } + public Int64 Id { get; set; } public virtual String Name { get; set; } = ""; // overridden by User (unique) public String Information { get; set; } = ""; // unstructured random info diff --git a/csharp/App/Backend/Database/Create.cs b/csharp/App/Backend/Database/Create.cs index 627b5a191..924e1c4aa 100644 --- a/csharp/App/Backend/Database/Create.cs +++ b/csharp/App/Backend/Database/Create.cs @@ -20,6 +20,11 @@ public static partial class Db return Insert(installation); } + public static Boolean Create(Error error) + { + return Insert(error); + } + public static Boolean Create(Folder folder) { return Insert(folder); @@ -49,4 +54,30 @@ public static partial class Db { return Insert(o2i); } + + public static void HandleError(Error newError,int installationId) + { + //Find the total number of errors for this installation + var totalErrors = Errors.Count(error => error.InstallationId == installationId); + + //If there are 100 errors, remove the one with the oldest timestamp + if (totalErrors == 100) + { + var oldestError = + Errors.Where(error => error.InstallationId == installationId) + .OrderBy(error => error.CreatedAt) + .FirstOrDefault(); + + //Remove the old error + Delete(oldestError); + + //Add the new error + Create(newError); + } + else + { + Console.WriteLine("---------------Added the new Error to the database-----------------"); + Create(newError); + } + } } \ No newline at end of file diff --git a/csharp/App/Backend/Database/Db.cs b/csharp/App/Backend/Database/Db.cs index b8d86c071..f4255a677 100644 --- a/csharp/App/Backend/Database/Db.cs +++ b/csharp/App/Backend/Database/Db.cs @@ -15,21 +15,36 @@ namespace InnovEnergy.App.Backend.Database; public static partial class Db { - // internal const String DbPath = "./db.sqlite"; + private static SQLiteConnection Connection { get; } = InitConnection(); - private static SQLiteConnection Connection { get; } = ((Func)(() => + private static SQLiteConnection InitConnection() { - var latestDb = new DirectoryInfo(@"DbBackups").GetFiles() - .OrderBy(f => f.LastWriteTime) - .Last().Name; + var latestDb = new DirectoryInfo("DbBackups") + .GetFiles() + .OrderBy(f => f.LastWriteTime) + .Last().Name; - var fileConnection = new SQLiteConnection("DbBackups/"+latestDb); + //This is the file connection from the DbBackups folder + var fileConnection = new SQLiteConnection("DbBackups/" + latestDb); + + //Create a table if it does not exist + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + + return CopyDbToMemory(fileConnection); + } - Console.Out.Write(latestDb); + private static SQLiteConnection CopyDbToMemory(SQLiteConnection fileConnection) + { var memoryConnection = new SQLiteConnection(":memory:"); - // fileConnection.Backup(memoryConnection.DatabasePath); - + //Create a table if it does not exist in main memory memoryConnection.CreateTable(); memoryConnection.CreateTable(); memoryConnection.CreateTable(); @@ -37,18 +52,21 @@ public static partial class Db memoryConnection.CreateTable(); memoryConnection.CreateTable(); memoryConnection.CreateTable(); - - fileConnection.Table ().ForEach(memoryConnection.Insert); - fileConnection.Table ().ForEach(memoryConnection.Insert); - fileConnection.Table ().ForEach(memoryConnection.Insert); - fileConnection.Table ().ForEach(memoryConnection.Insert); - fileConnection.Table ().ForEach(memoryConnection.Insert); - fileConnection.Table ().ForEach(memoryConnection.Insert); - fileConnection.Table().ForEach(memoryConnection.Insert); + memoryConnection.CreateTable(); + //Copy all the existing tables from the disk to main memory + fileConnection.Table().ForEach(memoryConnection.Insert); + fileConnection.Table().ForEach(memoryConnection.Insert); + fileConnection.Table().ForEach(memoryConnection.Insert); + fileConnection.Table().ForEach(memoryConnection.Insert); + fileConnection.Table().ForEach(memoryConnection.Insert); + fileConnection.Table().ForEach(memoryConnection.Insert); + fileConnection.Table().ForEach(memoryConnection.Insert); + fileConnection.Table().ForEach(memoryConnection.Insert); + return memoryConnection; - }))(); - + } + public static void BackupDatabase() { var filename = "db-" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + ".sqlite"; @@ -62,17 +80,16 @@ public static partial class Db public static TableQuery FolderAccess => Connection.Table(); public static TableQuery InstallationAccess => Connection.Table(); public static TableQuery OrderNumber2Installation => Connection.Table(); - - public static void Init() - { + public static TableQuery Errors => Connection.Table(); + + public static void Init(){ // used to force static constructor + //Since this class is static, we call Init method from the Program.cs to initialize all the fields of the class } - + //This is the constructor of the class static Db() { - // on startup create/migrate tables - Connection.RunInTransaction(() => { Connection.CreateTable(); @@ -82,6 +99,7 @@ public static partial class Db Connection.CreateTable(); Connection.CreateTable(); Connection.CreateTable(); + Connection.CreateTable(); }); Observable.Interval(TimeSpan.FromHours(0.5)) diff --git a/csharp/App/Backend/Database/Delete.cs b/csharp/App/Backend/Database/Delete.cs index 660d61539..abefabadd 100644 --- a/csharp/App/Backend/Database/Delete.cs +++ b/csharp/App/Backend/Database/Delete.cs @@ -34,6 +34,20 @@ public static partial class Db return delete>0; } } + + public static Boolean Delete(Error errorToDelete) + { + var deleteSuccess = RunTransaction(DeleteError); + if (deleteSuccess) + BackupDatabase(); + return deleteSuccess; + + + Boolean DeleteError() + { + return Errors.Delete(error => error.Id == errorToDelete.Id) >0; + } + } public static Boolean Delete(Installation installation) { diff --git a/csharp/App/Backend/Database/Update.cs b/csharp/App/Backend/Database/Update.cs index 094487552..16d9d76b0 100644 --- a/csharp/App/Backend/Database/Update.cs +++ b/csharp/App/Backend/Database/Update.cs @@ -33,7 +33,4 @@ public static partial class Db return Update(obj: user); } - - - } \ No newline at end of file diff --git a/csharp/App/Backend/Websockets/StatusMessage.cs b/csharp/App/Backend/Websockets/StatusMessage.cs index 074ac71b0..244f123be 100644 --- a/csharp/App/Backend/Websockets/StatusMessage.cs +++ b/csharp/App/Backend/Websockets/StatusMessage.cs @@ -1,6 +1,9 @@ public class StatusMessage { - public required int InstallationId { get; init; } - public required int Status { get; init; } + public required int InstallationId { get; init; } + public required int Status { get; init; } + public DateTime CreatedAt { get; set; } + public String Error { get; init; } = null!; + public String DeviceCreatedTheError { get; init; } = null!; } \ No newline at end of file diff --git a/csharp/App/Backend/Websockets/WebsockerManager.cs b/csharp/App/Backend/Websockets/WebsockerManager.cs index b2a1f2924..989441e08 100644 --- a/csharp/App/Backend/Websockets/WebsockerManager.cs +++ b/csharp/App/Backend/Websockets/WebsockerManager.cs @@ -5,6 +5,7 @@ using System.Net.WebSockets; using System.Text; using System.Text.Json; using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.DataTypes; using RabbitMQ.Client; using RabbitMQ.Client.Events; @@ -19,7 +20,6 @@ public static class WebsocketManager public static void InformInstallationsToSubscribeToRabbitMq() { - //var installationIps = new List { "10.2.3.115" }; var installationIps = Db.Installations.Select(inst => inst.VpnIp).ToList(); Console.WriteLine("Count is "+installationIps.Count); var maxRetransmissions = 2; @@ -83,13 +83,31 @@ public static class WebsocketManager lock (InstallationConnections) { - // Process the received message + //Consumer received a message if (receivedStatusMessage != null) { Console.WriteLine("Received a message from installation: " + receivedStatusMessage.InstallationId + " and status is: " + receivedStatusMessage.Status); Console.WriteLine("----------------------------------------------"); Console.WriteLine("Update installation connection table"); var installationId = receivedStatusMessage.InstallationId; + + //This is an error message + if (receivedStatusMessage.Status==2) + { + Console.WriteLine("-----------------------New error-----------------------"); + + Error newError = new Error + { + InstallationId = receivedStatusMessage.InstallationId, + ErrorDescription = receivedStatusMessage.Error, + CreatedAt = receivedStatusMessage.CreatedAt, + DeviceCreatedTheError = receivedStatusMessage.DeviceCreatedTheError, + Seen = false + }; + //Create a new error and add it to the database + Db.HandleError(newError,receivedStatusMessage.InstallationId); + + } if (!InstallationConnections.ContainsKey(installationId)) { diff --git a/csharp/App/SaliMax/src/MiddlewareClasses/StatusMessage.cs b/csharp/App/SaliMax/src/MiddlewareClasses/StatusMessage.cs index 8af41f9a3..1faf68d8e 100644 --- a/csharp/App/SaliMax/src/MiddlewareClasses/StatusMessage.cs +++ b/csharp/App/SaliMax/src/MiddlewareClasses/StatusMessage.cs @@ -3,6 +3,10 @@ namespace InnovEnergy.App.SaliMax.MiddlewareClasses; public class StatusMessage { - public required int InstallationId { get; init; } - public required int Status { get; init; } + + public required int InstallationId { get; init; } + public required int Status { get; init; } + public DateTime CreatedAt { get; set; } + public String Error { get; set; } = null!; + public String DeviceCreatedTheError { get; set; } = null!; } \ No newline at end of file diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs index 20ff268d9..c9135ab20 100644 --- a/csharp/App/SaliMax/src/Program.cs +++ b/csharp/App/SaliMax/src/Program.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; @@ -265,10 +266,14 @@ internal static class Program { _subscribeToQueueForTheFirstTime = true; SubscribeToQueue(currentSalimaxState, s3Bucket); + + if (_subscribedToQueue && currentSalimaxState != _prevSalimaxState) + { + _prevSalimaxState = currentSalimaxState; + } } - //If already subscribed to the queue and the status has been changed, update the queue - if (_subscribedToQueue && currentSalimaxState != _prevSalimaxState) + else if (_subscribedToQueue && currentSalimaxState != _prevSalimaxState) { _prevSalimaxState = currentSalimaxState; if (s3Bucket != null) @@ -343,12 +348,18 @@ internal static class Program private static void InformMiddleware(String? bucket, int status) { int.TryParse(bucket[0].ToString(), out var installationId); - var jsonObject = new StatusMessage { InstallationId = installationId, - Status = status + Status = status, }; + + if (status == 2) + { + jsonObject.CreatedAt = DateTime.Now; + jsonObject.Error = "Battery Temperature High"; + jsonObject.DeviceCreatedTheError = "Battery/1"; + } var message = JsonSerializer.Serialize(jsonObject); var body = Encoding.UTF8.GetBytes(message); diff --git a/csharp/Lib/Devices/Trumpf/TruConvertAc/AcDcDevicesRecord.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/AcDcDevicesRecord.cs index 86a334c3b..5df7597a0 100644 --- a/csharp/Lib/Devices/Trumpf/TruConvertAc/AcDcDevicesRecord.cs +++ b/csharp/Lib/Devices/Trumpf/TruConvertAc/AcDcDevicesRecord.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; using InnovEnergy.Lib.Devices.Trumpf.SystemControl; using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc.DataTypes; using InnovEnergy.Lib.Units.Composite; @@ -18,6 +19,9 @@ public class AcDcDevicesRecord public SystemControlRegisters? SystemControl { get; } public IReadOnlyList Devices { get; init; } + //public IEnumerable Alarms => new []{AlarmMessage.BatteryOvervoltage}; //Devices.SelectMany(d => d.Status.Alarms).Distinct(); + //public IEnumerable Warnings => new []{WarningMessage.TempDerating}; //Devices.SelectMany(d => d.Status.Warnings).Distinct(); + public IEnumerable Alarms => Devices.SelectMany(d => d.Status.Alarms).Distinct(); public IEnumerable Warnings => Devices.SelectMany(d => d.Status.Warnings).Distinct(); diff --git a/csharp/Lib/Devices/Trumpf/TruConvertAc/DataTypes/WarningMessage.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/DataTypes/WarningMessage.cs index 11ec4cdd2..ead25e819 100644 --- a/csharp/Lib/Devices/Trumpf/TruConvertAc/DataTypes/WarningMessage.cs +++ b/csharp/Lib/Devices/Trumpf/TruConvertAc/DataTypes/WarningMessage.cs @@ -10,7 +10,7 @@ public enum WarningMessage : UInt16 { NoWarning = 00000, - /* + // these warnings are not official (not in the manual), and they seem to collide with the DCDC warnings // so I commented them @@ -28,5 +28,5 @@ public enum WarningMessage : UInt16 RuntimeEeprom = 11023, //AC-DC module warning Overcurrent = 11024 //Overcurrent handling is active - */ + } \ No newline at end of file diff --git a/typescript/frontend-marios2/src/Resources/axiosConfig.tsx b/typescript/frontend-marios2/src/Resources/axiosConfig.tsx index b9d24d440..6069ad19f 100644 --- a/typescript/frontend-marios2/src/Resources/axiosConfig.tsx +++ b/typescript/frontend-marios2/src/Resources/axiosConfig.tsx @@ -1,13 +1,13 @@ import axios from 'axios'; export const axiosConfigWithoutToken = axios.create({ - baseURL: 'https://monitor.innov.energy/api' - // baseURL: 'http://127.0.0.1:7087/api' + //baseURL: 'https://monitor.innov.energy/api' + baseURL: 'http://127.0.0.1:7087/api' }); const axiosConfig = axios.create({ - baseURL: 'https://monitor.innov.energy/api' - //baseURL: 'http://127.0.0.1:7087/api' + //baseURL: 'https://monitor.innov.energy/api' + baseURL: 'http://127.0.0.1:7087/api' }); axiosConfig.defaults.params = {}; diff --git a/typescript/frontend-marios2/src/content/dashboards/Installations/Installation.tsx b/typescript/frontend-marios2/src/content/dashboards/Installations/Installation.tsx index 377f19829..7c0e454ce 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Installations/Installation.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Installations/Installation.tsx @@ -28,7 +28,6 @@ import { extractValues, TopologyValues } from 'src/content/dashboards/Log/graph.util'; -import { Notification } from 'src/interfaces/S3Types'; import { WebSocketContext } from 'src/contexts/WebSocketContextProvider'; import Topology from '../Topology/Topology'; import { FormattedMessage } from 'react-intl'; @@ -62,8 +61,6 @@ function Installation(props: singleInstallationProps) { deleteInstallation } = installationContext; - const [warnings, setWarnings] = useState([]); - const [errors, setErrors] = useState([]); const [errorLoadingS3Data, setErrorLoadingS3Data] = useState(false); const webSocketsContext = useContext(WebSocketContext); const { getStatus } = webSocketsContext; @@ -153,9 +150,6 @@ function Installation(props: singleInstallationProps) { return; } - const newWarnings: Notification[] = []; - const newErrors: Notification[] = []; - if ( res === FetchResult.notAvailable || res === FetchResult.tryLater @@ -681,9 +675,8 @@ function Installation(props: singleInstallationProps) { {currentTab === 'live' && } {currentTab === 'log' && ( )} diff --git a/typescript/frontend-marios2/src/content/dashboards/Log/Log.tsx b/typescript/frontend-marios2/src/content/dashboards/Log/Log.tsx index 4a0267271..2e3a06f35 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Log/Log.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Log/Log.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import { Alert, Card, @@ -14,26 +14,49 @@ import { TableRow, useTheme } from '@mui/material'; -import WarningIcon from '@mui/icons-material/Warning'; import Typography from '@mui/material/Typography'; -import { Notification } from 'src/interfaces/S3Types'; import { FormattedMessage } from 'react-intl'; import ErrorIcon from '@mui/icons-material/Error'; +import axiosConfig from '../../../Resources/axiosConfig'; +import { AxiosError, AxiosResponse } from 'axios/index'; +import routes from '../../../Resources/routes.json'; +import { useNavigate } from 'react-router-dom'; +import { TokenContext } from '../../../contexts/tokenContext'; +import { ErrorMessage } from '../../../interfaces/S3Types'; interface LogProps { - warnings: Notification[]; - errors: Notification[]; errorLoadingS3Data: boolean; + id: number; } function Log(props: LogProps) { const theme = useTheme(); + //const [warnings, setWarnings] = useState([]); + const [errors, setErrors] = useState([]); + const navigate = useNavigate(); + const tokencontext = useContext(TokenContext); + const { removeToken } = tokencontext; + + useEffect(() => { + axiosConfig + .get(`/GetAllErrorsForInstallation?id=${props.id}`) + .then((res: AxiosResponse) => { + setErrors(res.data); + }) + .catch((err: AxiosError) => { + if (err.response && err.response.status == 401) { + removeToken(); + navigate(routes.login); + } + }); + }, []); return ( - {(props.errors.length > 0 || props.warnings.length > 0) && ( + {/* IT SHOULD BE {(errors.length > 0 || props.warnings.length > 0) && (*/} + {errors.length > 0 && ( @@ -43,25 +66,26 @@ function Log(props: LogProps) { - - - + + + + - + - {props.errors.map((error, index) => { + {errors.map((error, index) => { return ( @@ -82,9 +106,9 @@ function Log(props: LogProps) { color="text.primary" gutterBottom noWrap - sx={{ marginTop: '5px' }} + sx={{ marginTop: '5px', marginLeft: '-40px' }} > - {error.device} + {error.errorDescription} @@ -96,7 +120,7 @@ function Log(props: LogProps) { noWrap sx={{ marginTop: '5px' }} > - {error.description} + {error.deviceCreatedTheError} @@ -106,9 +130,9 @@ function Log(props: LogProps) { color="text.primary" gutterBottom noWrap - sx={{ marginTop: '5px' }} + sx={{ marginTop: '5px', marginLeft: '-40px' }} > - {error.date} + {error.createdAt} @@ -118,87 +142,87 @@ function Log(props: LogProps) { color="text.primary" gutterBottom noWrap - sx={{ marginTop: '5px' }} + sx={{ marginTop: '5px', marginLeft: '10px' }} > - {error.time} + {error.seen == false ? 'No' : 'Yes'} ); })} - {props.warnings.map((warning, index) => { - return ( - - - - - - - {warning.device} - - - - - {warning.description} - - - - - {warning.date} - - - - - {warning.time} - - - - ); - })} + {/*{props.warnings.map((warning, index) => {*/} + {/* return (*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* */} + {/* {warning.device}*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* {warning.description}*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* {warning.date}*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* {warning.time}*/} + {/* */} + {/* */} + {/* */} + {/* );*/} + {/*})}*/} )} - {!props.errorLoadingS3Data && props.errors.length == 0 && ( + {!props.errorLoadingS3Data && errors.length == 0 && ( )} - {!props.errorLoadingS3Data && props.warnings.length == 0 && ( - - - - - )} + {/*{!props.errorLoadingS3Data && props.warnings.length == 0 && (*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/*)}*/} diff --git a/typescript/frontend-marios2/src/content/dashboards/Log/fetchData.tsx b/typescript/frontend-marios2/src/content/dashboards/Log/fetchData.tsx deleted file mode 100644 index 0bc6f455d..000000000 --- a/typescript/frontend-marios2/src/content/dashboards/Log/fetchData.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { UnixTime } from '../../../dataCache/time'; -import { I_S3Credentials } from '../../../interfaces/S3Types'; -import { FetchResult } from '../../../dataCache/dataCache'; -import { DataRecord } from '../../../dataCache/data'; -import { S3Access } from '../../../dataCache/S3/S3Access'; -import { parseCsv } from './graph.util'; - -export const fetchData = ( - timestamp: UnixTime, - s3Credentials?: I_S3Credentials -): Promise> => { - const s3Path = `${timestamp.ticks}.csv`; - if (s3Credentials && s3Credentials.s3Bucket) { - const s3Access = new S3Access( - s3Credentials.s3Bucket, - s3Credentials.s3Region, - s3Credentials.s3Provider, - s3Credentials.s3Key, - s3Credentials.s3Secret - ); - return s3Access - .get(s3Path) - .then(async (r) => { - if (r.status === 404) { - return Promise.resolve(FetchResult.notAvailable); - } else if (r.status === 200) { - const text = await r.text(); - return parseCsv(text); - } else { - return Promise.resolve(FetchResult.notAvailable); - } - }) - .catch((e) => { - return Promise.resolve(FetchResult.tryLater); - }); - } -}; diff --git a/typescript/frontend-marios2/src/interfaces/S3Types.tsx b/typescript/frontend-marios2/src/interfaces/S3Types.tsx index 4f04962b6..b68ddc4b9 100644 --- a/typescript/frontend-marios2/src/interfaces/S3Types.tsx +++ b/typescript/frontend-marios2/src/interfaces/S3Types.tsx @@ -6,9 +6,10 @@ export interface I_S3Credentials { s3Bucket?: string; } -export interface Notification { - device: string; - description: string; - date: string; - time: string; +export interface ErrorMessage { + installationId: number; + createdAt: Date; + errorDescription: string; + deviceCreatedTheError: string; + seen: boolean; }