diff --git a/Workshop/Program.cs b/Workshop/Program.cs
index 7337a0e..abc4cda 100644
--- a/Workshop/Program.cs
+++ b/Workshop/Program.cs
@@ -1,11 +1,18 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+using Serilog;
using Unity;
using Unity.Lifetime;
+using Unity.Microsoft.Logging;
using Workshop.Repositories;
using Workshop.Repositories.Implementations;
namespace Workshop
{
internal static class Program
{
+ //TODO: 1. , sql ?
+ //TODO: 2. - ?
+ //TODO: 3. Update
///
/// The main entry point for the application.
///
@@ -20,12 +27,26 @@ namespace Workshop
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
+ container.AddExtension(new LoggingExtension(CreateLoggerFactory()));
container.RegisterType(new TransientLifetimeManager());
container.RegisterType(new TransientLifetimeManager());
container.RegisterType(new TransientLifetimeManager());
container.RegisterType(new TransientLifetimeManager());
container.RegisterType(new TransientLifetimeManager());
+ container.RegisterType(new SingletonLifetimeManager());
+
return container;
}
+ private static LoggerFactory CreateLoggerFactory()
+ {
+ var loggerFactory = new LoggerFactory();
+ loggerFactory.AddSerilog(new LoggerConfiguration()
+ .ReadFrom.Configuration(new ConfigurationBuilder()
+ .SetBasePath(Directory.GetCurrentDirectory())
+ .AddJsonFile("appsetings.json")
+ .Build())
+ .CreateLogger());
+ return loggerFactory;
+ }
}
}
\ No newline at end of file
diff --git a/Workshop/Repositories/IChequeRepository.cs b/Workshop/Repositories/IChequeRepository.cs
index 0da2c72..6ed982b 100644
--- a/Workshop/Repositories/IChequeRepository.cs
+++ b/Workshop/Repositories/IChequeRepository.cs
@@ -11,5 +11,4 @@ public interface IChequeRepository
{
IEnumerable ReadCheques(DateTime? dateFrom = null, DateTime? dateTo = null, int? chequeId = null);
void CreateCheque(Cheque cheque);
- void DeleteCheque(int id);
}
diff --git a/Workshop/Repositories/IConnectionString.cs b/Workshop/Repositories/IConnectionString.cs
new file mode 100644
index 0000000..1805094
--- /dev/null
+++ b/Workshop/Repositories/IConnectionString.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Workshop.Repositories;
+
+public interface IConnectionString
+{
+ public string ConnectionString { get; }
+}
diff --git a/Workshop/Repositories/Implementations/ChequeRepository.cs b/Workshop/Repositories/Implementations/ChequeRepository.cs
index fda192f..5453fbe 100644
--- a/Workshop/Repositories/Implementations/ChequeRepository.cs
+++ b/Workshop/Repositories/Implementations/ChequeRepository.cs
@@ -1,5 +1,10 @@
-using System;
+using Dapper;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+using Npgsql;
+using System;
using System.Collections.Generic;
+using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -10,16 +15,54 @@ namespace Workshop.Repositories.Implementations;
internal class ChequeRepository : IChequeRepository
{
+ private readonly IConnectionString _connectionString;
+ private readonly ILogger _logger;
+
+ public ChequeRepository(IConnectionString connectionString, ILogger logger)
+ {
+ _connectionString = connectionString;
+ _logger = logger;
+ }
public void CreateCheque(Cheque cheque)
{
- }
-
- public void DeleteCheque(int id)
- {
+ _logger.LogInformation("Добавление объекта");
+ _logger.LogDebug("Объект: {json}",
+JsonConvert.SerializeObject(cheque));
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ connection.Open();
+ using var transaction = connection.BeginTransaction();
+ var queryInsert = @"";
+ var chequeId = connection.QueryFirst(queryInsert, cheque, transaction);
+ var querySubInsert = @"";
+ foreach (var elem in cheque.ChequeProduct)
+ {
+ connection.Execute(querySubInsert, new {chequeId, elem.ProductId, elem.Amount});
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при добавлении объекта");
+ throw;
+ }
}
public IEnumerable ReadCheques(DateTime? dateFrom = null, DateTime? dateTo = null, int? chequeId = null)
{
- return [];
+ _logger.LogInformation("Получение всех объектов");
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = "";
+ var productCreatings = connection.Query(querySelect);
+ _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(productCreatings));
+ return productCreatings;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при чтении объектов");
+ throw;
+ }
}
}
diff --git a/Workshop/Repositories/Implementations/ConnectionString.cs b/Workshop/Repositories/Implementations/ConnectionString.cs
new file mode 100644
index 0000000..5ebf385
--- /dev/null
+++ b/Workshop/Repositories/Implementations/ConnectionString.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Workshop.Repositories.Implementations;
+
+
+public class ConnectionString : IConnectionString
+{
+ string IConnectionString.ConnectionString => "Server=localhost;Port=5432;Database=grishazagidulin;User Id=grishazagidulin;Password=;";
+}
diff --git a/Workshop/Repositories/Implementations/MasterRepository.cs b/Workshop/Repositories/Implementations/MasterRepository.cs
index 7b6f2ea..a7cf357 100644
--- a/Workshop/Repositories/Implementations/MasterRepository.cs
+++ b/Workshop/Repositories/Implementations/MasterRepository.cs
@@ -1,5 +1,10 @@
-using System;
+using Dapper;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+using Npgsql;
+using System;
using System.Collections.Generic;
+using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -10,25 +15,103 @@ namespace Workshop.Repositories.Implementations;
internal class MasterRepository : IMasterRepository
{
- public void CreateMaster(Master Master)
+ private readonly IConnectionString _connectionString;
+ private readonly ILogger _logger;
+
+ public MasterRepository(IConnectionString connectionString, ILogger logger)
{
+ _connectionString = connectionString;
+ _logger = logger;
+ }
+ public void CreateMaster(Master master)
+ {
+ _logger.LogInformation("Добавление объекта");
+ _logger.LogDebug("Объект: {json}",
+ JsonConvert.SerializeObject(master));
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var queryInsert = @"";
+ connection.Execute(queryInsert, master);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при добавлении объекта");
+ throw;
+ }
}
public void DeleteMaster(int id)
{
+ _logger.LogInformation("Удаление объекта");
+ _logger.LogDebug("Объект: {id}", id);
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var queryDelete = @"";
+ connection.Execute(queryDelete, new { id });
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при удалении объекта");
+ throw;
+ }
}
public Master ReadMasterById(int id)
{
- return Master.CreateEntity(0, string.Empty, string.Empty, 0, Entities.Enums.MasterPosition.None);
+ _logger.LogInformation("Получение объекта по идентификатору");
+ _logger.LogDebug("Объект: {id}", id);
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = @"";
+ var master = connection.QueryFirst(querySelect, new { id });
+ _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(master));
+ return master;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при поиске объекта");
+ throw;
+ }
}
public IEnumerable ReadMasters()
{
- return [];
+ _logger.LogInformation("Получение всех объектов");
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = "";
+ var masters = connection.Query(querySelect);
+ _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(masters));
+ return masters;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при чтении объектов");
+ throw;
+
+ }
}
- public void UpdateMaster(Master Master)
+ public void UpdateMaster(Master master)
{
+ _logger.LogInformation("Редактирование объекта");
+ _logger.LogDebug("Объект: {json}",
+ JsonConvert.SerializeObject(master));
+ try
+ {
+ using var connection = new
+ NpgsqlConnection(_connectionString.ConnectionString);
+ var queryUpdate = @"";
+ connection.Execute(queryUpdate, master);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при редактировании объекта");
+ throw;
+ }
}
}
diff --git a/Workshop/Repositories/Implementations/MaterialRepository.cs b/Workshop/Repositories/Implementations/MaterialRepository.cs
index ba9f8b1..7e3d4a5 100644
--- a/Workshop/Repositories/Implementations/MaterialRepository.cs
+++ b/Workshop/Repositories/Implementations/MaterialRepository.cs
@@ -1,5 +1,10 @@
-using System;
+using Dapper;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+using Npgsql;
+using System;
using System.Collections.Generic;
+using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -10,25 +15,103 @@ namespace Workshop.Repositories.Implementations;
internal class MaterialRepository : IMaterialRepository
{
- public void CreateMaterial(Material Material)
+ private readonly IConnectionString _connectionString;
+ private readonly ILogger _logger;
+
+ public MaterialRepository(IConnectionString connectionString, ILogger logger)
{
+ _connectionString = connectionString;
+ _logger = logger;
+ }
+ public void CreateMaterial(Material material)
+ {
+ _logger.LogInformation("Добавление объекта");
+ _logger.LogDebug("Объект: {json}",
+ JsonConvert.SerializeObject(material));
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var queryInsert = @"";
+ connection.Execute(queryInsert, material);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при добавлении объекта");
+ throw;
+ }
}
public void DeleteMaterial(int id)
{
+ _logger.LogInformation("Удаление объекта");
+ _logger.LogDebug("Объект: {id}", id);
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var queryDelete = @"";
+ connection.Execute(queryDelete, new { id });
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при удалении объекта");
+ throw;
+ }
}
public Material ReadMaterialById(int id)
{
- return Material.CreateEntity(0, string.Empty, 0, 0);
+ _logger.LogInformation("Получение объекта по идентификатору");
+ _logger.LogDebug("Объект: {id}", id);
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = @"";
+ var material = connection.QueryFirst(querySelect, new { id });
+ _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(material));
+ return material;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при поиске объекта");
+ throw;
+ }
}
public IEnumerable ReadMaterials()
{
- return [];
+ _logger.LogInformation("Получение всех объектов");
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = "";
+ var materials = connection.Query (querySelect);
+ _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(materials));
+ return materials;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при чтении объектов");
+ throw;
+
+ }
}
- public void UpdateMaterial(Material Material)
+ public void UpdateMaterial(Material material)
{
+ _logger.LogInformation("Редактирование объекта");
+ _logger.LogDebug("Объект: {json}",
+ JsonConvert.SerializeObject(material));
+ try
+ {
+ using var connection = new
+ NpgsqlConnection(_connectionString.ConnectionString);
+ var queryUpdate = @"";
+ connection.Execute(queryUpdate, material);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при редактировании объекта");
+ throw;
+ }
}
}
diff --git a/Workshop/Repositories/Implementations/ProductCreateRepository.cs b/Workshop/Repositories/Implementations/ProductCreateRepository.cs
index 2d1d094..95da4e0 100644
--- a/Workshop/Repositories/Implementations/ProductCreateRepository.cs
+++ b/Workshop/Repositories/Implementations/ProductCreateRepository.cs
@@ -1,5 +1,10 @@
-using System;
+using Dapper;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+using Npgsql;
+using System;
using System.Collections.Generic;
+using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -10,16 +15,65 @@ namespace Workshop.Repositories.Implementations;
internal class ProductCreateRepository : IProductCreateRepository
{
+ private readonly IConnectionString _connectionString;
+ private readonly ILogger _logger;
+
+ public ProductCreateRepository(IConnectionString connectionString, ILogger logger)
+ {
+ _connectionString = connectionString;
+ _logger = logger;
+ }
public void CreateProductCreate(ProductCreate productCreate)
{
+ _logger.LogInformation("Добавление объекта");
+ _logger.LogDebug("Объект: {json}",
+JsonConvert.SerializeObject(productCreate));
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var queryInsert = @"";
+ connection.Execute(queryInsert, productCreate);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при добавлении объекта");
+ throw;
+ }
}
public void DeleteProductCreate(int id)
{
+ _logger.LogInformation("Удаление объекта");
+ _logger.LogDebug("Объект: {id}", id);
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var queryDelete = @"";
+ connection.Execute(queryDelete, new { id });
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при удалении объекта");
+ throw;
+ }
}
public IEnumerable ReadProductCreates(DateTime? dateFrom = null, DateTime? dateTo = null, int? productId = null, int? masterId = null)
{
- return [];
+ _logger.LogInformation("Получение всех объектов");
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = "";
+ var productCreatings = connection.Query(querySelect);
+ _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(productCreatings));
+ return productCreatings;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при чтении объектов");
+ throw;
+
+ }
}
}
diff --git a/Workshop/Repositories/Implementations/ProductRepository.cs b/Workshop/Repositories/Implementations/ProductRepository.cs
index 492f597..b44feab 100644
--- a/Workshop/Repositories/Implementations/ProductRepository.cs
+++ b/Workshop/Repositories/Implementations/ProductRepository.cs
@@ -1,33 +1,124 @@
-using System;
+using Dapper;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+using Npgsql;
+using System;
using System.Collections.Generic;
+using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using Workshop.Entities;
using Workshop.Repositories;
namespace Workshop.Repositories.Implementations;
internal class ProductRepository : IProductRepository
{
+ private readonly IConnectionString _connectionString;
+ private readonly ILogger _logger;
+
+ public ProductRepository(IConnectionString connectionString, ILogger logger)
+ {
+ _connectionString = connectionString;
+ _logger = logger;
+ }
public void CreateProduct(Product product)
{
+ _logger.LogInformation("Добавление объекта");
+ _logger.LogDebug("Объект: {json}",
+JsonConvert.SerializeObject(product));
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ connection.Open();
+ using var transaction = connection.BeginTransaction();
+ var queryInsert = @"";
+ var productId = connection.QueryFirst(queryInsert, product, transaction);
+ var querySubInsert = @"";
+ foreach (var elem in product.Materials)
+ {
+ connection.Execute(querySubInsert, new { productId, elem.ProductId, elem.Count });
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при добавлении объекта");
+ throw;
+ }
}
public void DeleteProduct(int id)
{
+ _logger.LogInformation("Удаление объекта");
+ _logger.LogDebug("Объект: {id}", id);
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var queryDelete = @"";
+ connection.Execute(queryDelete, new { id });
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при удалении объекта");
+ throw;
+ }
}
+
public Product ReadProductById(int id)
{
- return Product.CreateEntity(0, string.Empty, 0, 0, Entities.Enums.ProductCategory.None, []);
+ _logger.LogInformation("Получение объекта по идентификатору");
+ _logger.LogDebug("Объект: {id}", id);
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = @"";
+ var product = connection.QueryFirst(querySelect, new { id });
+ _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(product));
+ return product;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при поиске объекта");
+ throw;
+ }
}
public IEnumerable ReadProducts()
{
- return [];
+ _logger.LogInformation("Получение всех объектов");
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = "";
+ var products = connection.Query(querySelect);
+ _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(products));
+ return products;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при чтении объектов");
+ throw;
+ }
+
}
- public void UpdateProduct(Product product)
+ public void UpdateProduct(Product product) //TODO: Спросить про реализацию Update со связью МкМ
{
+ _logger.LogInformation("Редактирование объекта");
+ _logger.LogDebug("Объект: {json}",
+ JsonConvert.SerializeObject(product));
+ try
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var queryUpdate = @"";
+ connection.Execute(queryUpdate, product);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при редактировании объекта");
+ throw;
+ }
}
}
diff --git a/Workshop/Workshop.csproj b/Workshop/Workshop.csproj
index accbdf0..7c6a178 100644
--- a/Workshop/Workshop.csproj
+++ b/Workshop/Workshop.csproj
@@ -9,7 +9,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -27,4 +39,10 @@
+
+
+ PreserveNewest
+
+
+
\ No newline at end of file
diff --git a/Workshop/appsetings.json b/Workshop/appsetings.json
new file mode 100644
index 0000000..896603a
--- /dev/null
+++ b/Workshop/appsetings.json
@@ -0,0 +1,15 @@
+{
+ "Serilog": {
+ "Using": [ "Serilog.Sinks.File" ],
+ "MinimumLevel": "Debug",
+ "WriteTo": [
+ {
+ "Name": "File",
+ "Args": {
+ "path": "Logs/log.txt",
+ "rollingInterval": "Day"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file