added backend for storing extra fields.
This commit is contained in:
@@ -17,18 +17,20 @@ namespace CarCareTracker.Controllers
|
|||||||
private readonly IUserLogic _userLogic;
|
private readonly IUserLogic _userLogic;
|
||||||
private readonly IFileHelper _fileHelper;
|
private readonly IFileHelper _fileHelper;
|
||||||
private readonly IConfigHelper _config;
|
private readonly IConfigHelper _config;
|
||||||
|
private readonly IExtraFieldDataAccess _extraFieldDataAccess;
|
||||||
public HomeController(ILogger<HomeController> logger,
|
public HomeController(ILogger<HomeController> logger,
|
||||||
IVehicleDataAccess dataAccess,
|
IVehicleDataAccess dataAccess,
|
||||||
IUserLogic userLogic,
|
IUserLogic userLogic,
|
||||||
IConfigHelper configuration,
|
IConfigHelper configuration,
|
||||||
IFileHelper fileHelper)
|
IFileHelper fileHelper,
|
||||||
|
IExtraFieldDataAccess extraFieldDataAccess)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_dataAccess = dataAccess;
|
_dataAccess = dataAccess;
|
||||||
_config = configuration;
|
_config = configuration;
|
||||||
_userLogic = userLogic;
|
_userLogic = userLogic;
|
||||||
_fileHelper = fileHelper;
|
_fileHelper = fileHelper;
|
||||||
|
_extraFieldDataAccess = extraFieldDataAccess;
|
||||||
}
|
}
|
||||||
private int GetUserID()
|
private int GetUserID()
|
||||||
{
|
{
|
||||||
@@ -68,7 +70,24 @@ namespace CarCareTracker.Controllers
|
|||||||
{
|
{
|
||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
public IActionResult GetExtraFieldsModal(int importMode = 0)
|
||||||
|
{
|
||||||
|
var recordExtraFields = _extraFieldDataAccess.GetExtraFieldsById(importMode);
|
||||||
|
return PartialView("_ExtraFields", recordExtraFields);
|
||||||
|
}
|
||||||
|
public IActionResult UpdateExtraFields(RecordExtraField record)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = _extraFieldDataAccess.SaveExtraFields(record);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex.Message);
|
||||||
|
}
|
||||||
|
var recordExtraFields = _extraFieldDataAccess.GetExtraFieldsById(record.Id);
|
||||||
|
return PartialView("_ExtraFields", recordExtraFields);
|
||||||
|
}
|
||||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||||
public IActionResult Error()
|
public IActionResult Error()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -52,7 +52,8 @@ namespace CarCareTracker.Controllers
|
|||||||
"CREATE TABLE IF NOT EXISTS app.userrecords (id INT GENERATED BY DEFAULT AS IDENTITY primary key, username TEXT not null, emailaddress TEXT not null, password TEXT not null, isadmin BOOLEAN)",
|
"CREATE TABLE IF NOT EXISTS app.userrecords (id INT GENERATED BY DEFAULT AS IDENTITY primary key, username TEXT not null, emailaddress TEXT not null, password TEXT not null, isadmin BOOLEAN)",
|
||||||
"CREATE TABLE IF NOT EXISTS app.tokenrecords (id INT GENERATED BY DEFAULT AS IDENTITY primary key, body TEXT not null, emailaddress TEXT not null)",
|
"CREATE TABLE IF NOT EXISTS app.tokenrecords (id INT GENERATED BY DEFAULT AS IDENTITY primary key, body TEXT not null, emailaddress TEXT not null)",
|
||||||
"CREATE TABLE IF NOT EXISTS app.userconfigrecords (id INT primary key, data jsonb not null)",
|
"CREATE TABLE IF NOT EXISTS app.userconfigrecords (id INT primary key, data jsonb not null)",
|
||||||
"CREATE TABLE IF NOT EXISTS app.useraccessrecords (userId INT, vehicleId INT, PRIMARY KEY(userId, vehicleId))"
|
"CREATE TABLE IF NOT EXISTS app.useraccessrecords (userId INT, vehicleId INT, PRIMARY KEY(userId, vehicleId))",
|
||||||
|
"CREATE TABLE IF NOT EXISTS app.extrafields (id INT primary key, data jsonb not null)"
|
||||||
};
|
};
|
||||||
foreach(string cmd in cmds)
|
foreach(string cmd in cmds)
|
||||||
{
|
{
|
||||||
@@ -97,6 +98,8 @@ namespace CarCareTracker.Controllers
|
|||||||
var tokenrecords = new List<Token>();
|
var tokenrecords = new List<Token>();
|
||||||
var userconfigrecords = new List<UserConfigData>();
|
var userconfigrecords = new List<UserConfigData>();
|
||||||
var useraccessrecords = new List<UserAccess>();
|
var useraccessrecords = new List<UserAccess>();
|
||||||
|
|
||||||
|
var extrafields = new List<RecordExtraField>();
|
||||||
#region "Part1"
|
#region "Part1"
|
||||||
string cmd = $"SELECT data FROM app.vehicles";
|
string cmd = $"SELECT data FROM app.vehicles";
|
||||||
using (var ctext = pgDataSource.CreateCommand(cmd))
|
using (var ctext = pgDataSource.CreateCommand(cmd))
|
||||||
@@ -396,6 +399,25 @@ namespace CarCareTracker.Controllers
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
#region "Part5"
|
||||||
|
cmd = $"SELECT data FROM app.extrafields";
|
||||||
|
using (var ctext = pgDataSource.CreateCommand(cmd))
|
||||||
|
{
|
||||||
|
using (NpgsqlDataReader reader = ctext.ExecuteReader())
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
extrafields.Add(System.Text.Json.JsonSerializer.Deserialize<RecordExtraField>(reader["data"] as string));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var record in extrafields)
|
||||||
|
{
|
||||||
|
using (var db = new LiteDatabase(fullFileName))
|
||||||
|
{
|
||||||
|
var table = db.GetCollection<RecordExtraField>("extrafields");
|
||||||
|
table.Upsert(record);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
var destFilePath = $"{fullFolderPath}.zip";
|
var destFilePath = $"{fullFolderPath}.zip";
|
||||||
ZipFile.CreateFromDirectory(fullFolderPath, destFilePath);
|
ZipFile.CreateFromDirectory(fullFolderPath, destFilePath);
|
||||||
return Json(new OperationResponse { Success = true, Message = $"/{tempFolder}.zip" });
|
return Json(new OperationResponse { Success = true, Message = $"/{tempFolder}.zip" });
|
||||||
@@ -441,6 +463,8 @@ namespace CarCareTracker.Controllers
|
|||||||
var tokenrecords = new List<Token>();
|
var tokenrecords = new List<Token>();
|
||||||
var userconfigrecords = new List<UserConfigData>();
|
var userconfigrecords = new List<UserConfigData>();
|
||||||
var useraccessrecords = new List<UserAccess>();
|
var useraccessrecords = new List<UserAccess>();
|
||||||
|
|
||||||
|
var extrafields = new List<RecordExtraField>();
|
||||||
#region "Part1"
|
#region "Part1"
|
||||||
using (var db = new LiteDatabase(fullFileName))
|
using (var db = new LiteDatabase(fullFileName))
|
||||||
{
|
{
|
||||||
@@ -704,6 +728,23 @@ namespace CarCareTracker.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
#region "Part5"
|
||||||
|
using (var db = new LiteDatabase(fullFileName))
|
||||||
|
{
|
||||||
|
var table = db.GetCollection<RecordExtraField>("extrafields");
|
||||||
|
extrafields = table.FindAll().ToList();
|
||||||
|
};
|
||||||
|
foreach (var record in extrafields)
|
||||||
|
{
|
||||||
|
string cmd = $"INSERT INTO app.extrafields (id, data) VALUES(@id, CAST(@data AS jsonb))";
|
||||||
|
using (var ctext = pgDataSource.CreateCommand(cmd))
|
||||||
|
{
|
||||||
|
ctext.Parameters.AddWithValue("id", record.Id);
|
||||||
|
ctext.Parameters.AddWithValue("data", System.Text.Json.JsonSerializer.Serialize(record));
|
||||||
|
ctext.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
return Json(new OperationResponse { Success = true, Message = "Data Imported Successfully" });
|
return Json(new OperationResponse { Success = true, Message = "Data Imported Successfully" });
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
30
External/Implementations/Litedb/ExtraFieldDataAccess.cs
vendored
Normal file
30
External/Implementations/Litedb/ExtraFieldDataAccess.cs
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using CarCareTracker.External.Interfaces;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
|
using CarCareTracker.Models;
|
||||||
|
using LiteDB;
|
||||||
|
|
||||||
|
namespace CarCareTracker.External.Implementations
|
||||||
|
{
|
||||||
|
public class ExtraFieldDataAccess: IExtraFieldDataAccess
|
||||||
|
{
|
||||||
|
private static string dbName = StaticHelper.DbName;
|
||||||
|
private static string tableName = "extrafields";
|
||||||
|
public RecordExtraField GetExtraFieldsById(int importMode)
|
||||||
|
{
|
||||||
|
using (var db = new LiteDatabase(dbName))
|
||||||
|
{
|
||||||
|
var table = db.GetCollection<RecordExtraField>(tableName);
|
||||||
|
return table.FindById(importMode) ?? new RecordExtraField();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
public bool SaveExtraFields(RecordExtraField record)
|
||||||
|
{
|
||||||
|
using (var db = new LiteDatabase(dbName))
|
||||||
|
{
|
||||||
|
var table = db.GetCollection<RecordExtraField>(tableName);
|
||||||
|
table.Upsert(record);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
75
External/Implementations/Postgres/ExtraFieldDataAccess.cs
vendored
Normal file
75
External/Implementations/Postgres/ExtraFieldDataAccess.cs
vendored
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
using CarCareTracker.External.Interfaces;
|
||||||
|
using CarCareTracker.Models;
|
||||||
|
using Npgsql;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace CarCareTracker.External.Implementations
|
||||||
|
{
|
||||||
|
public class PGExtraFieldDataAccess : IExtraFieldDataAccess
|
||||||
|
{
|
||||||
|
private NpgsqlDataSource pgDataSource;
|
||||||
|
private readonly ILogger<PGExtraFieldDataAccess> _logger;
|
||||||
|
private static string tableName = "extrafields";
|
||||||
|
public PGExtraFieldDataAccess(IConfiguration config, ILogger<PGExtraFieldDataAccess> logger)
|
||||||
|
{
|
||||||
|
pgDataSource = NpgsqlDataSource.Create(config["POSTGRES_CONNECTION"]);
|
||||||
|
|
||||||
|
_logger = logger;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//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 = pgDataSource.CreateCommand(initCMD))
|
||||||
|
{
|
||||||
|
ctext.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public RecordExtraField GetExtraFieldsById(int importMode)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string cmd = $"SELECT data FROM app.{tableName} WHERE id = @id";
|
||||||
|
var results = new RecordExtraField();
|
||||||
|
using (var ctext = pgDataSource.CreateCommand(cmd))
|
||||||
|
{
|
||||||
|
ctext.Parameters.AddWithValue("id", importMode);
|
||||||
|
using (NpgsqlDataReader reader = ctext.ExecuteReader())
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
RecordExtraField result = JsonSerializer.Deserialize<RecordExtraField>(reader["data"] as string);
|
||||||
|
results = result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex.Message);
|
||||||
|
return new RecordExtraField();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool SaveExtraFields(RecordExtraField record)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string cmd = $"INSERT INTO app.{tableName} (id, data) VALUES(@id, CAST(@data AS jsonb))";
|
||||||
|
using (var ctext = pgDataSource.CreateCommand(cmd))
|
||||||
|
{
|
||||||
|
ctext.Parameters.AddWithValue("id", record.Id);
|
||||||
|
ctext.Parameters.AddWithValue("data", JsonSerializer.Serialize(record));
|
||||||
|
return ctext.ExecuteNonQuery() > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex.Message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
External/Interfaces/IExtraFieldDataAccess.cs
vendored
Normal file
10
External/Interfaces/IExtraFieldDataAccess.cs
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using CarCareTracker.Models;
|
||||||
|
|
||||||
|
namespace CarCareTracker.External.Interfaces
|
||||||
|
{
|
||||||
|
public interface IExtraFieldDataAccess
|
||||||
|
{
|
||||||
|
public RecordExtraField GetExtraFieldsById(int importMode);
|
||||||
|
public bool SaveExtraFields(RecordExtraField record);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Models/RecordExtraField.cs
Normal file
11
Models/RecordExtraField.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
namespace CarCareTracker.Models
|
||||||
|
{
|
||||||
|
public class RecordExtraField
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Corresponds to int value of ImportMode enum
|
||||||
|
/// </summary>
|
||||||
|
public int Id { get; set; }
|
||||||
|
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,6 +31,7 @@ if (!string.IsNullOrWhiteSpace(builder.Configuration["POSTGRES_CONNECTION"])){
|
|||||||
builder.Services.AddSingleton<IUserRecordDataAccess, PGUserRecordDataAccess>();
|
builder.Services.AddSingleton<IUserRecordDataAccess, PGUserRecordDataAccess>();
|
||||||
builder.Services.AddSingleton<ITokenRecordDataAccess, PGTokenRecordDataAccess>();
|
builder.Services.AddSingleton<ITokenRecordDataAccess, PGTokenRecordDataAccess>();
|
||||||
builder.Services.AddSingleton<IUserAccessDataAccess, PGUserAccessDataAccess>();
|
builder.Services.AddSingleton<IUserAccessDataAccess, PGUserAccessDataAccess>();
|
||||||
|
builder.Services.AddSingleton<IExtraFieldDataAccess, PGExtraFieldDataAccess>();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -50,6 +51,7 @@ else
|
|||||||
builder.Services.AddSingleton<IUserRecordDataAccess, UserRecordDataAccess>();
|
builder.Services.AddSingleton<IUserRecordDataAccess, UserRecordDataAccess>();
|
||||||
builder.Services.AddSingleton<ITokenRecordDataAccess, TokenRecordDataAccess>();
|
builder.Services.AddSingleton<ITokenRecordDataAccess, TokenRecordDataAccess>();
|
||||||
builder.Services.AddSingleton<IUserAccessDataAccess, UserAccessDataAccess>();
|
builder.Services.AddSingleton<IUserAccessDataAccess, UserAccessDataAccess>();
|
||||||
|
builder.Services.AddSingleton<IExtraFieldDataAccess, ExtraFieldDataAccess>();
|
||||||
}
|
}
|
||||||
|
|
||||||
//configure helpers
|
//configure helpers
|
||||||
|
|||||||
Reference in New Issue
Block a user