From 00622126d74f98245153addf075bdb42556cd1d1 Mon Sep 17 00:00:00 2001 From: "DESKTOP-GENO133\\IvanPlex" Date: Thu, 8 Feb 2024 19:26:42 -0700 Subject: [PATCH] added more generic data access classes for postgres. --- .../Postgres/OdometerRecordDataAccess.cs | 160 ++++++++++++++++++ .../Postgres/PlanRecordDataAccess.cs | 160 ++++++++++++++++++ .../Postgres/PlanRecordTemplateDataAccess.cs | 160 ++++++++++++++++++ .../Postgres/SupplyRecordDataAccess.cs | 160 ++++++++++++++++++ .../Postgres/UpgradeRecordDataAccess.cs | 160 ++++++++++++++++++ Program.cs | 15 +- 6 files changed, 810 insertions(+), 5 deletions(-) create mode 100644 External/Implementations/Postgres/OdometerRecordDataAccess.cs create mode 100644 External/Implementations/Postgres/PlanRecordDataAccess.cs create mode 100644 External/Implementations/Postgres/PlanRecordTemplateDataAccess.cs create mode 100644 External/Implementations/Postgres/SupplyRecordDataAccess.cs create mode 100644 External/Implementations/Postgres/UpgradeRecordDataAccess.cs diff --git a/External/Implementations/Postgres/OdometerRecordDataAccess.cs b/External/Implementations/Postgres/OdometerRecordDataAccess.cs new file mode 100644 index 0000000..feab197 --- /dev/null +++ b/External/Implementations/Postgres/OdometerRecordDataAccess.cs @@ -0,0 +1,160 @@ +using CarCareTracker.External.Interfaces; +using CarCareTracker.Models; +using Npgsql; +using System.Text.Json; + +namespace CarCareTracker.External.Implementations +{ + public class PGOdometerRecordDataAccess : IOdometerRecordDataAccess + { + private NpgsqlConnection pgDataSource; + private readonly ILogger _logger; + private static string tableName = "odometerrecords"; + public PGOdometerRecordDataAccess(IConfiguration config, ILogger logger) + { + pgDataSource = new NpgsqlConnection(config["POSTGRES_CONNECTION"]); + _logger = logger; + try + { + pgDataSource.Open(); + //create table if not exist. + string initCMD = $"CREATE TABLE IF NOT EXISTS app.{tableName} (id INT GENERATED ALWAYS AS IDENTITY primary key, vehicleId INT not null, data jsonb not null)"; + using (var ctext = new NpgsqlCommand(initCMD, pgDataSource)) + { + ctext.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + } + } + public List GetOdometerRecordsByVehicleId(int vehicleId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE vehicleId = @vehicleId"; + var results = new List(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", vehicleId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + OdometerRecord odometerRecord = JsonSerializer.Deserialize(reader["data"] as string); + results.Add(odometerRecord); + } + } + return results; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new List(); + } + } + public OdometerRecord GetOdometerRecordById(int odometerRecordId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE id = @id"; + var result = new OdometerRecord(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", odometerRecordId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + OdometerRecord odometerRecord = JsonSerializer.Deserialize(reader["data"] as string); + result = odometerRecord; + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new OdometerRecord(); + } + } + public bool DeleteOdometerRecordById(int odometerRecordId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", odometerRecordId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool SaveOdometerRecordToVehicle(OdometerRecord odometerRecord) + { + try + { + if (odometerRecord.Id == default) + { + string cmd = $"INSERT INTO app.{tableName} (vehicleId, data) VALUES(@vehicleId, CAST(@data AS jsonb)) RETURNING id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", odometerRecord.VehicleId); + ctext.Parameters.AddWithValue("data", "{}"); + odometerRecord.Id = Convert.ToInt32(ctext.ExecuteScalar()); + //update json data + if (odometerRecord.Id != default) + { + string cmdU = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctextU = new NpgsqlCommand(cmdU, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(odometerRecord); + ctextU.Parameters.AddWithValue("id", odometerRecord.Id); + ctextU.Parameters.AddWithValue("data", serializedData); + return ctextU.ExecuteNonQuery() > 0; + } + } + return odometerRecord.Id != default; + } + } + else + { + string cmd = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(odometerRecord); + ctext.Parameters.AddWithValue("id", odometerRecord.Id); + ctext.Parameters.AddWithValue("data", serializedData); + return ctext.ExecuteNonQuery() > 0; + } + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool DeleteAllOdometerRecordsByVehicleId(int vehicleId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE vehicleId = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", vehicleId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + } +} diff --git a/External/Implementations/Postgres/PlanRecordDataAccess.cs b/External/Implementations/Postgres/PlanRecordDataAccess.cs new file mode 100644 index 0000000..10cb76b --- /dev/null +++ b/External/Implementations/Postgres/PlanRecordDataAccess.cs @@ -0,0 +1,160 @@ +using CarCareTracker.External.Interfaces; +using CarCareTracker.Models; +using Npgsql; +using System.Text.Json; + +namespace CarCareTracker.External.Implementations +{ + public class PGPlanRecordDataAccess : IPlanRecordDataAccess + { + private NpgsqlConnection pgDataSource; + private readonly ILogger _logger; + private static string tableName = "planrecords"; + public PGPlanRecordDataAccess(IConfiguration config, ILogger logger) + { + pgDataSource = new NpgsqlConnection(config["POSTGRES_CONNECTION"]); + _logger = logger; + try + { + pgDataSource.Open(); + //create table if not exist. + string initCMD = $"CREATE TABLE IF NOT EXISTS app.{tableName} (id INT GENERATED ALWAYS AS IDENTITY primary key, vehicleId INT not null, data jsonb not null)"; + using (var ctext = new NpgsqlCommand(initCMD, pgDataSource)) + { + ctext.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + } + } + public List GetPlanRecordsByVehicleId(int vehicleId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE vehicleId = @vehicleId"; + var results = new List(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", vehicleId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + PlanRecord planRecord = JsonSerializer.Deserialize(reader["data"] as string); + results.Add(planRecord); + } + } + return results; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new List(); + } + } + public PlanRecord GetPlanRecordById(int planRecordId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE id = @id"; + var result = new PlanRecord(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", planRecordId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + PlanRecord planRecord = JsonSerializer.Deserialize(reader["data"] as string); + result = planRecord; + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new PlanRecord(); + } + } + public bool DeletePlanRecordById(int planRecordId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", planRecordId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool SavePlanRecordToVehicle(PlanRecord planRecord) + { + try + { + if (planRecord.Id == default) + { + string cmd = $"INSERT INTO app.{tableName} (vehicleId, data) VALUES(@vehicleId, CAST(@data AS jsonb)) RETURNING id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", planRecord.VehicleId); + ctext.Parameters.AddWithValue("data", "{}"); + planRecord.Id = Convert.ToInt32(ctext.ExecuteScalar()); + //update json data + if (planRecord.Id != default) + { + string cmdU = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctextU = new NpgsqlCommand(cmdU, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(planRecord); + ctextU.Parameters.AddWithValue("id", planRecord.Id); + ctextU.Parameters.AddWithValue("data", serializedData); + return ctextU.ExecuteNonQuery() > 0; + } + } + return planRecord.Id != default; + } + } + else + { + string cmd = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(planRecord); + ctext.Parameters.AddWithValue("id", planRecord.Id); + ctext.Parameters.AddWithValue("data", serializedData); + return ctext.ExecuteNonQuery() > 0; + } + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool DeleteAllPlanRecordsByVehicleId(int vehicleId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE vehicleId = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", vehicleId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + } +} diff --git a/External/Implementations/Postgres/PlanRecordTemplateDataAccess.cs b/External/Implementations/Postgres/PlanRecordTemplateDataAccess.cs new file mode 100644 index 0000000..c40e916 --- /dev/null +++ b/External/Implementations/Postgres/PlanRecordTemplateDataAccess.cs @@ -0,0 +1,160 @@ +using CarCareTracker.External.Interfaces; +using CarCareTracker.Models; +using Npgsql; +using System.Text.Json; + +namespace CarCareTracker.External.Implementations +{ + public class PGPlanRecordTemplateDataAccess : IPlanRecordTemplateDataAccess + { + private NpgsqlConnection pgDataSource; + private readonly ILogger _logger; + private static string tableName = "planrecordtemplates"; + public PGPlanRecordTemplateDataAccess(IConfiguration config, ILogger logger) + { + pgDataSource = new NpgsqlConnection(config["POSTGRES_CONNECTION"]); + _logger = logger; + try + { + pgDataSource.Open(); + //create table if not exist. + string initCMD = $"CREATE TABLE IF NOT EXISTS app.{tableName} (id INT GENERATED ALWAYS AS IDENTITY primary key, vehicleId INT not null, data jsonb not null)"; + using (var ctext = new NpgsqlCommand(initCMD, pgDataSource)) + { + ctext.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + } + } + public List GetPlanRecordTemplatesByVehicleId(int vehicleId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE vehicleId = @vehicleId"; + var results = new List(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", vehicleId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + PlanRecordInput planRecord = JsonSerializer.Deserialize(reader["data"] as string); + results.Add(planRecord); + } + } + return results; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new List(); + } + } + public PlanRecordInput GetPlanRecordTemplateById(int planRecordId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE id = @id"; + var result = new PlanRecordInput(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", planRecordId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + PlanRecordInput planRecord = JsonSerializer.Deserialize(reader["data"] as string); + result = planRecord; + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new PlanRecordInput(); + } + } + public bool DeletePlanRecordTemplateById(int planRecordId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", planRecordId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool SavePlanRecordTemplateToVehicle(PlanRecordInput planRecord) + { + try + { + if (planRecord.Id == default) + { + string cmd = $"INSERT INTO app.{tableName} (vehicleId, data) VALUES(@vehicleId, CAST(@data AS jsonb)) RETURNING id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", planRecord.VehicleId); + ctext.Parameters.AddWithValue("data", "{}"); + planRecord.Id = Convert.ToInt32(ctext.ExecuteScalar()); + //update json data + if (planRecord.Id != default) + { + string cmdU = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctextU = new NpgsqlCommand(cmdU, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(planRecord); + ctextU.Parameters.AddWithValue("id", planRecord.Id); + ctextU.Parameters.AddWithValue("data", serializedData); + return ctextU.ExecuteNonQuery() > 0; + } + } + return planRecord.Id != default; + } + } + else + { + string cmd = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(planRecord); + ctext.Parameters.AddWithValue("id", planRecord.Id); + ctext.Parameters.AddWithValue("data", serializedData); + return ctext.ExecuteNonQuery() > 0; + } + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool DeleteAllPlanRecordTemplatesByVehicleId(int vehicleId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE vehicleId = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", vehicleId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + } +} diff --git a/External/Implementations/Postgres/SupplyRecordDataAccess.cs b/External/Implementations/Postgres/SupplyRecordDataAccess.cs new file mode 100644 index 0000000..b299644 --- /dev/null +++ b/External/Implementations/Postgres/SupplyRecordDataAccess.cs @@ -0,0 +1,160 @@ +using CarCareTracker.External.Interfaces; +using CarCareTracker.Models; +using Npgsql; +using System.Text.Json; + +namespace CarCareTracker.External.Implementations +{ + public class PGSupplyRecordDataAccess : ISupplyRecordDataAccess + { + private NpgsqlConnection pgDataSource; + private readonly ILogger _logger; + private static string tableName = "supplyrecords"; + public PGSupplyRecordDataAccess(IConfiguration config, ILogger logger) + { + pgDataSource = new NpgsqlConnection(config["POSTGRES_CONNECTION"]); + _logger = logger; + try + { + pgDataSource.Open(); + //create table if not exist. + string initCMD = $"CREATE TABLE IF NOT EXISTS app.{tableName} (id INT GENERATED ALWAYS AS IDENTITY primary key, vehicleId INT not null, data jsonb not null)"; + using (var ctext = new NpgsqlCommand(initCMD, pgDataSource)) + { + ctext.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + } + } + public List GetSupplyRecordsByVehicleId(int vehicleId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE vehicleId = @vehicleId"; + var results = new List(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", vehicleId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + SupplyRecord supplyRecord = JsonSerializer.Deserialize(reader["data"] as string); + results.Add(supplyRecord); + } + } + return results; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new List(); + } + } + public SupplyRecord GetSupplyRecordById(int supplyRecordId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE id = @id"; + var result = new SupplyRecord(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", supplyRecordId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + SupplyRecord supplyRecord = JsonSerializer.Deserialize(reader["data"] as string); + result = supplyRecord; + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new SupplyRecord(); + } + } + public bool DeleteSupplyRecordById(int supplyRecordId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", supplyRecordId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool SaveSupplyRecordToVehicle(SupplyRecord supplyRecord) + { + try + { + if (supplyRecord.Id == default) + { + string cmd = $"INSERT INTO app.{tableName} (vehicleId, data) VALUES(@vehicleId, CAST(@data AS jsonb)) RETURNING id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", supplyRecord.VehicleId); + ctext.Parameters.AddWithValue("data", "{}"); + supplyRecord.Id = Convert.ToInt32(ctext.ExecuteScalar()); + //update json data + if (supplyRecord.Id != default) + { + string cmdU = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctextU = new NpgsqlCommand(cmdU, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(supplyRecord); + ctextU.Parameters.AddWithValue("id", supplyRecord.Id); + ctextU.Parameters.AddWithValue("data", serializedData); + return ctextU.ExecuteNonQuery() > 0; + } + } + return supplyRecord.Id != default; + } + } + else + { + string cmd = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(supplyRecord); + ctext.Parameters.AddWithValue("id", supplyRecord.Id); + ctext.Parameters.AddWithValue("data", serializedData); + return ctext.ExecuteNonQuery() > 0; + } + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool DeleteAllSupplyRecordsByVehicleId(int vehicleId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE vehicleId = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", vehicleId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + } +} diff --git a/External/Implementations/Postgres/UpgradeRecordDataAccess.cs b/External/Implementations/Postgres/UpgradeRecordDataAccess.cs new file mode 100644 index 0000000..c1e00bc --- /dev/null +++ b/External/Implementations/Postgres/UpgradeRecordDataAccess.cs @@ -0,0 +1,160 @@ +using CarCareTracker.External.Interfaces; +using CarCareTracker.Models; +using Npgsql; +using System.Text.Json; + +namespace CarCareTracker.External.Implementations +{ + public class PGUpgradeRecordDataAccess : IUpgradeRecordDataAccess + { + private NpgsqlConnection pgDataSource; + private readonly ILogger _logger; + private static string tableName = "upgraderecords"; + public PGUpgradeRecordDataAccess(IConfiguration config, ILogger logger) + { + pgDataSource = new NpgsqlConnection(config["POSTGRES_CONNECTION"]); + _logger = logger; + try + { + pgDataSource.Open(); + //create table if not exist. + string initCMD = $"CREATE TABLE IF NOT EXISTS app.{tableName} (id INT GENERATED ALWAYS AS IDENTITY primary key, vehicleId INT not null, data jsonb not null)"; + using (var ctext = new NpgsqlCommand(initCMD, pgDataSource)) + { + ctext.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + } + } + public List GetUpgradeRecordsByVehicleId(int vehicleId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE vehicleId = @vehicleId"; + var results = new List(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", vehicleId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + UpgradeRecord upgradeRecord = JsonSerializer.Deserialize(reader["data"] as string); + results.Add(upgradeRecord); + } + } + return results; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new List(); + } + } + public UpgradeRecord GetUpgradeRecordById(int upgradeRecordId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE id = @id"; + var result = new UpgradeRecord(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", upgradeRecordId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + UpgradeRecord upgradeRecord = JsonSerializer.Deserialize(reader["data"] as string); + result = upgradeRecord; + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new UpgradeRecord(); + } + } + public bool DeleteUpgradeRecordById(int upgradeRecordId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", upgradeRecordId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool SaveUpgradeRecordToVehicle(UpgradeRecord upgradeRecord) + { + try + { + if (upgradeRecord.Id == default) + { + string cmd = $"INSERT INTO app.{tableName} (vehicleId, data) VALUES(@vehicleId, CAST(@data AS jsonb)) RETURNING id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("vehicleId", upgradeRecord.VehicleId); + ctext.Parameters.AddWithValue("data", "{}"); + upgradeRecord.Id = Convert.ToInt32(ctext.ExecuteScalar()); + //update json data + if (upgradeRecord.Id != default) + { + string cmdU = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctextU = new NpgsqlCommand(cmdU, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(upgradeRecord); + ctextU.Parameters.AddWithValue("id", upgradeRecord.Id); + ctextU.Parameters.AddWithValue("data", serializedData); + return ctextU.ExecuteNonQuery() > 0; + } + } + return upgradeRecord.Id != default; + } + } + else + { + string cmd = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(upgradeRecord); + ctext.Parameters.AddWithValue("id", upgradeRecord.Id); + ctext.Parameters.AddWithValue("data", serializedData); + return ctext.ExecuteNonQuery() > 0; + } + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool DeleteAllUpgradeRecordsByVehicleId(int vehicleId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE vehicleId = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", vehicleId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + } +} diff --git a/Program.cs b/Program.cs index 8ba4fea..a3797a8 100644 --- a/Program.cs +++ b/Program.cs @@ -22,6 +22,11 @@ if (!string.IsNullOrWhiteSpace(builder.Configuration["POSTGRES_CONNECTION"])){ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); } else { @@ -32,17 +37,17 @@ else builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); } -builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); //configure helpers builder.Services.AddSingleton();