From 1ed53d5e4bab08dad71487351d2b0eddfd8b7f00 Mon Sep 17 00:00:00 2001 From: "DESKTOP-GENO133\\IvanPlex" Date: Thu, 8 Feb 2024 19:50:50 -0700 Subject: [PATCH] added pg data access for user config record. --- .../Postgres/UserConfigDataAccess.cs | 108 ++++++++++++++++++ Program.cs | 3 +- 2 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 External/Implementations/Postgres/UserConfigDataAccess.cs diff --git a/External/Implementations/Postgres/UserConfigDataAccess.cs b/External/Implementations/Postgres/UserConfigDataAccess.cs new file mode 100644 index 0000000..b15c176 --- /dev/null +++ b/External/Implementations/Postgres/UserConfigDataAccess.cs @@ -0,0 +1,108 @@ +using CarCareTracker.External.Interfaces; +using CarCareTracker.Models; +using Npgsql; +using System.Text.Json; + +namespace CarCareTracker.External.Implementations +{ + public class PGUserConfigDataAccess: IUserConfigDataAccess + { + private NpgsqlConnection pgDataSource; + private readonly ILogger _logger; + private static string tableName = "userconfigrecords"; + public PGUserConfigDataAccess(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 primary key, data jsonb not null)"; + using (var ctext = new NpgsqlCommand(initCMD, pgDataSource)) + { + ctext.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + } + } + public UserConfigData GetUserConfig(int userId) + { + try + { + string cmd = $"SELECT data FROM app.{tableName} WHERE id = @id"; + var result = new UserConfigData(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", userId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + UserConfigData userConfig = JsonSerializer.Deserialize(reader["data"] as string); + result = userConfig; + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new UserConfigData(); + } + } + public bool SaveUserConfig(UserConfigData userConfigData) + { + var existingRecord = GetUserConfig(userConfigData.Id); + try + { + if (existingRecord.Id == default) + { + string cmd = $"INSERT INTO app.{tableName} (id, data) VALUES(@id, CAST(@data AS jsonb))"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + var serializedData = JsonSerializer.Serialize(userConfigData); + ctext.Parameters.AddWithValue("id", userConfigData.Id); + ctext.Parameters.AddWithValue("data", serializedData); + return ctext.ExecuteNonQuery() > 0; + } + } + 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(userConfigData); + ctext.Parameters.AddWithValue("id", userConfigData.Id); + ctext.Parameters.AddWithValue("data", serializedData); + return ctext.ExecuteNonQuery() > 0; + } + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool DeleteUserConfig(int userId) + { + try + { + string cmd = $"DELETE FROM app.{tableName} WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", userId); + return ctext.ExecuteNonQuery() > 0; + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + } +} diff --git a/Program.cs b/Program.cs index a3797a8..b394c83 100644 --- a/Program.cs +++ b/Program.cs @@ -27,6 +27,7 @@ if (!string.IsNullOrWhiteSpace(builder.Configuration["POSTGRES_CONNECTION"])){ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); } else { @@ -42,12 +43,12 @@ 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(); //configure helpers builder.Services.AddSingleton();