From 9f83c8be1c5658b7aa1cd8a5fd1a509ab469855e Mon Sep 17 00:00:00 2001 From: Stoyan Zlatev Date: Mon, 22 May 2023 16:50:37 +0200 Subject: [PATCH] db table created - tested through swagger ui --- .../Service/MeterProcessState/Appsettings.cs | 2 + .../Content/JSON/CordonelTestSpec.json | 6 + .../CordonelPressureSensorTestController.cs | 255 ++++++------------ .../Extensions/SqlDataReaderExtensions.cs | 69 +++++ .../MeterProcessState.csproj | 7 +- .../MeterProcessState/Models/Cordonel.cs | 4 +- Common/Service/MeterProcessState/Web.config | 180 +++++++------ 7 files changed, 260 insertions(+), 263 deletions(-) create mode 100644 Common/Service/MeterProcessState/Content/JSON/CordonelTestSpec.json create mode 100644 Common/Service/MeterProcessState/Extensions/SqlDataReaderExtensions.cs diff --git a/Common/Service/MeterProcessState/Appsettings.cs b/Common/Service/MeterProcessState/Appsettings.cs index a193c19d..11675a87 100644 --- a/Common/Service/MeterProcessState/Appsettings.cs +++ b/Common/Service/MeterProcessState/Appsettings.cs @@ -4,6 +4,8 @@ public class Appsettings { + public static string CordonelTestSpecJson => ConfigurationManager.AppSettings[nameof(CordonelTestSpecJson)]; + public class ConnectionStrings { public static string Default => ConfigurationManager.ConnectionStrings[nameof(Default)].ConnectionString; diff --git a/Common/Service/MeterProcessState/Content/JSON/CordonelTestSpec.json b/Common/Service/MeterProcessState/Content/JSON/CordonelTestSpec.json new file mode 100644 index 00000000..b97e6988 --- /dev/null +++ b/Common/Service/MeterProcessState/Content/JSON/CordonelTestSpec.json @@ -0,0 +1,6 @@ +{ + "NumberOfMeasurements": 3, + "TimeMeasurementsInS": 1, + "MaxDeviationInBar": 0.5 +} + diff --git a/Common/Service/MeterProcessState/Controllers/CordonelPressureSensorTestController.cs b/Common/Service/MeterProcessState/Controllers/CordonelPressureSensorTestController.cs index 82e63861..1e9ee000 100644 --- a/Common/Service/MeterProcessState/Controllers/CordonelPressureSensorTestController.cs +++ b/Common/Service/MeterProcessState/Controllers/CordonelPressureSensorTestController.cs @@ -1,127 +1,110 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers { + using Newtonsoft.Json; + using System; - using System.Collections.Concurrent; using System.Collections.Generic; using System.Data.SqlClient; + using System.IO; using System.Linq; using System.Threading.Tasks; + using System.Web; using System.Web.Http; + using Xylem.Common.Service.MeterProcessState.Extensions; using Xylem.Common.Service.MeterProcessState.Models; [RoutePrefix("api/CordonelPressureSensorTest")] public class CordonelPressureSensorTestController : ApiController { - [HttpGet] [Route(nameof(GetTestSpec))] - public async Task GetTestSpec() + public IHttpActionResult GetTestSpec() { - var actionResult = default(IHttpActionResult); - var testSpec = default(CordonelTestSpec); - - using (var sqlConnection = new SqlConnection(Appsettings.ConnectionStrings.Default)) + try { - sqlConnection.FireInfoMessageEventOnUserErrors = true; - sqlConnection.InfoMessage += (sender, args) => - { - var messages = args - .Errors - .Cast() - .Select(x => x.Message); + var cordonelTestSpecJson = HttpContext + .Current + .Server + .MapPath(Appsettings.CordonelTestSpecJson); + var cordonelTestSpecContent = File.ReadAllText(cordonelTestSpecJson); + var cordonelTestSpec = JsonConvert.DeserializeObject(cordonelTestSpecContent); - // TODO: Switch to expected error messages list. - actionResult = this.Json(args.Errors); - }; - await sqlConnection.OpenAsync(); - - using (var sqlCommand = sqlConnection.CreateCommand()) - { - sqlCommand.CommandText = $@" - SELECT ... - , ... - FROM [x]"; - - using (var sqlDataReader = await sqlCommand.ExecuteReaderAsync()) - { - while (await sqlDataReader.ReadAsync()) - { - testSpec = new CordonelTestSpec - { - NumberOfMeasurements = await sqlDataReader.GetIntAsync(), - TimeMeasurementsInS = await sqlDataReader.GetIntAsync(), - MaxDeviationInBar = await sqlDataReader.GetFloatAsync(), - }; - } - - if (actionResult is null) - { - actionResult = this.Json(testSpec); - } - } - } + return this.Json(cordonelTestSpec); + } + catch (Exception e) + { + return this.BadRequest(e.Message); } - - return actionResult; } - - /// - /// Nach dem Test wird für jede PcbID diese Funktion aufgerufen und die daten in die Datenbank übermittelt - /// - /// TODO: return value + [HttpPost] [Route(nameof(PostTestResults))] public async Task PostTestResults([FromBody] CordonelTestResult cordonelTestResult) { + var httpActionResult = default(IHttpActionResult); + if (!this.ModelState.IsValid) { return this.BadRequest(this.ModelState); } - - var actionResult = default(IHttpActionResult); - var rowsAffected = -1; - - using (var sqlConnection = new SqlConnection(Appsettings.ConnectionStrings.Default)) + else { - sqlConnection.FireInfoMessageEventOnUserErrors = true; - sqlConnection.InfoMessage += (sender, args) => + var insertedId = default(object); + + using (var sqlConnection = new SqlConnection(Appsettings.ConnectionStrings.Default)) { - var messages = args - .Errors - .Cast() - .Select(x => x.Message); + sqlConnection.FireInfoMessageEventOnUserErrors = true; + sqlConnection.InfoMessage += (sender, args) => + { + var messages = args + .Errors + .Cast() + .Select(x => x.Message); - // TODO: Switch to expected error messages list. - actionResult = this.Json(args.Errors); - }; - await sqlConnection.OpenAsync(); + // TODO: Switch to expected error messages list. + httpActionResult = this.Json(args.Errors); + }; - using (var sqlCommand = sqlConnection.CreateCommand()) + await sqlConnection.OpenAsync(); + + using (var sqlCommand = sqlConnection.CreateCommand()) + { + sqlCommand.CommandText = $@" + INSERT INTO [Cordonel_PressureSensor_TestResults] ( + [PcbId] + , [AvgPressureInBar] + , [TestPassed] + , [TestDate]) + OUTPUT [inserted].[Id] + VALUES (@{nameof(cordonelTestResult.PcbId)} + , @{nameof(cordonelTestResult.AvgPressureInBar)} + , @{nameof(cordonelTestResult.TestPassed)} + , @{nameof(cordonelTestResult.TestDate)})"; + sqlCommand.Parameters.AddWithValue(nameof(cordonelTestResult.PcbId), cordonelTestResult.PcbId); + sqlCommand.Parameters.AddWithValue(nameof(cordonelTestResult.TestDate), cordonelTestResult.TestDate); + sqlCommand.Parameters.AddWithValue(nameof(cordonelTestResult.AvgPressureInBar), cordonelTestResult.AvgPressureInBar); + sqlCommand.Parameters.AddWithValue(nameof(cordonelTestResult.TestPassed), cordonelTestResult.TestPassed); + + insertedId = await sqlCommand.ExecuteScalarAsync(); + } + } + + if (insertedId is null) { - sqlCommand.CommandText = $@" - INSERT INTO [x] ( - ... - , ...) - VALUES (@{nameof(cordonelTestResult.PcbId)} - , @{nameof(cordonelTestResult.TestDate)} - , @{nameof(cordonelTestResult.AvgPressureInBar)} - , @{nameof(cordonelTestResult.TestPassed)})"; - sqlCommand.Parameters.AddWithValue(nameof(cordonelTestResult.PcbId), cordonelTestResult.PcbId); - sqlCommand.Parameters.AddWithValue(nameof(cordonelTestResult.TestDate), cordonelTestResult.TestDate); - sqlCommand.Parameters.AddWithValue(nameof(cordonelTestResult.AvgPressureInBar), cordonelTestResult.AvgPressureInBar); - sqlCommand.Parameters.AddWithValue(nameof(cordonelTestResult.TestPassed), cordonelTestResult.TestPassed); - - rowsAffected = await sqlCommand.ExecuteNonQueryAsync(); + if (httpActionResult is null) + { + // TODO: Custom error message. + httpActionResult = this.BadRequest(); + } + } + else + { + httpActionResult = this.Ok(insertedId); } } - if (rowsAffected > 0) - { - return this.Ok(); - } - - return this.BadRequest(); + return httpActionResult; } /// @@ -153,22 +136,27 @@ using (var sqlCommand = sqlConnection.CreateCommand()) { sqlCommand.CommandText = $@" - SELECT ... - , ... - FROM [x] - WHERE [PcbId] = {nameof(pcbId)}"; + SELECT [Id] + , [PcbId] + , [AvgPressureInBar] + , [TestPassed] + , [TestDate] + FROM [Cordonel_PressureSensor_TestResults] + WHERE [PcbId] = {nameof(pcbId)} + ORDER BY [Id]"; sqlCommand.Parameters.AddWithValue(nameof(pcbId), pcbId); using (var sqlDataReader = await sqlCommand.ExecuteReaderAsync()) { - if (await sqlDataReader.ReadAsync()) + while (await sqlDataReader.ReadAsync()) { testResults.Add(new CordonelTestResult { - PcbId = await sqlDataReader.GetIntAsync(), - TestDate = await sqlDataReader.GetDateTimeAsync(), - AvgPressureInBar = await sqlDataReader.GetFloatAsync(), - TestPassed = await sqlDataReader.GetBoolAsync(), + Id = await sqlDataReader.GetLongAsync(0), + PcbId = await sqlDataReader.GetIntAsync(1), + AvgPressureInBar = await sqlDataReader.GetFloatAsync(2), + TestPassed = await sqlDataReader.GetBoolAsync(3), + TestDate = await sqlDataReader.GetDateTimeAsync(4), }); } @@ -183,79 +171,4 @@ return actionResult; } } - - public static class SqlDataReaderExtensions - { - private static readonly ConcurrentDictionary indexes = new ConcurrentDictionary(); - - public static async Task GetIntAsync(this SqlDataReader sqlDataReader) - { - var hashCode = sqlDataReader.GetHashCode(); - var index = indexes.GetOrAdd(hashCode, 0); - var value = default(int); - - if (!await sqlDataReader.IsDBNullAsync(index)) - { - value = sqlDataReader.GetInt32(index); - } - - indexes.AddOrUpdate(hashCode, index, (_1, _2) => index + 1); - - return value; - } - - public static async Task GetDateTimeAsync(this SqlDataReader sqlDataReader) - { - var index = sqlDataReader - .GetHashCode() - .GetIndex(); - var value = default(DateTime); - - if (!await sqlDataReader.IsDBNullAsync(index)) - { - value = sqlDataReader.GetDateTime(index); - } - - return value; - } - - public static async Task GetFloatAsync(this SqlDataReader sqlDataReader) - { - var index = sqlDataReader - .GetHashCode() - .GetIndex(); - var value = default(float); - - if (!await sqlDataReader.IsDBNullAsync(index)) - { - value = sqlDataReader.GetFloat(index); - } - - return value; - } - - public static async Task GetBoolAsync(this SqlDataReader sqlDataReader) - { - var index = sqlDataReader - .GetHashCode() - .GetIndex(); - var value = default(bool); - - if (!await sqlDataReader.IsDBNullAsync(index)) - { - value = sqlDataReader.GetBoolean(index); - } - - return value; - } - - private static int GetIndex(this int hashCode) - { - var index = indexes.GetOrAdd(hashCode, 0); - - indexes.AddOrUpdate(hashCode, index, (_1, _2) => index + 1); - - return index; - } - } } \ No newline at end of file diff --git a/Common/Service/MeterProcessState/Extensions/SqlDataReaderExtensions.cs b/Common/Service/MeterProcessState/Extensions/SqlDataReaderExtensions.cs new file mode 100644 index 00000000..e9e380a5 --- /dev/null +++ b/Common/Service/MeterProcessState/Extensions/SqlDataReaderExtensions.cs @@ -0,0 +1,69 @@ +namespace Xylem.Common.Service.MeterProcessState.Extensions +{ + using System; + using System.Data.SqlClient; + using System.Threading.Tasks; + + public static class SqlDataReaderExtensions + { + public static async Task GetIntAsync(this SqlDataReader sqlDataReader, int index) + { + if (await sqlDataReader.IsDBNullAsync(index)) + { + return default(int); + } + + return sqlDataReader.GetInt32(index); + } + + public static async Task GetLongAsync(this SqlDataReader sqlDataReader, int index) + { + if (await sqlDataReader.IsDBNullAsync(index)) + { + return default(long); + } + + return sqlDataReader.GetInt64(index); + } + + public static async Task GetDateTimeAsync(this SqlDataReader sqlDataReader, int index) + { + if (await sqlDataReader.IsDBNullAsync(index)) + { + return default(DateTime); + } + + return sqlDataReader.GetSqlDateTime(index).Value; + } + + public static async Task GetFloatAsync(this SqlDataReader sqlDataReader, int index) + { + if (await sqlDataReader.IsDBNullAsync(index)) + { + return default(float); + } + + return sqlDataReader.GetFloat(index); + } + + public static async Task GetDoubleAsync(this SqlDataReader sqlDataReader, int index) + { + if (await sqlDataReader.IsDBNullAsync(index)) + { + return default(double); + } + + return sqlDataReader.GetDouble(index); + } + + public static async Task GetBoolAsync(this SqlDataReader sqlDataReader, int index) + { + if (await sqlDataReader.IsDBNullAsync(index)) + { + return default(bool); + } + + return sqlDataReader.GetBoolean(index); + } + } +} \ No newline at end of file diff --git a/Common/Service/MeterProcessState/MeterProcessState.csproj b/Common/Service/MeterProcessState/MeterProcessState.csproj index 495b92e3..9247456b 100644 --- a/Common/Service/MeterProcessState/MeterProcessState.csproj +++ b/Common/Service/MeterProcessState/MeterProcessState.csproj @@ -37,7 +37,7 @@ 4 7 bin\Xylem.Common.Service.MeterProcessState.xml - 1591 + 0049;1591 pdbonly @@ -229,6 +229,7 @@ + @@ -315,6 +316,9 @@ + + PreserveNewest + @@ -346,7 +350,6 @@ - diff --git a/Common/Service/MeterProcessState/Models/Cordonel.cs b/Common/Service/MeterProcessState/Models/Cordonel.cs index 1920da8a..a1995366 100644 --- a/Common/Service/MeterProcessState/Models/Cordonel.cs +++ b/Common/Service/MeterProcessState/Models/Cordonel.cs @@ -13,11 +13,13 @@ public class CordonelTestResult { + public long Id { get; set; } + public int PcbId { get; set; } public DateTime TestDate { get; set; } - public float AvgPressureInBar { get; set; } + public float AvgPressureInBar { get; set; } public bool TestPassed { get; set; } } diff --git a/Common/Service/MeterProcessState/Web.config b/Common/Service/MeterProcessState/Web.config index 0cbd5817..800c4129 100644 --- a/Common/Service/MeterProcessState/Web.config +++ b/Common/Service/MeterProcessState/Web.config @@ -4,15 +4,17 @@ http://go.microsoft.com/fwlink/?LinkId=301879 --> - - -
- - - - - - +
+ + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file