lubelog/External/Implementations/Postgres/InspectionRecordTemplateDataAccess.cs
2025-10-31 11:25:31 -06:00

161 lines
6.9 KiB
C#

using CarCareTracker.External.Interfaces;
using CarCareTracker.Models;
using Npgsql;
using System.Text.Json;
namespace CarCareTracker.External.Implementations
{
public class PGInspectionRecordTemplateDataAccess : IInspectionRecordTemplateDataAccess
{
private NpgsqlDataSource pgDataSource;
private readonly ILogger<PGInspectionRecordTemplateDataAccess> _logger;
private static string tableName = "inspectionrecordtemplates";
public PGInspectionRecordTemplateDataAccess(IConfiguration config, ILogger<PGInspectionRecordTemplateDataAccess> logger)
{
pgDataSource = NpgsqlDataSource.Create(config["POSTGRES_CONNECTION"]);
_logger = logger;
try
{
//create table if not exist.
string initCMD = $"CREATE SCHEMA IF NOT EXISTS app; CREATE TABLE IF NOT EXISTS app.{tableName} (id INT GENERATED BY DEFAULT AS IDENTITY primary key, vehicleId INT not null, data jsonb not null)";
using (var ctext = pgDataSource.CreateCommand(initCMD))
{
ctext.ExecuteNonQuery();
}
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
}
}
public List<InspectionRecordInput> GetInspectionRecordTemplatesByVehicleId(int vehicleId)
{
try
{
string cmd = $"SELECT data FROM app.{tableName} WHERE vehicleId = @vehicleId";
var results = new List<InspectionRecordInput>();
using (var ctext = pgDataSource.CreateCommand(cmd))
{
ctext.Parameters.AddWithValue("vehicleId", vehicleId);
using (NpgsqlDataReader reader = ctext.ExecuteReader())
while (reader.Read())
{
InspectionRecordInput inspectionRecord = JsonSerializer.Deserialize<InspectionRecordInput>(reader["data"] as string);
results.Add(inspectionRecord);
}
}
return results;
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
return new List<InspectionRecordInput>();
}
}
public InspectionRecordInput GetInspectionRecordTemplateById(int inspectionRecordTemplateId)
{
try
{
string cmd = $"SELECT data FROM app.{tableName} WHERE id = @id";
var result = new InspectionRecordInput();
using (var ctext = pgDataSource.CreateCommand(cmd))
{
ctext.Parameters.AddWithValue("id", inspectionRecordTemplateId);
using (NpgsqlDataReader reader = ctext.ExecuteReader())
while (reader.Read())
{
InspectionRecordInput inspectionRecord = JsonSerializer.Deserialize<InspectionRecordInput>(reader["data"] as string);
result = inspectionRecord;
}
}
return result;
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
return new InspectionRecordInput();
}
}
public bool DeleteInspectionRecordTemplateById(int inspectionRecordTemplateId)
{
try
{
string cmd = $"DELETE FROM app.{tableName} WHERE id = @id";
using (var ctext = pgDataSource.CreateCommand(cmd))
{
ctext.Parameters.AddWithValue("id", inspectionRecordTemplateId);
return ctext.ExecuteNonQuery() > 0;
}
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
return false;
}
}
public bool SaveInspectionReportTemplateToVehicle(InspectionRecordInput inspectionRecordTemplate)
{
try
{
if (inspectionRecordTemplate.Id == default)
{
string cmd = $"INSERT INTO app.{tableName} (vehicleId, data) VALUES(@vehicleId, CAST(@data AS jsonb)) RETURNING id";
using (var ctext = pgDataSource.CreateCommand(cmd))
{
ctext.Parameters.AddWithValue("vehicleId", inspectionRecordTemplate.VehicleId);
ctext.Parameters.AddWithValue("data", "{}");
inspectionRecordTemplate.Id = Convert.ToInt32(ctext.ExecuteScalar());
//update json data
if (inspectionRecordTemplate.Id != default)
{
string cmdU = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id";
using (var ctextU = pgDataSource.CreateCommand(cmdU))
{
var serializedData = JsonSerializer.Serialize(inspectionRecordTemplate);
ctextU.Parameters.AddWithValue("id", inspectionRecordTemplate.Id);
ctextU.Parameters.AddWithValue("data", serializedData);
return ctextU.ExecuteNonQuery() > 0;
}
}
return inspectionRecordTemplate.Id != default;
}
}
else
{
string cmd = $"UPDATE app.{tableName} SET data = CAST(@data AS jsonb) WHERE id = @id";
using (var ctext = pgDataSource.CreateCommand(cmd))
{
var serializedData = JsonSerializer.Serialize(inspectionRecordTemplate);
ctext.Parameters.AddWithValue("id", inspectionRecordTemplate.Id);
ctext.Parameters.AddWithValue("data", serializedData);
return ctext.ExecuteNonQuery() > 0;
}
}
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
return false;
}
}
public bool DeleteAllInspectionReportTemplatesByVehicleId(int vehicleId)
{
try
{
string cmd = $"DELETE FROM app.{tableName} WHERE vehicleId = @id";
using (var ctext = pgDataSource.CreateCommand(cmd))
{
ctext.Parameters.AddWithValue("id", vehicleId);
ctext.ExecuteNonQuery();
return true;
}
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
return false;
}
}
}
}