diff --git a/DBPatch/sqlScripts/SystemX.DB.CPMeta_Create.sql b/DBPatch/sqlScripts/SystemX.DB.CPMeta_Create.sql index 1ae9811..8b21993 100644 --- a/DBPatch/sqlScripts/SystemX.DB.CPMeta_Create.sql +++ b/DBPatch/sqlScripts/SystemX.DB.CPMeta_Create.sql @@ -248,14 +248,16 @@ PRINT N'테이블 [dbo].[tWbms]을(를) 만드는 중...'; GO CREATE TABLE [dbo].[tWbms] ( - [cProductID] NVARCHAR (50) NOT NULL, - [cMacAddress] NVARCHAR (50) NULL, - [cType] NVARCHAR (20) NULL, - [cProductNo] NVARCHAR (50) NULL, - [cSpareValue] NVARCHAR (200) NULL, - [cDateTime] DATETIME2 (7) NOT NULL, + [cProductID] NVARCHAR (50) NOT NULL, + [cMacAddress1] NVARCHAR (50) NULL, + [cMacAddress2] NVARCHAR (50) NULL, + [cType] NVARCHAR (20) NULL, + [cProductNo] NVARCHAR (50) NULL, + [cSpareValue] NVARCHAR (200) NULL, + [cDateTime] DATETIME2 (7) NOT NULL, CONSTRAINT [PK_cProductKey] PRIMARY KEY CLUSTERED ([cProductID] ASC), - CONSTRAINT [UQ_cMacAddress] UNIQUE NONCLUSTERED ([cMacAddress] ASC) + CONSTRAINT [UQ_cMacAddress1] UNIQUE NONCLUSTERED ([cMacAddress1] ASC), + CONSTRAINT [UQ_cMacAddress2] UNIQUE NONCLUSTERED ([cMacAddress2] ASC) ); diff --git a/DBPatch/sqlScripts/SystemX.DB.CPMeta_Update.sql b/DBPatch/sqlScripts/SystemX.DB.CPMeta_Update.sql index fc91ec7..173896d 100644 --- a/DBPatch/sqlScripts/SystemX.DB.CPMeta_Update.sql +++ b/DBPatch/sqlScripts/SystemX.DB.CPMeta_Update.sql @@ -43,19 +43,70 @@ USE [$(DatabaseName)]; GO /* -테이블 [dbo].[tWbmsMeta]의 열 [[dbo].[tWbmsMeta].[ctest]]을(를) 추가해야 하지만 해당 열에 기본값이 없으며 NULL 값을 허용하지 않습니다. 테이블에 데이터가 있으면 ALTER 스크립트가 실행되지 않습니다. 이러한 문제를 방지하려면 열에 기본값을 추가 및 해당 열을 NULL 값을 허용하도록 표시하거나 스마트 기본값을 배포 옵션으로서 생성할 수 있도록 하십시오. +[dbo].[tWbms].[cMacAddress] 열이 삭제되므로 데이터 손실이 발생할 수 있습니다. */ -IF EXISTS (select top 1 1 from [dbo].[tWbmsMeta]) +IF EXISTS (select top 1 1 from [dbo].[tWbms]) RAISERROR (N'행이 발견되었습니다. 데이터가 손실될 수 있으므로 스키마 업데이트가 종료됩니다.', 16, 127) WITH NOWAIT GO -PRINT N'테이블 [dbo].[tWbmsMeta]을(를) 변경하는 중...'; +PRINT N'UNIQUE 제약 조건 [dbo].[UQ_cMacAddress]을(를) 삭제하는 중...'; GO -ALTER TABLE [dbo].[tWbmsMeta] - ADD [ctest] DATETIME2 (7) NOT NULL; +ALTER TABLE [dbo].[tWbms] DROP CONSTRAINT [UQ_cMacAddress]; + + +GO +PRINT N'[dbo].[tWbms] 테이블 다시 빌드 시작...'; + + +GO +BEGIN TRANSACTION; + +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; + +SET XACT_ABORT ON; + +CREATE TABLE [dbo].[tmp_ms_xx_tWbms] ( + [cProductID] NVARCHAR (50) NOT NULL, + [cMacAddress1] NVARCHAR (50) NULL, + [cMacAddress2] NVARCHAR (50) NULL, + [cType] NVARCHAR (20) NULL, + [cProductNo] NVARCHAR (50) NULL, + [cSpareValue] NVARCHAR (200) NULL, + [cDateTime] DATETIME2 (7) NOT NULL, + CONSTRAINT [tmp_ms_xx_constraint_PK_cProductKey1] PRIMARY KEY CLUSTERED ([cProductID] ASC), + CONSTRAINT [tmp_ms_xx_constraint_UQ_cMacAddress11] UNIQUE NONCLUSTERED ([cMacAddress1] ASC), + CONSTRAINT [tmp_ms_xx_constraint_UQ_cMacAddress21] UNIQUE NONCLUSTERED ([cMacAddress2] ASC) +); + +IF EXISTS (SELECT TOP 1 1 + FROM [dbo].[tWbms]) + BEGIN + INSERT INTO [dbo].[tmp_ms_xx_tWbms] ([cProductID], [cType], [cProductNo], [cSpareValue], [cDateTime]) + SELECT [cProductID], + [cType], + [cProductNo], + [cSpareValue], + [cDateTime] + FROM [dbo].[tWbms] + ORDER BY [cProductID] ASC; + END + +DROP TABLE [dbo].[tWbms]; + +EXECUTE sp_rename N'[dbo].[tmp_ms_xx_tWbms]', N'tWbms'; + +EXECUTE sp_rename N'[dbo].[tmp_ms_xx_constraint_PK_cProductKey1]', N'PK_cProductKey', N'OBJECT'; + +EXECUTE sp_rename N'[dbo].[tmp_ms_xx_constraint_UQ_cMacAddress11]', N'UQ_cMacAddress1', N'OBJECT'; + +EXECUTE sp_rename N'[dbo].[tmp_ms_xx_constraint_UQ_cMacAddress21]', N'UQ_cMacAddress2', N'OBJECT'; + +COMMIT TRANSACTION; + +SET TRANSACTION ISOLATION LEVEL READ COMMITTED; GO diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPMeta.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPMeta.dacpac index d3db354..1380e40 100644 Binary files a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPMeta.dacpac and b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPMeta.dacpac differ diff --git a/Projects/Config/WebApi.Project.UniqueKeyApi.Config.json b/Projects/Config/WebApi.Project.UniqueKeyApi.Config.json index dcb8df7..6098926 100644 --- a/Projects/Config/WebApi.Project.UniqueKeyApi.Config.json +++ b/Projects/Config/WebApi.Project.UniqueKeyApi.Config.json @@ -13,18 +13,18 @@ { "IP": "127.0.0.1", "Port": 1433, - "DBName": "UniqueKeyDB", + "DBName": "CPMeta", "DBID": 1, - "UserID": "SystemX", - "Password": "X" + "UserID": "Alis", + "Password": "Kefico!@34" }, { "IP": "127.0.0.1", "Port": 1433, - "DBName": "UniqueKeyDB_DEV", + "DBName": "CPMeta_DEV", "DBID": 2, - "UserID": "SystemX", - "Password": "X" + "UserID": "Alis", + "Password": "Kefico!@34" } ] } \ No newline at end of file diff --git a/Projects/DLL/SystemX.Core.DB.dll b/Projects/DLL/SystemX.Core.DB.dll index 0c35936..9575ca7 100644 Binary files a/Projects/DLL/SystemX.Core.DB.dll and b/Projects/DLL/SystemX.Core.DB.dll differ diff --git a/Projects/SystemX.Core/DB/SystemX.DB.CPMeta/SystemX.DB.CPMeta.sqlproj b/Projects/SystemX.Core/DB/SystemX.DB.CPMeta/SystemX.DB.CPMeta.sqlproj index 1683211..bf1df78 100644 --- a/Projects/SystemX.Core/DB/SystemX.DB.CPMeta/SystemX.DB.CPMeta.sqlproj +++ b/Projects/SystemX.Core/DB/SystemX.DB.CPMeta/SystemX.DB.CPMeta.sqlproj @@ -58,9 +58,10 @@ + - + xcopy /y $(ProjectDir)$(OutputPath)$(TargetName)_Create.sql $(SolutionDir)..\..\DBPatch\sqlScripts\ diff --git a/Projects/SystemX.Core/DB/SystemX.DB.CPMeta/dbo/tWbmsMeta.sql b/Projects/SystemX.Core/DB/SystemX.DB.CPMeta/dbo/Tables/tWbmsMeta.sql similarity index 59% rename from Projects/SystemX.Core/DB/SystemX.DB.CPMeta/dbo/tWbmsMeta.sql rename to Projects/SystemX.Core/DB/SystemX.DB.CPMeta/dbo/Tables/tWbmsMeta.sql index a4b2495..579ac79 100644 --- a/Projects/SystemX.Core/DB/SystemX.DB.CPMeta/dbo/tWbmsMeta.sql +++ b/Projects/SystemX.Core/DB/SystemX.DB.CPMeta/dbo/Tables/tWbmsMeta.sql @@ -1,7 +1,8 @@ CREATE TABLE [dbo].[tWbms] ( [cProductID] NVARCHAR(50) NOT NULL, - [cMacAddress] NVARCHAR(50) NULL, + [cMacAddress1] NVARCHAR(50) NULL, + [cMacAddress2] NVARCHAR(50) NULL, [cType] NVARCHAR(20) NULL, [cProductNo] NVARCHAR(50) NULL, @@ -9,5 +10,6 @@ [cDateTime] DATETIME2 NOT NULL, CONSTRAINT PK_cProductKey PRIMARY KEY (cProductID), - CONSTRAINT UQ_cMacAddress UNIQUE (cMacAddress), + CONSTRAINT UQ_cMacAddress1 UNIQUE (cMacAddress1), + CONSTRAINT UQ_cMacAddress2 UNIQUE (cMacAddress2), ) diff --git a/Projects/SystemX.Core/SystemX.Core.DB/CPMeta/Context/CPMetaContext.cs b/Projects/SystemX.Core/SystemX.Core.DB/CPMeta/Context/CPMetaContext.cs index f6d1941..8e62159 100644 --- a/Projects/SystemX.Core/SystemX.Core.DB/CPMeta/Context/CPMetaContext.cs +++ b/Projects/SystemX.Core/SystemX.Core.DB/CPMeta/Context/CPMetaContext.cs @@ -21,10 +21,13 @@ public partial class CPMetaContext : DbContext { entity.HasKey(e => e.cProductID).HasName("PK_cProductKey"); - entity.HasIndex(e => e.cMacAddress, "UQ_cMacAddress").IsUnique(); + entity.HasIndex(e => e.cMacAddress1, "UQ_cMacAddress1").IsUnique(); + + entity.HasIndex(e => e.cMacAddress2, "UQ_cMacAddress2").IsUnique(); entity.Property(e => e.cProductID).HasMaxLength(50); - entity.Property(e => e.cMacAddress).HasMaxLength(50); + entity.Property(e => e.cMacAddress1).HasMaxLength(50); + entity.Property(e => e.cMacAddress2).HasMaxLength(50); entity.Property(e => e.cProductNo).HasMaxLength(50); entity.Property(e => e.cSpareValue).HasMaxLength(200); entity.Property(e => e.cType).HasMaxLength(20); diff --git a/Projects/SystemX.Core/SystemX.Core.DB/CPMeta/Tables/tWbms.cs b/Projects/SystemX.Core/SystemX.Core.DB/CPMeta/Tables/tWbms.cs index 3264af9..7bbfba6 100644 --- a/Projects/SystemX.Core/SystemX.Core.DB/CPMeta/Tables/tWbms.cs +++ b/Projects/SystemX.Core/SystemX.Core.DB/CPMeta/Tables/tWbms.cs @@ -7,7 +7,9 @@ public partial class tWbms { public string cProductID { get; set; } = null!; - public string? cMacAddress { get; set; } + public string? cMacAddress1 { get; set; } + + public string? cMacAddress2 { get; set; } public string? cType { get; set; } diff --git a/Projects/WebApi/AuthApi/Services/AuthService.cs b/Projects/WebApi/AuthApi/Services/AuthService.cs index cabda8f..46f1a3a 100644 --- a/Projects/WebApi/AuthApi/Services/AuthService.cs +++ b/Projects/WebApi/AuthApi/Services/AuthService.cs @@ -264,7 +264,7 @@ namespace AuthApi.Services private AccountDBContext? GetAccountDBContext(DbContextProvider provider, int dbID) { var connectionString = _configService?.GetConfig()?.DataBase?.Find(x => x.DBID == dbID); - return provider?.GetDBContext($"{connectionString?.DBName}"); + return provider?.GetDBContext(Convert.ToInt32(connectionString?.DBID)); } } } diff --git a/Projects/WebApi/WebApi.Library/Enums/WebApiResult.cs b/Projects/WebApi/WebApi.Library/Enums/WebApiResult.cs index 876dc9f..4ee4887 100644 --- a/Projects/WebApi/WebApi.Library/Enums/WebApiResult.cs +++ b/Projects/WebApi/WebApi.Library/Enums/WebApiResult.cs @@ -10,5 +10,6 @@ namespace WebApi.Library.Enums { Success = 1, Failed = 2, + Update = 3, } } diff --git a/Projects/WebApi/WebApi.Project.UniqueKeyApi/Controllers/CPMetaController.cs b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Controllers/CPMetaController.cs new file mode 100644 index 0000000..7ca580b --- /dev/null +++ b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Controllers/CPMetaController.cs @@ -0,0 +1,70 @@ +using Microsoft.AspNetCore.Mvc; +using SystemX.Core.Controller; +using WebApi.Project.UniqueKeyApi.Models; +using WebApi.Project.UniqueKeyApi.Services; + +namespace WebApi.Project.UniqueKeyApi.Controllers +{ + [ApiController] + [Route("[controller]/[action]")] + + public class CPMetaController : CommonController + { + private readonly CPMetaService _cpMetaService; + + public CPMetaController(IServiceProvider serviceProvider, IHttpContextAccessor httpContextAccessor, CPMetaService cpMetaService) + : base(serviceProvider, httpContextAccessor) + { + _cpMetaService = cpMetaService; + } + + [HttpGet("health")] + public async Task Health() + { + LogXnet.WriteLine($"[{GetRequestMethod()}:{GetMethodName()}] [Client IP:{GetClientIP()}] [RequestUrl:{GetRequestUrl()}]{Environment.NewLine}", LogXLabel.CONTROLLER); + + await Task.CompletedTask; + return Results.Ok("Healthy"); + } + + + [HttpPost] + public async Task SetWbmsMeta([FromBody]Request_SetWbmsMeta request) + { + Guid guid = Guid.NewGuid(); + LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} {request.ToJson()}", LogXLabel.CONTROLLER); + + Response_SetWbmsMeta response = await _cpMetaService.SetWbmsMeta(request, guid.ToString()); + + LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); + + return Results.Ok(response); + } + + [HttpGet] + public async Task GetWbmsMetaByProductID([FromQuery] string ProductID, int? ShardID = 1) + { + Guid guid = Guid.NewGuid(); + LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} key:{ProductID}", LogXLabel.CONTROLLER); + + Response_GetWbms response = await _cpMetaService.GetWbmsMeta(new Request_GetWbmsMetaByProductID() { ProductID = ProductID, ShardID = (int)ShardID }, guid.ToString()); + + LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); + + return Results.Ok(response); + } + + [HttpGet] + public async Task GetWbmsMetaByMacAddress([FromQuery] string MacAddress, int? ShardID = 1) + { + Guid guid = Guid.NewGuid(); + LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} key:{MacAddress}", LogXLabel.CONTROLLER); + + Response_GetWbms response = await _cpMetaService.GetWbmsMeta(new Request_GetWbmsMetaByMacAddress() { MacAddress = MacAddress, ShardID = (int)ShardID }, guid.ToString()); + + LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); + + return Results.Ok(response); + } + } +} diff --git a/Projects/WebApi/WebApi.Project.UniqueKeyApi/Controllers/UniqueKeyController.cs b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Controllers/UniqueKeyController.cs index d2929df..3193641 100644 --- a/Projects/WebApi/WebApi.Project.UniqueKeyApi/Controllers/UniqueKeyController.cs +++ b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Controllers/UniqueKeyController.cs @@ -8,78 +8,78 @@ using WebApi.Project.UniqueKeyApi.Services; namespace WebApi.Project.UniqueKeyApi.Controllers { - [ApiController] - [Route("[controller]/[action]")] + //[ApiController] + //[Route("[controller]/[action]")] - public class UniqueKeyController : CommonController - { - private readonly UniqueKeyService _uniqueKeyService; + //public class UniqueKeyController : CommonController + //{ + // private readonly UniqueKeyService _uniqueKeyService; - public UniqueKeyController(IServiceProvider serviceProvider, IHttpContextAccessor httpContextAccessor, UniqueKeyService uniqueKeyService) - : base(serviceProvider, httpContextAccessor) - { - _uniqueKeyService = uniqueKeyService; - } + // public UniqueKeyController(IServiceProvider serviceProvider, IHttpContextAccessor httpContextAccessor, UniqueKeyService uniqueKeyService) + // : base(serviceProvider, httpContextAccessor) + // { + // _uniqueKeyService = uniqueKeyService; + // } - [HttpGet("health")] - public async Task Health() - { - LogXnet.WriteLine($"[{GetRequestMethod()}:{GetMethodName()}] [Client IP:{GetClientIP()}] [RequestUrl:{GetRequestUrl()}]{Environment.NewLine}", LogXLabel.CONTROLLER); + // [HttpGet("health")] + // public async Task Health() + // { + // LogXnet.WriteLine($"[{GetRequestMethod()}:{GetMethodName()}] [Client IP:{GetClientIP()}] [RequestUrl:{GetRequestUrl()}]{Environment.NewLine}", LogXLabel.CONTROLLER); - await Task.CompletedTask; - return Results.Ok("Healthy"); - } + // await Task.CompletedTask; + // return Results.Ok("Healthy"); + // } - [HttpPost] - public async Task InsertUniqueKey(Request_InsertUniqueKey request) - { - Guid guid = Guid.NewGuid(); - LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} {request.ToJson()}", LogXLabel.CONTROLLER); + // [HttpPost] + // public async Task InsertUniqueKey(Request_InsertUniqueKey request) + // { + // Guid guid = Guid.NewGuid(); + // LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} {request.ToJson()}", LogXLabel.CONTROLLER); - Response_InsertUniqueKy response = await _uniqueKeyService.Request_InsertUniqueKey(request); + // Response_InsertUniqueKy response = await _uniqueKeyService.Request_InsertUniqueKey(request); - LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); + // LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); - return Results.Ok(response); - } + // return Results.Ok(response); + // } - [HttpPost] - public async Task SelectUniqueKey([FromBody]Request_SelectUniqueKey request) - { - Guid guid = Guid.NewGuid(); - LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} {request.ToJson()}", LogXLabel.CONTROLLER); + // [HttpPost] + // public async Task SelectUniqueKey([FromBody]Request_SelectUniqueKey request) + // { + // Guid guid = Guid.NewGuid(); + // LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} {request.ToJson()}", LogXLabel.CONTROLLER); - Response_SelectUniqueKy response = await _uniqueKeyService.Request_SelectUniqueKey(request); + // Response_SelectUniqueKy response = await _uniqueKeyService.Request_SelectUniqueKey(request); - LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); + // LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); - return Results.Ok(response); - } + // return Results.Ok(response); + // } - [HttpGet] - public async Task SelectUniqueKeyGet([FromQuery] string key) - { - Guid guid = Guid.NewGuid(); - LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} key:{key}", LogXLabel.CONTROLLER); + // [HttpGet] + // public async Task SelectUniqueKeyGet([FromQuery] string key) + // { + // Guid guid = Guid.NewGuid(); + // LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} key:{key}", LogXLabel.CONTROLLER); - Response_SelectUniqueKy response = await _uniqueKeyService.Request_SelectUniqueKey(new Request_SelectUniqueKey { Identity = key }); + // Response_SelectUniqueKy response = await _uniqueKeyService.Request_SelectUniqueKey(new Request_SelectUniqueKey { Identity = key }); - LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); + // LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); - return Results.Ok(response); - } + // return Results.Ok(response); + // } - [HttpPost] - public async Task UpdateUniqueKey(Request_UpdateUniqueKey request) - { - Guid guid = Guid.NewGuid(); - LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} {request.ToJson()}", LogXLabel.CONTROLLER); + // [HttpPost] + // public async Task UpdateUniqueKey(Request_UpdateUniqueKey request) + // { + // Guid guid = Guid.NewGuid(); + // LogXnet.WriteLine($"[Request][{GetRequestMethod()}:{GetMethodName()}][Client IP:{GetClientIP()}][RequestUrl:{GetRequestUrl()}]::({guid}){Environment.NewLine} {request.ToJson()}", LogXLabel.CONTROLLER); - Response_UpdateUniqueKy response = await _uniqueKeyService.Request_UpdateUniqueKey(request); + // Response_UpdateUniqueKy response = await _uniqueKeyService.Request_UpdateUniqueKey(request); - LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); + // LogXnet.WriteLine($"[Response]::({guid}){Environment.NewLine} {response.ToJson()}", LogXLabel.CONTROLLER); - return Results.Ok(response); - } - } + // return Results.Ok(response); + // } + //} } diff --git a/Projects/WebApi/WebApi.Project.UniqueKeyApi/Models/Packet.cs b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Models/Packet.cs index fe5af80..fbbebee 100644 --- a/Projects/WebApi/WebApi.Project.UniqueKeyApi/Models/Packet.cs +++ b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Models/Packet.cs @@ -1,7 +1,54 @@ -using WebApi.Library.Enums; +using SystemX.Core.DB; +using WebApi.Library.Enums; namespace WebApi.Project.UniqueKeyApi.Models { + #region CPMeta Wbms + + //Wbms Meta Insert or Update + public class Request_SetWbmsMeta + { + //pk + public string ProductID { get; set; } = string.Empty; + //uk + public string? MacAddress1 { get; set; } = string.Empty; + public string? MacAddress2 { get; set; } = string.Empty; + + //value + public string? Type { get; set; } = string.Empty; + public string? ProductNo { get; set; } = string.Empty; + public string? SpareValue { get; set; } = string.Empty; + + public int ShardID { get; set; } = 1; + } + public class Response_SetWbmsMeta + { + public string ProductID { get; set; } = string.Empty; + public string Result { get; set; } = string.Empty; + public string Message { get; set; } = string.Empty; + } + + //Wbms Meta Select + public class Request_GetWbmsMetaByProductID + { + public string ProductID { get; set; } = string.Empty; + public int ShardID { get; set; } = 1; + } + public class Request_GetWbmsMetaByMacAddress + { + public string MacAddress { get; set; } = string.Empty; + public int ShardID { get; set; } = 1; + } + + public class Response_GetWbms + { + public List Wbms { get; set; } + public string Result { get; set; } = string.Empty; + public string Message { get; set; } = string.Empty; + } + + #endregion + #region Unique Key //Insert public class Request_InsertUniqueKey diff --git a/Projects/WebApi/WebApi.Project.UniqueKeyApi/Program.cs b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Program.cs index 4e1b50c..28eb590 100644 --- a/Projects/WebApi/WebApi.Project.UniqueKeyApi/Program.cs +++ b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Program.cs @@ -26,6 +26,7 @@ builder.Services.AddSingleton>(); //scoped builder.Services.AddSingleton(); +builder.Services.AddSingleton(); //db builder.Services.AddSingleton(); // Generic diff --git a/Projects/WebApi/WebApi.Project.UniqueKeyApi/Services/CPMetaService.cs b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Services/CPMetaService.cs new file mode 100644 index 0000000..7ba3742 --- /dev/null +++ b/Projects/WebApi/WebApi.Project.UniqueKeyApi/Services/CPMetaService.cs @@ -0,0 +1,258 @@ +using Microsoft.EntityFrameworkCore; +using System.Data; +using SystemX.Core.DB; +using SystemX.Core.Services; +using WebApi.Library.Enums; +using WebApi.Project.UniqueKeyApi.Models; + +namespace WebApi.Project.UniqueKeyApi.Services +{ + public class CPMetaService + { + private readonly IServiceScopeFactory _scopeFactory; + private readonly ConfigService? _configService; + + public CPMetaService(IServiceProvider serviceProvider, IServiceScopeFactory scopeFactory, ConfigService configSerice) + { + _scopeFactory = scopeFactory; + _configService = configSerice; + } + + public async Task SetWbmsMeta(Request_SetWbmsMeta request, string guid = "") + { + Response_SetWbmsMeta response = new Response_SetWbmsMeta(); + + if (request != null) + { + response.ProductID = request.ProductID; + + bool transactionResult = true; + using (var scope = _scopeFactory.CreateScope()) + { + int shardId = request.ShardID; + if (shardId <= 0) + shardId = 1; + + var provider = scope.ServiceProvider.GetRequiredService(); + using (var context = GetCPMetaDBContext(provider, shardId)) + { + if (context is not null) + { + var data = await context.tWbms.AsNoTracking().Where(x => x.cProductID == request.ProductID)?.FirstOrDefaultAsync(); + if (data is not null) //update + { + var selected = await context.tWbms.FirstOrDefaultAsync(x => x.cProductID == request.ProductID); + if (selected != null) + { + selected.cMacAddress1 = request.MacAddress1; + selected.cMacAddress2 = request.MacAddress2; + selected.cType = request.Type; + selected.cProductNo = request.ProductNo; + selected.cSpareValue = request.SpareValue; + + selected.cDateTime = DateTime.Now; + + using (var transaction = await context.CreateTransactionAsync()) + { + context.Update(selected); + transactionResult = await context.CloseTransactionAsync(transaction); + } + } + + LogXnet.WriteLine($"Update::{guid}", LogXLabel.DB); + response.Result = WebApiResult.Update.ToString(); + } + else //insert + { + var row = new tWbms + { + cProductID = request.ProductID, + cMacAddress1 = request.MacAddress1, + cMacAddress2 = request.MacAddress2, + cType = request.Type, + cProductNo = request.ProductNo, + cSpareValue = request.SpareValue, + + cDateTime = DateTime.Now + }; + + using (var transaction = await context.CreateTransactionAsync()) + { + await context.AddAsync(row); + transactionResult = await context.CloseTransactionAsync(transaction); + } + + LogXnet.WriteLine($"Insert::{guid}", LogXLabel.DB); + response.Result = WebApiResult.Success.ToString(); + } + + //db error + if (transactionResult == false) + { + LogXnet.WriteLine($"Transaction Error::{guid}", LogXLabel.Error); + response.Result = WebApiResult.Failed.ToString(); + response.Message = "Duplicate Mac Address"; + } + } + else //invalid shard id + { + LogXnet.WriteLine($"ShardID Error::{guid}", LogXLabel.Error); + response.Result = WebApiResult.Failed.ToString(); + response.Message = "Invalid shard id"; + } + } + } + } + + return response; + } + + public async Task GetWbmsMeta(Request_GetWbmsMetaByProductID request, string guid = "") + { + Response_GetWbms response = new Response_GetWbms(); + response.Wbms = new List(); + + if (request != null) + { + using (var scope = _scopeFactory.CreateScope()) + { + int shardId = request.ShardID; + if (shardId <= 0) + shardId = 1; + + var provider = scope.ServiceProvider.GetRequiredService(); + using (var context = GetCPMetaDBContext(provider, shardId)) + { + if (context is not null) + { + try + { + using (var transaction = await context.CreateTransactionAsync(IsolationLevel.ReadUncommitted)) + { + var data = await context.tWbms.AsNoTracking().FirstOrDefaultAsync(x => x.cProductID.ToLower() == request.ProductID.ToLower()); + await context.CloseTransactionAsync(transaction); + if (data != null) + { + if(response.Wbms is not null) + { + response.Wbms.Add(data); + } + + response.Result = WebApiResult.Success.ToString(); + } + else + { + response.Wbms = null; + response.Result = WebApiResult.Failed.ToString(); + response.Message = $"Not exist productID: {request.ProductID}"; + } + } + } + catch (Exception e) + { + response.Wbms = null; + response.Result = WebApiResult.Failed.ToString(); + response.Message = $"Not exist productID: {request.ProductID}"; + + LogXnet.WriteLine($"GetWbmsMeta By ProductID Transaction Error::{guid}", LogXLabel.Error); + LogXnet.WriteLine(e); + } + } + else //invalid shard id + { + LogXnet.WriteLine($"ShardID Error::{guid}", LogXLabel.Error); + response.Result = WebApiResult.Failed.ToString(); + response.Message = "Invalid shard id"; + } + } + } + } + + return response; + } + + public async Task GetWbmsMeta(Request_GetWbmsMetaByMacAddress request, string guid = "") + { + Response_GetWbms response = new Response_GetWbms(); + response.Wbms = new List(); + + if (request != null) + { + using (var scope = _scopeFactory.CreateScope()) + { + int shardId = request.ShardID; + if (shardId <= 0) + shardId = 1; + + var provider = scope.ServiceProvider.GetRequiredService(); + using (var context = GetCPMetaDBContext(provider, shardId)) + { + if (context is not null) + { + try + { + using (var transaction = await context.CreateTransactionAsync(IsolationLevel.ReadUncommitted)) + { + var mac1 = await context.tWbms.AsNoTracking().FirstOrDefaultAsync(x => x.cMacAddress1.ToLower() == request.MacAddress.ToLower()); + var mac2 = await context.tWbms.AsNoTracking().FirstOrDefaultAsync(x => x.cMacAddress2.ToLower() == request.MacAddress.ToLower()); + await context.CloseTransactionAsync(transaction); + if (mac1 is not null) + { + if(response.Wbms is not null) + { + response.Wbms.Add(mac1); + } + response.Result = WebApiResult.Success.ToString(); + } + + if(mac2 is not null) + { + if (response.Wbms is not null) + { + response.Wbms.Add(mac2); + } + response.Result = WebApiResult.Success.ToString(); + } + + if(response.Wbms?.Count <= 0) + { + response.Wbms = null; + response.Result = WebApiResult.Failed.ToString(); + response.Message = $"Not exist MacAddress: {request.MacAddress}"; + } + } + } + catch (Exception e) + { + response.Wbms = null; + response.Result = WebApiResult.Failed.ToString(); + response.Message = $"Not exist MacAddrss: {request.MacAddress}"; + + LogXnet.WriteLine($"GetWbmsMeta By MacAddress Transaction Error::{guid}", LogXLabel.Error); + LogXnet.WriteLine(e); + } + } + else //invalid shard id + { + LogXnet.WriteLine($"ShardID Error::{guid}", LogXLabel.Error); + response.Result = WebApiResult.Failed.ToString(); + response.Message = "Invalid shard id"; + } + } + } + } + + return response; + } + + + private CPMetaContext? GetCPMetaDBContext(DbContextProvider provider, int dbID) + { + var connectionString = _configService?.GetConfig()?.DataBase?.Find(x => x.DBID == dbID); + if(connectionString is not null) + return provider?.GetDBContext((int)connectionString?.DBID); + + return null; + } + } +}