From ad2b58697abf2adcbfb09983002b450f720b22e0 Mon Sep 17 00:00:00 2001 From: "DESKTOP-GENO133\\IvanPlex" Date: Fri, 9 Feb 2024 09:46:47 -0700 Subject: [PATCH] added post gres backend for user record. --- .../Postgres/UserRecordDataAccess.cs | 197 ++++++++++++++++++ Program.cs | 4 +- 2 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 External/Implementations/Postgres/UserRecordDataAccess.cs diff --git a/External/Implementations/Postgres/UserRecordDataAccess.cs b/External/Implementations/Postgres/UserRecordDataAccess.cs new file mode 100644 index 0000000..219ca5c --- /dev/null +++ b/External/Implementations/Postgres/UserRecordDataAccess.cs @@ -0,0 +1,197 @@ +using CarCareTracker.External.Interfaces; +using CarCareTracker.Models; +using Npgsql; +using System.Net.Mail; +using System.Text.Json; + +namespace CarCareTracker.External.Implementations +{ + public class PGUserRecordDataAccess : IUserRecordDataAccess + { + private NpgsqlConnection pgDataSource; + private readonly ILogger _logger; + private static string tableName = "userrecords"; + public PGUserRecordDataAccess(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, username TEXT not null, emailaddress TEXT not null, password TEXT not null, isadmin BOOLEAN)"; + using (var ctext = new NpgsqlCommand(initCMD, pgDataSource)) + { + ctext.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + } + } + public List GetUsers() + { + try + { + string cmd = $"SELECT id, username, emailaddress, password, isadmin FROM app.{tableName}"; + var results = new List(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + UserData result = new UserData(); + result.Id = int.Parse(reader["id"].ToString()); + result.UserName = reader["username"].ToString(); + result.EmailAddress = reader["emailaddress"].ToString(); + result.Password = reader["password"].ToString(); + result.IsAdmin = bool.Parse(reader["isadmin"].ToString()); + results.Add(result); + } + } + return results; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new List(); + } + } + public UserData GetUserRecordByUserName(string userName) + { + try + { + string cmd = $"SELECT id, username, emailaddress, password, isadmin FROM app.{tableName} WHERE username = @username"; + var result = new UserData(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("username", userName); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + result.Id = int.Parse(reader["id"].ToString()); + result.UserName = reader["username"].ToString(); + result.EmailAddress = reader["emailaddress"].ToString(); + result.Password = reader["password"].ToString(); + result.IsAdmin = bool.Parse(reader["isadmin"].ToString()); + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new UserData(); + } + } + public UserData GetUserRecordByEmailAddress(string emailAddress) + { + try + { + string cmd = $"SELECT id, username, emailaddress, password, isadmin FROM app.{tableName} WHERE emailaddress = @emailaddress"; + var result = new UserData(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("emailaddress", emailAddress); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + result.Id = int.Parse(reader["id"].ToString()); + result.UserName = reader["username"].ToString(); + result.EmailAddress = reader["emailaddress"].ToString(); + result.Password = reader["password"].ToString(); + result.IsAdmin = bool.Parse(reader["isadmin"].ToString()); + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new UserData(); + } + } + public UserData GetUserRecordById(int userId) + { + try + { + string cmd = $"SELECT id, username, emailaddress, password, isadmin FROM app.{tableName} WHERE id = @id"; + var result = new UserData(); + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", userId); + using (NpgsqlDataReader reader = ctext.ExecuteReader()) + while (reader.Read()) + { + result.Id = int.Parse(reader["id"].ToString()); + result.UserName = reader["username"].ToString(); + result.EmailAddress = reader["emailaddress"].ToString(); + result.Password = reader["password"].ToString(); + result.IsAdmin = bool.Parse(reader["isadmin"].ToString()); + } + } + return result; + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return new UserData(); + } + } + public bool SaveUserRecord(UserData userRecord) + { + try + { + if (userRecord.Id == default) + { + string cmd = $"INSERT INTO app.{tableName} (username, emailaddress, password, isadmin) VALUES(@username, @emailaddress, @password, @isadmin) RETURNING id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("username", userRecord.UserName); + ctext.Parameters.AddWithValue("emailaddress", userRecord.EmailAddress); + ctext.Parameters.AddWithValue("password", userRecord.Password); + ctext.Parameters.AddWithValue("isadmin", userRecord.IsAdmin); + userRecord.Id = Convert.ToInt32(ctext.ExecuteScalar()); + return userRecord.Id != default; + } + } + else + { + string cmd = $"UPDATE app.{tableName} SET username = @username, emailaddress = @emailaddress, password = @password, isadmin = @isadmin WHERE id = @id"; + using (var ctext = new NpgsqlCommand(cmd, pgDataSource)) + { + ctext.Parameters.AddWithValue("id", userRecord.Id); + ctext.Parameters.AddWithValue("username", userRecord.UserName); + ctext.Parameters.AddWithValue("emailaddress", userRecord.EmailAddress); + ctext.Parameters.AddWithValue("password", userRecord.Password); + ctext.Parameters.AddWithValue("isadmin", userRecord.IsAdmin); + return ctext.ExecuteNonQuery() > 0; + } + } + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + return false; + } + } + public bool DeleteUserRecord(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; + } + } + } +} \ No newline at end of file diff --git a/Program.cs b/Program.cs index b394c83..a3bd906 100644 --- a/Program.cs +++ b/Program.cs @@ -28,6 +28,7 @@ if (!string.IsNullOrWhiteSpace(builder.Configuration["POSTGRES_CONNECTION"])){ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); } else { @@ -44,9 +45,10 @@ else builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); } -builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton();