First version of DAL
This commit is contained in:
		
							
								
								
									
										363
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										363
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,363 @@ | ||||
| ## Ignore Visual Studio temporary files, build results, and | ||||
| ## files generated by popular Visual Studio add-ons. | ||||
| ## | ||||
| ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore | ||||
|  | ||||
| # User-specific files | ||||
| *.rsuser | ||||
| *.suo | ||||
| *.user | ||||
| *.userosscache | ||||
| *.sln.docstates | ||||
|  | ||||
| # User-specific files (MonoDevelop/Xamarin Studio) | ||||
| *.userprefs | ||||
|  | ||||
| # Mono auto generated files | ||||
| mono_crash.* | ||||
|  | ||||
| # Build results | ||||
| [Dd]ebug/ | ||||
| [Dd]ebugPublic/ | ||||
| [Rr]elease/ | ||||
| [Rr]eleases/ | ||||
| x64/ | ||||
| x86/ | ||||
| [Ww][Ii][Nn]32/ | ||||
| [Aa][Rr][Mm]/ | ||||
| [Aa][Rr][Mm]64/ | ||||
| bld/ | ||||
| [Bb]in/ | ||||
| [Oo]bj/ | ||||
| [Oo]ut/ | ||||
| [Ll]og/ | ||||
| [Ll]ogs/ | ||||
|  | ||||
| # Visual Studio 2015/2017 cache/options directory | ||||
| .vs/ | ||||
| # Uncomment if you have tasks that create the project's static files in wwwroot | ||||
| #wwwroot/ | ||||
|  | ||||
| # Visual Studio 2017 auto generated files | ||||
| Generated\ Files/ | ||||
|  | ||||
| # MSTest test Results | ||||
| [Tt]est[Rr]esult*/ | ||||
| [Bb]uild[Ll]og.* | ||||
|  | ||||
| # NUnit | ||||
| *.VisualState.xml | ||||
| TestResult.xml | ||||
| nunit-*.xml | ||||
|  | ||||
| # Build Results of an ATL Project | ||||
| [Dd]ebugPS/ | ||||
| [Rr]eleasePS/ | ||||
| dlldata.c | ||||
|  | ||||
| # Benchmark Results | ||||
| BenchmarkDotNet.Artifacts/ | ||||
|  | ||||
| # .NET Core | ||||
| project.lock.json | ||||
| project.fragment.lock.json | ||||
| artifacts/ | ||||
|  | ||||
| # ASP.NET Scaffolding | ||||
| ScaffoldingReadMe.txt | ||||
|  | ||||
| # StyleCop | ||||
| StyleCopReport.xml | ||||
|  | ||||
| # Files built by Visual Studio | ||||
| *_i.c | ||||
| *_p.c | ||||
| *_h.h | ||||
| *.ilk | ||||
| *.meta | ||||
| *.obj | ||||
| *.iobj | ||||
| *.pch | ||||
| *.pdb | ||||
| *.ipdb | ||||
| *.pgc | ||||
| *.pgd | ||||
| *.rsp | ||||
| *.sbr | ||||
| *.tlb | ||||
| *.tli | ||||
| *.tlh | ||||
| *.tmp | ||||
| *.tmp_proj | ||||
| *_wpftmp.csproj | ||||
| *.log | ||||
| *.vspscc | ||||
| *.vssscc | ||||
| .builds | ||||
| *.pidb | ||||
| *.svclog | ||||
| *.scc | ||||
|  | ||||
| # Chutzpah Test files | ||||
| _Chutzpah* | ||||
|  | ||||
| # Visual C++ cache files | ||||
| ipch/ | ||||
| *.aps | ||||
| *.ncb | ||||
| *.opendb | ||||
| *.opensdf | ||||
| *.sdf | ||||
| *.cachefile | ||||
| *.VC.db | ||||
| *.VC.VC.opendb | ||||
|  | ||||
| # Visual Studio profiler | ||||
| *.psess | ||||
| *.vsp | ||||
| *.vspx | ||||
| *.sap | ||||
|  | ||||
| # Visual Studio Trace Files | ||||
| *.e2e | ||||
|  | ||||
| # TFS 2012 Local Workspace | ||||
| $tf/ | ||||
|  | ||||
| # Guidance Automation Toolkit | ||||
| *.gpState | ||||
|  | ||||
| # ReSharper is a .NET coding add-in | ||||
| _ReSharper*/ | ||||
| *.[Rr]e[Ss]harper | ||||
| *.DotSettings.user | ||||
|  | ||||
| # TeamCity is a build add-in | ||||
| _TeamCity* | ||||
|  | ||||
| # DotCover is a Code Coverage Tool | ||||
| *.dotCover | ||||
|  | ||||
| # AxoCover is a Code Coverage Tool | ||||
| .axoCover/* | ||||
| !.axoCover/settings.json | ||||
|  | ||||
| # Coverlet is a free, cross platform Code Coverage Tool | ||||
| coverage*.json | ||||
| coverage*.xml | ||||
| coverage*.info | ||||
|  | ||||
| # Visual Studio code coverage results | ||||
| *.coverage | ||||
| *.coveragexml | ||||
|  | ||||
| # NCrunch | ||||
| _NCrunch_* | ||||
| .*crunch*.local.xml | ||||
| nCrunchTemp_* | ||||
|  | ||||
| # MightyMoose | ||||
| *.mm.* | ||||
| AutoTest.Net/ | ||||
|  | ||||
| # Web workbench (sass) | ||||
| .sass-cache/ | ||||
|  | ||||
| # Installshield output folder | ||||
| [Ee]xpress/ | ||||
|  | ||||
| # DocProject is a documentation generator add-in | ||||
| DocProject/buildhelp/ | ||||
| DocProject/Help/*.HxT | ||||
| DocProject/Help/*.HxC | ||||
| DocProject/Help/*.hhc | ||||
| DocProject/Help/*.hhk | ||||
| DocProject/Help/*.hhp | ||||
| DocProject/Help/Html2 | ||||
| DocProject/Help/html | ||||
|  | ||||
| # Click-Once directory | ||||
| publish/ | ||||
|  | ||||
| # Publish Web Output | ||||
| *.[Pp]ublish.xml | ||||
| *.azurePubxml | ||||
| # Note: Comment the next line if you want to checkin your web deploy settings, | ||||
| # but database connection strings (with potential passwords) will be unencrypted | ||||
| *.pubxml | ||||
| *.publishproj | ||||
|  | ||||
| # Microsoft Azure Web App publish settings. Comment the next line if you want to | ||||
| # checkin your Azure Web App publish settings, but sensitive information contained | ||||
| # in these scripts will be unencrypted | ||||
| PublishScripts/ | ||||
|  | ||||
| # NuGet Packages | ||||
| *.nupkg | ||||
| # NuGet Symbol Packages | ||||
| *.snupkg | ||||
| # The packages folder can be ignored because of Package Restore | ||||
| **/[Pp]ackages/* | ||||
| # except build/, which is used as an MSBuild target. | ||||
| !**/[Pp]ackages/build/ | ||||
| # Uncomment if necessary however generally it will be regenerated when needed | ||||
| #!**/[Pp]ackages/repositories.config | ||||
| # NuGet v3's project.json files produces more ignorable files | ||||
| *.nuget.props | ||||
| *.nuget.targets | ||||
|  | ||||
| # Microsoft Azure Build Output | ||||
| csx/ | ||||
| *.build.csdef | ||||
|  | ||||
| # Microsoft Azure Emulator | ||||
| ecf/ | ||||
| rcf/ | ||||
|  | ||||
| # Windows Store app package directories and files | ||||
| AppPackages/ | ||||
| BundleArtifacts/ | ||||
| Package.StoreAssociation.xml | ||||
| _pkginfo.txt | ||||
| *.appx | ||||
| *.appxbundle | ||||
| *.appxupload | ||||
|  | ||||
| # Visual Studio cache files | ||||
| # files ending in .cache can be ignored | ||||
| *.[Cc]ache | ||||
| # but keep track of directories ending in .cache | ||||
| !?*.[Cc]ache/ | ||||
|  | ||||
| # Others | ||||
| ClientBin/ | ||||
| ~$* | ||||
| *~ | ||||
| *.dbmdl | ||||
| *.dbproj.schemaview | ||||
| *.jfm | ||||
| *.pfx | ||||
| *.publishsettings | ||||
| orleans.codegen.cs | ||||
|  | ||||
| # Including strong name files can present a security risk | ||||
| # (https://github.com/github/gitignore/pull/2483#issue-259490424) | ||||
| #*.snk | ||||
|  | ||||
| # Since there are multiple workflows, uncomment next line to ignore bower_components | ||||
| # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) | ||||
| #bower_components/ | ||||
|  | ||||
| # RIA/Silverlight projects | ||||
| Generated_Code/ | ||||
|  | ||||
| # Backup & report files from converting an old project file | ||||
| # to a newer Visual Studio version. Backup files are not needed, | ||||
| # because we have git ;-) | ||||
| _UpgradeReport_Files/ | ||||
| Backup*/ | ||||
| UpgradeLog*.XML | ||||
| UpgradeLog*.htm | ||||
| ServiceFabricBackup/ | ||||
| *.rptproj.bak | ||||
|  | ||||
| # SQL Server files | ||||
| *.mdf | ||||
| *.ldf | ||||
| *.ndf | ||||
|  | ||||
| # Business Intelligence projects | ||||
| *.rdl.data | ||||
| *.bim.layout | ||||
| *.bim_*.settings | ||||
| *.rptproj.rsuser | ||||
| *- [Bb]ackup.rdl | ||||
| *- [Bb]ackup ([0-9]).rdl | ||||
| *- [Bb]ackup ([0-9][0-9]).rdl | ||||
|  | ||||
| # Microsoft Fakes | ||||
| FakesAssemblies/ | ||||
|  | ||||
| # GhostDoc plugin setting file | ||||
| *.GhostDoc.xml | ||||
|  | ||||
| # Node.js Tools for Visual Studio | ||||
| .ntvs_analysis.dat | ||||
| node_modules/ | ||||
|  | ||||
| # Visual Studio 6 build log | ||||
| *.plg | ||||
|  | ||||
| # Visual Studio 6 workspace options file | ||||
| *.opt | ||||
|  | ||||
| # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) | ||||
| *.vbw | ||||
|  | ||||
| # Visual Studio LightSwitch build output | ||||
| **/*.HTMLClient/GeneratedArtifacts | ||||
| **/*.DesktopClient/GeneratedArtifacts | ||||
| **/*.DesktopClient/ModelManifest.xml | ||||
| **/*.Server/GeneratedArtifacts | ||||
| **/*.Server/ModelManifest.xml | ||||
| _Pvt_Extensions | ||||
|  | ||||
| # Paket dependency manager | ||||
| .paket/paket.exe | ||||
| paket-files/ | ||||
|  | ||||
| # FAKE - F# Make | ||||
| .fake/ | ||||
|  | ||||
| # CodeRush personal settings | ||||
| .cr/personal | ||||
|  | ||||
| # Python Tools for Visual Studio (PTVS) | ||||
| __pycache__/ | ||||
| *.pyc | ||||
|  | ||||
| # Cake - Uncomment if you are using it | ||||
| # tools/** | ||||
| # !tools/packages.config | ||||
|  | ||||
| # Tabs Studio | ||||
| *.tss | ||||
|  | ||||
| # Telerik's JustMock configuration file | ||||
| *.jmconfig | ||||
|  | ||||
| # BizTalk build output | ||||
| *.btp.cs | ||||
| *.btm.cs | ||||
| *.odx.cs | ||||
| *.xsd.cs | ||||
|  | ||||
| # OpenCover UI analysis results | ||||
| OpenCover/ | ||||
|  | ||||
| # Azure Stream Analytics local run output | ||||
| ASALocalRun/ | ||||
|  | ||||
| # MSBuild Binary and Structured Log | ||||
| *.binlog | ||||
|  | ||||
| # NVidia Nsight GPU debugger configuration file | ||||
| *.nvuser | ||||
|  | ||||
| # MFractors (Xamarin productivity tool) working folder | ||||
| .mfractor/ | ||||
|  | ||||
| # Local History for Visual Studio | ||||
| .localhistory/ | ||||
|  | ||||
| # BeatPulse healthcheck temp database | ||||
| healthchecksdb | ||||
|  | ||||
| # Backup folder for Package Reference Convert tool in Visual Studio 2017 | ||||
| MigrationBackup/ | ||||
|  | ||||
| # Ionide (cross platform F# VS Code tools) working folder | ||||
| .ionide/ | ||||
|  | ||||
| # Fody - auto-generated XML schema | ||||
| FodyWeavers.xsd | ||||
| @@ -0,0 +1,91 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="FurnitureBaseController.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using Asp.Versioning; | ||||
| using Core.Adapters.Lib; | ||||
| using Core.Blueprint.Logging; | ||||
| using Core.Blueprint.Mongo; | ||||
| using Core.Inventory.Domain.Contexts.Inventory.Request; | ||||
| using Core.Inventory.Provider.Contracts; | ||||
| using Microsoft.AspNetCore.Authorization; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
|  | ||||
| namespace Core.Inventory.DAL.API.Controllers | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Handles all requests for furniture base CRUD operations. | ||||
|     /// </summary> | ||||
|     [ApiVersion(MimeTypes.ApplicationVersion)] | ||||
|     [Route("api/v{api-version:apiVersion}/[controller]")] | ||||
|     [Produces(MimeTypes.ApplicationJson)] | ||||
|     [Consumes(MimeTypes.ApplicationJson)] | ||||
|     [ApiController] | ||||
|     [AllowAnonymous] | ||||
|     public class FurnitureBaseController(IFurnitureBaseProvider service) : ControllerBase | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Gets all furniture base records. | ||||
|         /// </summary> | ||||
|         [HttpGet] | ||||
|         [ProducesResponseType(typeof(IEnumerable<FurnitureBase>), StatusCodes.Status200OK)] | ||||
|         public async Task<IActionResult> GetAllAsync(CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await service.GetAllAsync(cancellationToken); | ||||
|             return Ok(result); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets a furniture base record by ID. | ||||
|         /// </summary> | ||||
|         [HttpGet] | ||||
|         [Route("{id}")] | ||||
|         [ProducesResponseType(typeof(FurnitureBase), StatusCodes.Status200OK)] | ||||
|         [ProducesResponseType(StatusCodes.Status404NotFound)] | ||||
|         public async Task<IActionResult> GetByIdAsync([FromRoute] string id, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await service.GetByIdAsync(id, cancellationToken); | ||||
|             return result is not null ? Ok(result) : NotFound("Entity not found"); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Creates a new furniture base record. | ||||
|         /// </summary> | ||||
|         [HttpPost] | ||||
|         [ProducesResponseType(typeof(FurnitureBase), StatusCodes.Status201Created)] | ||||
|         public async Task<IActionResult> CreateAsync([FromBody] FurnitureBaseRequest request, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await service.CreateAsync(request, cancellationToken); | ||||
|             return Created("CreatedWithIdAsync", result); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Updates a furniture base record by ID. | ||||
|         /// </summary> | ||||
|         [HttpPut] | ||||
|         [Route("{id}")] | ||||
|         [ProducesResponseType(typeof(FurnitureBase), StatusCodes.Status200OK)] | ||||
|         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||
|         public async Task<IActionResult> UpdateAsync([FromRoute] string id, [FromBody] FurnitureBase entity, CancellationToken cancellationToken) | ||||
|         { | ||||
|             if (id != entity.Id?.ToString()) | ||||
|                 return BadRequest("Furniture ID mismatch"); | ||||
|  | ||||
|             var result = await service.UpdateAsync(id, entity, cancellationToken); | ||||
|             return Ok(result); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Changes the status of a furniture base record. | ||||
|         /// </summary> | ||||
|         [HttpPatch] | ||||
|         [Route("{id}/{newStatus}/ChangeStatus")] | ||||
|         [ProducesResponseType(typeof(FurnitureBase), StatusCodes.Status200OK)] | ||||
|         public async Task<IActionResult> ChangeStatusAsync([FromRoute] string id, [FromRoute] StatusEnum newStatus, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await service.ChangeStatusAsync(id, newStatus, cancellationToken); | ||||
|             return Ok(result); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,97 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="FurnitureVariantController.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using Asp.Versioning; | ||||
| using Core.Adapters.Lib; | ||||
| using Core.Blueprint.Logging; | ||||
| using Core.Blueprint.Mongo; | ||||
| using Core.Inventory.Domain.Contexts.Inventory.Request; | ||||
| using Core.Inventory.Provider.Contracts; | ||||
| using Microsoft.AspNetCore.Authorization; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
|  | ||||
| namespace Core.Inventory.DAL.API.Controllers | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Handles all requests for furniture variant CRUD operations. | ||||
|     /// </summary> | ||||
|     [ApiVersion(MimeTypes.ApplicationVersion)] | ||||
|     [Route("api/v{api-version:apiVersion}/[controller]")] | ||||
|     [Produces(MimeTypes.ApplicationJson)] | ||||
|     [Consumes(MimeTypes.ApplicationJson)] | ||||
|     [ApiController] | ||||
|     [AllowAnonymous] | ||||
|     public class FurnitureVariantController(IFurnitureVariantProvider service) : ControllerBase | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Gets all furniture variant records. | ||||
|         /// </summary> | ||||
|         [HttpGet] | ||||
|         [ProducesResponseType(typeof(IEnumerable<FurnitureVariant>), StatusCodes.Status200OK)] | ||||
|         public async Task<IActionResult> GetAllVariantsByModelIdAsync([FromRoute] string modelId, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await service.GetAllByModelIdAsync(modelId, cancellationToken).ConfigureAwait(false); | ||||
|  | ||||
|             if (result is null || !result.Any()) | ||||
|             { | ||||
|                 return NotFound($"No variants found for base model with ID '{modelId}'."); | ||||
|             } | ||||
|  | ||||
|             return Ok(result); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets a furniture variant record by ID. | ||||
|         /// </summary> | ||||
|         [HttpGet] | ||||
|         [Route("{id}")] | ||||
|         [ProducesResponseType(typeof(FurnitureVariant), StatusCodes.Status200OK)] | ||||
|         [ProducesResponseType(StatusCodes.Status404NotFound)] | ||||
|         public async Task<IActionResult> GetByIdAsync([FromRoute] string id, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await service.GetByIdAsync(id, cancellationToken); | ||||
|             return result is not null ? Ok(result) : NotFound("Entity not found"); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Creates a new furniture variant. | ||||
|         /// </summary> | ||||
|         [HttpPost] | ||||
|         [ProducesResponseType(typeof(FurnitureVariant), StatusCodes.Status201Created)] | ||||
|         public async Task<IActionResult> CreateAsync([FromBody] FurnitureVariantRequest request, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await service.CreateAsync(request, cancellationToken); | ||||
|             return Created("CreatedWithIdAsync", result); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Updates a furniture variant record by ID. | ||||
|         /// </summary> | ||||
|         [HttpPut] | ||||
|         [Route("{id}")] | ||||
|         [ProducesResponseType(typeof(FurnitureVariant), StatusCodes.Status200OK)] | ||||
|         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||
|         public async Task<IActionResult> UpdateAsync([FromRoute] string id, [FromBody] FurnitureVariant entity, CancellationToken cancellationToken) | ||||
|         { | ||||
|             if (id != entity.Id?.ToString()) | ||||
|                 return BadRequest("Furniture Variant ID mismatch"); | ||||
|  | ||||
|             var result = await service.UpdateAsync(id, entity, cancellationToken); | ||||
|             return Ok(result); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Changes the status of a furniture variant record. | ||||
|         /// </summary> | ||||
|         [HttpPatch] | ||||
|         [Route("{id}/{newStatus}/ChangeStatus")] | ||||
|         [ProducesResponseType(typeof(FurnitureVariant), StatusCodes.Status200OK)] | ||||
|         public async Task<IActionResult> ChangeStatusAsync([FromRoute] string id, [FromRoute] StatusEnum newStatus, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await service.ChangeStatusAsync(id, newStatus, cancellationToken); | ||||
|             return Ok(result); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										20
									
								
								Core.Inventory.DAL.API/Core.Inventory.DAL.API.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Core.Inventory.DAL.API/Core.Inventory.DAL.API.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk.Web"> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net8.0</TargetFramework> | ||||
|     <Nullable>enable</Nullable> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" /> | ||||
|     <PackageReference Include="Core.Blueprint.Logging" Version="1.0.1" /> | ||||
|     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\Core.Inventory.Domain\Core.Inventory.Domain.csproj" /> | ||||
|     <ProjectReference Include="..\Core.Inventory.Provider\Core.Inventory.Provider.csproj" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
| </Project> | ||||
							
								
								
									
										6
									
								
								Core.Inventory.DAL.API/Core.Inventory.DAL.API.http
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Core.Inventory.DAL.API/Core.Inventory.DAL.API.http
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| @Core.Inventory.DAL.API_HostAddress = http://localhost:5069 | ||||
|  | ||||
| GET {{Core.Inventory.DAL.API_HostAddress}}/weatherforecast/ | ||||
| Accept: application/json | ||||
|  | ||||
| ### | ||||
							
								
								
									
										66
									
								
								Core.Inventory.DAL.API/Extensions/SwaggerExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								Core.Inventory.DAL.API/Extensions/SwaggerExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| using Asp.Versioning.ApiExplorer; | ||||
| using Microsoft.Extensions.Options; | ||||
| using Microsoft.OpenApi.Any; | ||||
| using Swashbuckle.AspNetCore.SwaggerGen; | ||||
| using Swashbuckle.AspNetCore.SwaggerUI; | ||||
|  | ||||
| namespace Core.Inventory.DAL.API.Extensions | ||||
| { | ||||
|     public static class SwaggerExtensions | ||||
|     { | ||||
|         public static void AddSwagger(this IServiceCollection services) | ||||
|         { | ||||
|             services.AddEndpointsApiExplorer(); | ||||
|             services.AddSwaggerGen(); | ||||
|             services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>(); | ||||
|         } | ||||
|  | ||||
|         public static void ConfigureSwagger(this WebApplication app) | ||||
|         { | ||||
|             app.UseSwagger(); | ||||
|             app.UseSwaggerUI(options => | ||||
|             { | ||||
|                 foreach (var version in app.DescribeApiVersions().Select(version => version.GroupName)) | ||||
|                     options.SwaggerEndpoint($"/swagger/{version}/swagger.json", version); | ||||
|  | ||||
|                 options.DisplayRequestDuration(); | ||||
|                 options.EnableTryItOutByDefault(); | ||||
|                 options.DocExpansion(DocExpansion.None); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         public static IServiceCollection AddVersioning(this IServiceCollection services) | ||||
|         { | ||||
|             services.AddApiVersioning(options => options.ReportApiVersions = true) | ||||
|                 .AddApiExplorer(options => | ||||
|                 { | ||||
|                     options.GroupNameFormat = "'v'VVV"; | ||||
|                     options.SubstituteApiVersionInUrl = true; | ||||
|                 }); | ||||
|             return services; | ||||
|         } | ||||
|  | ||||
|         public class ConfigureSwaggerOptions(IApiVersionDescriptionProvider provider) : IConfigureOptions<SwaggerGenOptions> | ||||
|         { | ||||
|             private readonly IApiVersionDescriptionProvider _provider = provider; | ||||
|  | ||||
|             public void Configure(SwaggerGenOptions options) | ||||
|             { | ||||
|                 foreach (var description in _provider.ApiVersionDescriptions) | ||||
|                     options.SwaggerDoc(description.GroupName, new() | ||||
|                     { | ||||
|                         Title = AppDomain.CurrentDomain.FriendlyName, | ||||
|                         Version = description.ApiVersion.ToString() | ||||
|                     }); | ||||
|  | ||||
|                 options.MapType<DateOnly>(() => new() | ||||
|                 { | ||||
|                     Format= "date", | ||||
|                     Example = new OpenApiString(DateOnly.MinValue.ToString()) | ||||
|                 }); | ||||
|  | ||||
|                 options.CustomSchemaIds(type => type.ToString().Replace("+", ".")); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										81
									
								
								Core.Inventory.DAL.API/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								Core.Inventory.DAL.API/Program.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| using Core.Blueprint.DAL.Mongo.Configuration; | ||||
| using Core.Blueprint.Logging.Configuration; | ||||
| using Core.Blueprint.Redis.Configuration; | ||||
| using Core.Inventory.DAL.API.Extensions; | ||||
| using Core.Inventory.Provider; | ||||
| using Microsoft.AspNetCore.HttpLogging; | ||||
| using System.Reflection; | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| var builder = WebApplication.CreateBuilder(args); | ||||
|  | ||||
| builder.Services.AddEndpointsApiExplorer(); | ||||
| builder.Services.AddSwaggerGen(); | ||||
| builder.Configuration | ||||
|     .AddUserSecrets(Assembly.GetExecutingAssembly()) | ||||
|     .AddEnvironmentVariables(); | ||||
|  | ||||
| builder.Services.AddResponseCompression(); | ||||
| builder.Services.AddProblemDetails(); | ||||
| builder.Services.AddMemoryCache(); | ||||
| builder.Services.AddLogs(builder); | ||||
| builder.Services.AddRedis(builder.Configuration); | ||||
| builder.Services.AddMongoLayer(builder.Configuration); | ||||
| builder.Services.AddDALLayerServices(builder.Configuration); | ||||
|  | ||||
| builder.Host.ConfigureServices((context, services) => | ||||
| { | ||||
|  | ||||
|     services.AddLogging(); | ||||
|     services.AddControllers(); | ||||
|     services.AddProblemDetails(); | ||||
|     services.AddCors(options | ||||
|         => options.AddDefaultPolicy(policyBuilder | ||||
|             => policyBuilder | ||||
|                 .AllowAnyOrigin() | ||||
|                 .AllowAnyHeader() | ||||
|                 .AllowAnyMethod())); | ||||
|  | ||||
|     builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => | ||||
|     { | ||||
|         options.SerializerOptions.Converters.Add(new JsonStringEnumConverter()); | ||||
|     }); | ||||
|  | ||||
|     services | ||||
|         .AddEndpointsApiExplorer() | ||||
|         .AddVersioning() | ||||
|         .AddSwagger(); | ||||
|  | ||||
|     services.AddHealthChecks(); | ||||
|     services.AddHttpLogging(options => options.LoggingFields = HttpLoggingFields.All); | ||||
|  | ||||
|     builder.Services.AddOutputCache(options => | ||||
|     { | ||||
|         options.AddBasePolicy(builder => | ||||
|             builder.Expire(TimeSpan.FromSeconds(10))); | ||||
|         options.AddPolicy("Expire20", builder => | ||||
|             builder.Expire(TimeSpan.FromSeconds(20))); | ||||
|         options.AddPolicy("Expire30", builder => | ||||
|             builder.Expire(TimeSpan.FromSeconds(30))); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| var app = builder.Build(); | ||||
|  | ||||
| app.UseSwagger(); | ||||
| app.UseSwaggerUI(); | ||||
| app.UseAuthentication(); | ||||
| app.UseAuthorization(); | ||||
| app.MapControllers(); | ||||
| app.UseCors(); | ||||
| app.ConfigureSwagger(); | ||||
| app.UseHttpsRedirection(); | ||||
| app.UseStaticFiles(); | ||||
| app.UseRouting(); | ||||
| app.UseResponseCompression(); | ||||
| app.UseOutputCache(); | ||||
| app.UseResponseCaching(); | ||||
| app.UseLogging(builder.Configuration); | ||||
| app.MapHealthChecks("/health"); | ||||
|  | ||||
| app.Run(); | ||||
							
								
								
									
										41
									
								
								Core.Inventory.DAL.API/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								Core.Inventory.DAL.API/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| { | ||||
|   "$schema": "http://json.schemastore.org/launchsettings.json", | ||||
|   "iisSettings": { | ||||
|     "windowsAuthentication": false, | ||||
|     "anonymousAuthentication": true, | ||||
|     "iisExpress": { | ||||
|       "applicationUrl": "http://localhost:16111", | ||||
|       "sslPort": 44378 | ||||
|     } | ||||
|   }, | ||||
|   "profiles": { | ||||
|     "http": { | ||||
|       "commandName": "Project", | ||||
|       "dotnetRunMessages": true, | ||||
|       "launchBrowser": true, | ||||
|       "launchUrl": "swagger", | ||||
|       "applicationUrl": "http://localhost:5069", | ||||
|       "environmentVariables": { | ||||
|         "ASPNETCORE_ENVIRONMENT": "Local" | ||||
|       } | ||||
|     }, | ||||
|     "https": { | ||||
|       "commandName": "Project", | ||||
|       "dotnetRunMessages": true, | ||||
|       "launchBrowser": true, | ||||
|       "launchUrl": "swagger", | ||||
|       "applicationUrl": "https://localhost:7037;http://localhost:5069", | ||||
|       "environmentVariables": { | ||||
|         "ASPNETCORE_ENVIRONMENT": "Local" | ||||
|       } | ||||
|     }, | ||||
|     "IIS Express": { | ||||
|       "commandName": "IISExpress", | ||||
|       "launchBrowser": true, | ||||
|       "launchUrl": "swagger", | ||||
|       "environmentVariables": { | ||||
|         "ASPNETCORE_ENVIRONMENT": "Local" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										22
									
								
								Core.Inventory.DAL.API/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Core.Inventory.DAL.API/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "Logging": { | ||||
|     "LogLevel": { | ||||
|       "Default": "Information", | ||||
|       "Microsoft.AspNetCore": "Warning" | ||||
|     } | ||||
|   }, | ||||
|   "AllowedHosts": "*", | ||||
|   "ConnectionStrings": { | ||||
|     "MongoDB": "mongodb://localhost:27017", | ||||
|     "Redis": "localhost:6379" | ||||
|   }, | ||||
|   "MongoDb": { | ||||
|     "DatabaseName": "Inventory", | ||||
|     "LocalAudience": "" | ||||
|   }, | ||||
|   "DetailedErrors": true, | ||||
|   "UseRedisCache": true, | ||||
|   "CacheSettings": { | ||||
|     "DefaultCacheDurationInMinutes": 3 | ||||
|   } | ||||
| } | ||||
							
								
								
									
										26
									
								
								Core.Inventory.DAL.API/appsettings.Local.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Core.Inventory.DAL.API/appsettings.Local.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| { | ||||
|   "Logging": { | ||||
|     "LogLevel": { | ||||
|       "Default": "Information", | ||||
|       "Microsoft.AspNetCore": "Warning" | ||||
|     } | ||||
|   }, | ||||
|   "AllowedHosts": "*", | ||||
|   "ConnectionStrings": { | ||||
|     "MongoDB": "mongodb://admin_agile:Admin%40agileWebs@portainer.white-enciso.pro:27017/?authMechanism=SCRAM-SHA-256", | ||||
|     "Redis": "100.123.31.103:6379" | ||||
|   }, | ||||
|   "MongoDb": { | ||||
|     "DatabaseName": "Inventory", | ||||
|     "LocalAudience": "" | ||||
|   }, | ||||
|   "DetailedErrors": true, | ||||
|   "UseRedisCache": true, | ||||
|   "CacheSettings": { | ||||
|     "DefaultCacheDurationInMinutes": 3 | ||||
|   }, | ||||
|   "ServiceSettings": { | ||||
|     "ApplicationName": "inventory", | ||||
|     "LayerName": "dal" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										22
									
								
								Core.Inventory.DAL.API/appsettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Core.Inventory.DAL.API/appsettings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "Logging": { | ||||
|     "LogLevel": { | ||||
|       "Default": "Information", | ||||
|       "Microsoft.AspNetCore": "Warning" | ||||
|     } | ||||
|   }, | ||||
|   "AllowedHosts": "*", | ||||
|   "ConnectionStrings": { | ||||
|     "MongoDB": "mongodb://admin_agile:Admin%40agileWebs@portainer.white-enciso.pro:27017/?authMechanism=SCRAM-SHA-256", | ||||
|     "Redis": "localhost:6379" | ||||
|   }, | ||||
|   "MongoDb": { | ||||
|     "DatabaseName": "Inventory", | ||||
|     "LocalAudience": "" | ||||
|   }, | ||||
|   "DetailedErrors": true, | ||||
|   "UseRedisCache": true, | ||||
|   "CacheSettings": { | ||||
|     "DefaultCacheDurationInMinutes": 3 | ||||
|   } | ||||
| } | ||||
							
								
								
									
										35
									
								
								Core.Inventory.DAL.API/sample.settings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								Core.Inventory.DAL.API/sample.settings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| { | ||||
|   "ConnectionStrings": { | ||||
|     "DefaultConnection": "", // Sandbox MongoDB connection string | ||||
|     "Redis": "", // New Redis connection string | ||||
|     "KeyVault": "" //KeyVault Uri | ||||
|   }, | ||||
|   "MongoDb": { | ||||
|     "DatabaseName": "Inventory" | ||||
|   }, | ||||
|   "CacheSettings": { | ||||
|     "DefaultCacheDurationInMinutes": 3 // Default cache duration set to 3 minutes | ||||
|   }, | ||||
|   "JwtIssuerOptions": { | ||||
|     "Audience": "", // Audience for token creation, specifies intended recipients | ||||
|     "Issuer": "" // Issuer for token creation, identifies the issuer of the token | ||||
|   }, | ||||
|   "AzureAdB2C": { | ||||
|     "Instance": "", // Azure AD instance URL (STORED IN KEY VAULT) | ||||
|     "TenantId": "", // Azure AD tenant ID (STORED IN KEY VAULT) | ||||
|     "ClientId": "", // Azure AD application client ID (STORED IN KEY VAULT) | ||||
|     "ClientSecret": "", // Azure AD application client secret (STORED IN KEY VAULT) | ||||
|     "CallbackPath": "", // Path for redirect after authentication | ||||
|     "Scopes": "" // Access scopes for user permissions | ||||
|   }, | ||||
|   "InventoryApp": { | ||||
|     "AuthorizationUrl": "", // URL for authorization endpoint (STORED IN KEY VAULT) | ||||
|     "TokenUrl": "", // URL for token endpoint (STORED IN KEY VAULT) | ||||
|     "Scope": "", // Scope for application permissions (STORED IN KEY VAULT) | ||||
|     "ClientId": "" // Client ID for Inventory application (STORED IN KEY VAULT) | ||||
|   }, | ||||
|   "MicrosoftGraph": { | ||||
|     "Scopes": "", // Scopes for Microsoft Graph API access | ||||
|     "BaseUrl": "" // Base URL for Microsoft Graph API | ||||
|   } | ||||
| } | ||||
							
								
								
									
										46
									
								
								Core.Inventory.DAL.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Core.Inventory.DAL.sln
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio Version 17 | ||||
| VisualStudioVersion = 17.14.36212.18 d17.14 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Inventory.DAL.API", "Core.Inventory.DAL.API\Core.Inventory.DAL.API.csproj", "{96859D04-7CAE-477B-B839-16A4B2D3582B}" | ||||
| EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Application", "Application", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" | ||||
| EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Presentation", "Presentation", "{B1AD1822-B4BC-407E-9EA9-51D3F4992277}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Inventory.Domain", "Core.Inventory.Domain\Core.Inventory.Domain.csproj", "{09CAECFB-DD53-4D26-A5CB-964C032AF9E5}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Inventory.Provider", "Core.Inventory.Provider\Core.Inventory.Provider.csproj", "{5A6BD82A-AF9C-4920-BA0E-D44B1D64A689}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Any CPU = Debug|Any CPU | ||||
| 		Release|Any CPU = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{96859D04-7CAE-477B-B839-16A4B2D3582B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{96859D04-7CAE-477B-B839-16A4B2D3582B}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{96859D04-7CAE-477B-B839-16A4B2D3582B}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{96859D04-7CAE-477B-B839-16A4B2D3582B}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{09CAECFB-DD53-4D26-A5CB-964C032AF9E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{09CAECFB-DD53-4D26-A5CB-964C032AF9E5}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{09CAECFB-DD53-4D26-A5CB-964C032AF9E5}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{09CAECFB-DD53-4D26-A5CB-964C032AF9E5}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{5A6BD82A-AF9C-4920-BA0E-D44B1D64A689}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{5A6BD82A-AF9C-4920-BA0E-D44B1D64A689}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{5A6BD82A-AF9C-4920-BA0E-D44B1D64A689}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{5A6BD82A-AF9C-4920-BA0E-D44B1D64A689}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(NestedProjects) = preSolution | ||||
| 		{96859D04-7CAE-477B-B839-16A4B2D3582B} = {B1AD1822-B4BC-407E-9EA9-51D3F4992277} | ||||
| 		{09CAECFB-DD53-4D26-A5CB-964C032AF9E5} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} | ||||
| 		{5A6BD82A-AF9C-4920-BA0E-D44B1D64A689} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 		SolutionGuid = {DBCCBC76-3980-4B8C-8C1D-CF99F076774B} | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
| @@ -0,0 +1,101 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="FurnitureBaseRequest.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using MongoDB.Bson; | ||||
| using MongoDB.Bson.Serialization.Attributes; | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace Core.Inventory.Domain.Contexts.Inventory.Request | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Data transfer object (DTO) for creating or updating a furniture base model. | ||||
|     /// </summary> | ||||
|     public class FurnitureBaseRequest | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Gets or sets the name of the model. | ||||
|         /// </summary> | ||||
|         [BsonElement("modelName")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("modelName")] | ||||
|         public string ModelName { get; set; } = null!; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the material of the furniture. | ||||
|         /// </summary> | ||||
|         [BsonElement("material")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("material")] | ||||
|         public string Material { get; set; } = null!; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the condition (e.g., new, refurbished). | ||||
|         /// </summary> | ||||
|         [BsonElement("condition")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("condition")] | ||||
|         public string Condition { get; set; } = null!; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the base description. | ||||
|         /// </summary> | ||||
|         [BsonElement("baseDescription")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("baseDescription")] | ||||
|         public string? BaseDescription { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the 3D or graphical representation. | ||||
|         /// </summary> | ||||
|         [BsonElement("representation")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("representation")] | ||||
|         public string? Representation { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the maintenance notes. | ||||
|         /// </summary> | ||||
|         [BsonElement("maintenanceNotes")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("maintenanceNotes")] | ||||
|         public string? MaintenanceNotes { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the dimensions of the furniture. | ||||
|         /// </summary> | ||||
|         [BsonElement("dimensions")] | ||||
|         [JsonPropertyName("dimensions")] | ||||
|         public DimensionsRequest Dimensions { get; set; } = new(); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the list of variant IDs related to this model. | ||||
|         /// </summary> | ||||
|         [BsonElement("variantIds")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("variantIds")] | ||||
|         public List<string>? VariantIds { get; set; } | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Dimensions DTO for width, height and depth. | ||||
|     /// </summary> | ||||
|     public class DimensionsRequest | ||||
|     { | ||||
|         [BsonElement("width")] | ||||
|         [BsonRepresentation(BsonType.Double)] | ||||
|         [JsonPropertyName("width")] | ||||
|         public float Width { get; set; } | ||||
|  | ||||
|         [BsonElement("height")] | ||||
|         [BsonRepresentation(BsonType.Double)] | ||||
|         [JsonPropertyName("height")] | ||||
|         public float Height { get; set; } | ||||
|  | ||||
|         [BsonElement("depth")] | ||||
|         [BsonRepresentation(BsonType.Double)] | ||||
|         [JsonPropertyName("depth")] | ||||
|         public float Depth { get; set; } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,53 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="FurnitureVariantRequest.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using MongoDB.Bson; | ||||
| using MongoDB.Bson.Serialization.Attributes; | ||||
| using System.ComponentModel.DataAnnotations; | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace Core.Inventory.Domain.Contexts.Inventory.Request | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Data transfer object (DTO) for creating or updating a furniture variant. | ||||
|     /// </summary> | ||||
|     public class FurnitureVariantRequest : InventoryItemRequestBase | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Gets or sets the model ID this variant belongs to (FK). | ||||
|         /// </summary> | ||||
|         [Required] | ||||
|         [BsonElement("modelId")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("modelId")] | ||||
|         public string ModelId { get; set; } = null!; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the name of the variant. | ||||
|         /// </summary> | ||||
|         [Required] | ||||
|         [BsonElement("name")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("name")] | ||||
|         public string Name { get; set; } = null!; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the color of the furniture variant. | ||||
|         /// </summary> | ||||
|         [Required] | ||||
|         [BsonElement("color")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("color")] | ||||
|         public string Color { get; set; } = null!; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the product line (e.g., Premium, Eco). | ||||
|         /// </summary> | ||||
|         [BsonElement("line")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("line")] | ||||
|         public string? Line { get; set; } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,66 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="InventoryItemRequestBase.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using MongoDB.Bson; | ||||
| using MongoDB.Bson.Serialization.Attributes; | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace Core.Inventory.Domain.Contexts.Inventory.Request | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Base data transfer object (DTO) for inventory-related items. | ||||
|     /// Serves as a foundation for specific item types such as furniture variants, tools, or electronics. | ||||
|     /// </summary> | ||||
|     public abstract class InventoryItemRequestBase | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Gets or sets the quantity in stock. | ||||
|         /// </summary> | ||||
|         [BsonElement("stock")] | ||||
|         [BsonRepresentation(BsonType.Int32)] | ||||
|         [JsonPropertyName("stock")] | ||||
|         public int Stock { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the unit price of the item. | ||||
|         /// </summary> | ||||
|         [BsonElement("price")] | ||||
|         [BsonRepresentation(BsonType.Decimal128)] | ||||
|         [JsonPropertyName("price")] | ||||
|         public decimal Price { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the currency in which the price is expressed. | ||||
|         /// </summary> | ||||
|         [BsonElement("currency")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("currency")] | ||||
|         public string Currency { get; set; } = "MXN"; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the category identifier the item belongs to. | ||||
|         /// </summary> | ||||
|         [BsonElement("categoryId")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("categoryId")] | ||||
|         public Guid CategoryId { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the provider or vendor identifier of the item. | ||||
|         /// </summary> | ||||
|         [BsonElement("providerId")] | ||||
|         [BsonRepresentation(BsonType.String)] | ||||
|         [JsonPropertyName("providerId")] | ||||
|         public Guid ProviderId { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets additional customizable attributes. | ||||
|         /// Useful for storing arbitrary metadata specific to the item type. | ||||
|         /// </summary> | ||||
|         [BsonElement("attributes")] | ||||
|         [JsonPropertyName("attributes")] | ||||
|         public Dictionary<string, object> Attributes { get; set; } = []; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								Core.Inventory.Domain/Core.Inventory.Domain.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Core.Inventory.Domain/Core.Inventory.Domain.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net8.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="BuildingBlocks.Library" Version="1.0.0" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
| </Project> | ||||
							
								
								
									
										58
									
								
								Core.Inventory.Provider/Contracts/IFurnitureBaseProvider.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								Core.Inventory.Provider/Contracts/IFurnitureBaseProvider.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="IFurnitureBaseProvider.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using Core.Adapters.Lib; | ||||
| using Core.Blueprint.Mongo; | ||||
| using Core.Inventory.Domain.Contexts.Inventory.Request; | ||||
|  | ||||
| namespace Core.Inventory.Provider.Contracts | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Interface for managing base furniture models. | ||||
|     /// </summary> | ||||
|     public interface IFurnitureBaseProvider | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Creates a new FurnitureBase entity. | ||||
|         /// </summary> | ||||
|         /// <param name="newFurniture">The DTO representing the furniture base.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The created <see cref="FurnitureBase"/>.</returns> | ||||
|         ValueTask<FurnitureBase> CreateAsync(FurnitureBaseRequest newFurniture, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets a furniture base entity by its ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The unique identifier (_id) of the furniture base.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The corresponding <see cref="FurnitureBase"/>.</returns> | ||||
|         ValueTask<FurnitureBase> GetByIdAsync(string id, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves all furniture base entries. | ||||
|         /// </summary> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>A list of <see cref="FurnitureBase"/>.</returns> | ||||
|         ValueTask<IEnumerable<FurnitureBase>> GetAllAsync(CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Updates an existing furniture base by ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The furniture base identifier.</param> | ||||
|         /// <param name="entity">The updated entity data.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The updated <see cref="FurnitureBase"/>.</returns> | ||||
|         ValueTask<FurnitureBase> UpdateAsync(string id, FurnitureBase entity, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Changes the status of a furniture base entity. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The entity identifier.</param> | ||||
|         /// <param name="newStatus">The new status to apply.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The updated <see cref="FurnitureBase"/>.</returns> | ||||
|         ValueTask<FurnitureBase> ChangeStatusAsync(string id, StatusEnum newStatus, CancellationToken cancellationToken); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,59 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="IFurnitureVariantProvider.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using Core.Adapters.Lib; | ||||
| using Core.Blueprint.Mongo; | ||||
| using Core.Inventory.Domain.Contexts.Inventory.Request; | ||||
|  | ||||
| namespace Core.Inventory.Provider.Contracts | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Interface for managing furniture variants associated with a base furniture model. | ||||
|     /// </summary> | ||||
|     public interface IFurnitureVariantProvider | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Creates a new FurnitureVariant entity. | ||||
|         /// </summary> | ||||
|         /// <param name="newVariant">The DTO representing the furniture variant.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The created <see cref="FurnitureVariant"/>.</returns> | ||||
|         ValueTask<FurnitureVariant> CreateAsync(FurnitureVariantRequest newVariant, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets a furniture variant entity by its ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The unique identifier (_id) of the furniture variant.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The corresponding <see cref="FurnitureVariant"/>.</returns> | ||||
|         ValueTask<FurnitureVariant> GetByIdAsync(string id, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves all furniture variants associated with a base model. | ||||
|         /// </summary> | ||||
|         /// <param name="modelId">The ID of the base furniture model.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>A list of <see cref="FurnitureVariant"/>.</returns> | ||||
|         ValueTask<IEnumerable<FurnitureVariant>> GetAllByModelIdAsync(string modelId, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Updates an existing furniture variant by ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The variant identifier.</param> | ||||
|         /// <param name="entity">The updated entity data.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The updated <see cref="FurnitureVariant"/>.</returns> | ||||
|         ValueTask<FurnitureVariant> UpdateAsync(string id, FurnitureVariant entity, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Changes the status of a furniture variant entity. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The entity identifier.</param> | ||||
|         /// <param name="newStatus">The new status to apply.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The updated <see cref="FurnitureVariant"/>.</returns> | ||||
|         ValueTask<FurnitureVariant> ChangeStatusAsync(string id, StatusEnum newStatus, CancellationToken cancellationToken); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										20
									
								
								Core.Inventory.Provider/Core.Inventory.Provider.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Core.Inventory.Provider/Core.Inventory.Provider.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net8.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="Adapters.Lib" Version="1.0.3" /> | ||||
|     <PackageReference Include="Core.Blueprint.Mongo" Version="1.0.0" /> | ||||
|     <PackageReference Include="Core.Blueprint.Redis" Version="1.0.1" /> | ||||
|     <PackageReference Include="Mapster" Version="7.4.0" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\Core.Inventory.Domain\Core.Inventory.Domain.csproj" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
| </Project> | ||||
| @@ -0,0 +1,114 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="FurnitureBaseProvider.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using Core.Adapters.Lib; | ||||
| using Core.Blueprint.Mongo; | ||||
| using Core.Blueprint.Redis; | ||||
| using Core.Blueprint.Redis.Helpers; | ||||
| using Core.Inventory.Domain.Contexts.Inventory.Request; | ||||
| using Core.Inventory.Provider.Contracts; | ||||
| using Mapster; | ||||
| using Microsoft.Extensions.Options; | ||||
|  | ||||
| namespace Core.Inventory.Provider.Providers.Inventory | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Handles all operations related to <see cref="FurnitureBase"/>. | ||||
|     /// </summary> | ||||
|     public class FurnitureBaseProvider : IFurnitureBaseProvider | ||||
|     { | ||||
|         private readonly CollectionRepository<FurnitureBase> repository; | ||||
|         private readonly IRedisCacheProvider cacheProvider; | ||||
|         private readonly CacheSettings cacheSettings; | ||||
|  | ||||
|         public FurnitureBaseProvider( | ||||
|             CollectionRepository<FurnitureBase> repository, | ||||
|             IRedisCacheProvider cacheProvider, | ||||
|             IOptions<CacheSettings> cacheSettings | ||||
|             ) | ||||
|         { | ||||
|             this.repository = repository; | ||||
|             this.repository.CollectionInitialization(); | ||||
|             this.cacheProvider = cacheProvider; | ||||
|             this.cacheSettings = cacheSettings.Value; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Changes the status of a FurnitureBase entity. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The furniture base identifier.</param> | ||||
|         /// <param name="newStatus">The new status to apply.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The updated <see cref="FurnitureBase"/>.</returns> | ||||
|         public async ValueTask<FurnitureBase> ChangeStatusAsync(string id, StatusEnum newStatus, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var entity = await repository.FindByIdAsync(id); | ||||
|             entity.Status = newStatus; | ||||
|             await repository.ReplaceOneAsync(entity); | ||||
|             return entity; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Creates a new FurnitureBase entity. | ||||
|         /// </summary> | ||||
|         /// <param name="newFurniture">The DTO representing the base furniture model.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The created <see cref="FurnitureBase"/>.</returns> | ||||
|         public async ValueTask<FurnitureBase> CreateAsync(FurnitureBaseRequest newFurniture, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var furnitureCollection = newFurniture.Adapt<FurnitureBase>(); | ||||
|             await repository.InsertOneAsync(furnitureCollection); | ||||
|             return furnitureCollection; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves all FurnitureBase entries. | ||||
|         /// </summary> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>A list of <see cref="FurnitureBase"/>.</returns> | ||||
|         public async ValueTask<IEnumerable<FurnitureBase>> GetAllAsync(CancellationToken cancellationToken) | ||||
|         { | ||||
|             var cacheKey = CacheKeyHelper.GenerateCacheKey(this, nameof(GetAllAsync)); | ||||
|             var cachedData = await cacheProvider.GetAsync<IEnumerable<FurnitureBase>>(cacheKey) ?? []; | ||||
|  | ||||
|             if (cachedData.Any()) return cachedData; | ||||
|  | ||||
|             var data = await repository.AsQueryable(); | ||||
|             await cacheProvider.SetAsync(cacheKey, data); | ||||
|             return data; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets a FurnitureBase entity by its ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The furniture base identifier.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The corresponding <see cref="FurnitureBase"/>.</returns> | ||||
|         public async ValueTask<FurnitureBase> GetByIdAsync(string id, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var cacheKey = CacheKeyHelper.GenerateCacheKey(this, nameof(GetByIdAsync), id); | ||||
|             var cached = await cacheProvider.GetAsync<FurnitureBase>(cacheKey); | ||||
|  | ||||
|             if (cached is not null) return cached; | ||||
|  | ||||
|             var result = await repository.FindByIdAsync(id); | ||||
|             await cacheProvider.SetAsync(cacheKey, result); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Updates a FurnitureBase entity by ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The furniture base identifier.</param> | ||||
|         /// <param name="entity">The updated entity data.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The updated <see cref="FurnitureBase"/>.</returns> | ||||
|         public async ValueTask<FurnitureBase> UpdateAsync(string id, FurnitureBase entity, CancellationToken cancellationToken) | ||||
|         { | ||||
|             await repository.ReplaceOneAsync(entity); | ||||
|             return entity; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,114 @@ | ||||
| // *********************************************************************** | ||||
| // <copyright file="FurnitureVariantProvider.cs"> | ||||
| //     Core.Inventory | ||||
| // </copyright> | ||||
| // *********************************************************************** | ||||
| using Core.Adapters.Lib; | ||||
| using Core.Blueprint.Mongo; | ||||
| using Core.Blueprint.Redis; | ||||
| using Core.Blueprint.Redis.Helpers; | ||||
| using Core.Inventory.Domain.Contexts.Inventory.Request; | ||||
| using Core.Inventory.Provider.Contracts; | ||||
| using Mapster; | ||||
| using Microsoft.Extensions.Options; | ||||
|  | ||||
| namespace Core.Inventory.Provider.Providers.Inventory | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Handles all operations related to <see cref="FurnitureVariant"/>. | ||||
|     /// </summary> | ||||
|     public class FurnitureVariantProvider : IFurnitureVariantProvider | ||||
|     { | ||||
|         private readonly CollectionRepository<FurnitureVariant> repository; | ||||
|         private readonly IRedisCacheProvider cacheProvider; | ||||
|         private readonly CacheSettings cacheSettings; | ||||
|  | ||||
|         public FurnitureVariantProvider( | ||||
|             CollectionRepository<FurnitureVariant> repository, | ||||
|             IRedisCacheProvider cacheProvider, | ||||
|             IOptions<CacheSettings> cacheSettings | ||||
|             ) | ||||
|         { | ||||
|             this.repository = repository; | ||||
|             this.repository.CollectionInitialization(); | ||||
|             this.cacheProvider = cacheProvider; | ||||
|             this.cacheSettings = cacheSettings.Value; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Changes the status of a FurnitureVariant entity. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The furniture variant identifier.</param> | ||||
|         /// <param name="newStatus">The new status to apply.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The updated <see cref="FurnitureVariant"/>.</returns> | ||||
|         public async ValueTask<FurnitureVariant> ChangeStatusAsync(string id, StatusEnum newStatus, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var entity = await repository.FindByIdAsync(id); | ||||
|             entity.Status = newStatus; | ||||
|             await repository.ReplaceOneAsync(entity); | ||||
|             return entity; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Creates a new FurnitureVariant entity. | ||||
|         /// </summary> | ||||
|         /// <param name="newVariant">The DTO representing the furniture variant.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The created <see cref="FurnitureVariant"/>.</returns> | ||||
|         public async ValueTask<FurnitureVariant> CreateAsync(FurnitureVariantRequest newVariant, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var variantCollection = newVariant.Adapt<FurnitureVariant>(); | ||||
|             await repository.InsertOneAsync(variantCollection); | ||||
|             return variantCollection; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves all FurnitureVariant entries. | ||||
|         /// </summary> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>A list of <see cref="FurnitureVariant"/>.</returns> | ||||
|         public async ValueTask<IEnumerable<FurnitureVariant>> GetAllByModelIdAsync(string modelId, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var cacheKey = CacheKeyHelper.GenerateCacheKey(this, nameof(GetAllByModelIdAsync)); | ||||
|             var cachedData = await cacheProvider.GetAsync<IEnumerable<FurnitureVariant>>(cacheKey); | ||||
|  | ||||
|             if (cachedData.Any()) return cachedData; | ||||
|  | ||||
|             var data = await repository.AsQueryable(); | ||||
|             await cacheProvider.SetAsync(cacheKey, data); | ||||
|             return data; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets a FurnitureVariant entity by its ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The furniture variant identifier.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The corresponding <see cref="FurnitureVariant"/>.</returns> | ||||
|         public async ValueTask<FurnitureVariant> GetByIdAsync(string id, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var cacheKey = CacheKeyHelper.GenerateCacheKey(this, nameof(GetByIdAsync), id); | ||||
|             var cached = await cacheProvider.GetAsync<FurnitureVariant>(cacheKey); | ||||
|  | ||||
|             if (cached is not null) return cached; | ||||
|  | ||||
|             var result = await repository.FindByIdAsync(id); | ||||
|             await cacheProvider.SetAsync(cacheKey, result); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Updates a FurnitureVariant entity by ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The furniture variant identifier.</param> | ||||
|         /// <param name="entity">The updated entity data.</param> | ||||
|         /// <param name="cancellationToken">Cancellation token.</param> | ||||
|         /// <returns>The updated <see cref="FurnitureVariant"/>.</returns> | ||||
|         public async ValueTask<FurnitureVariant> UpdateAsync(string id, FurnitureVariant entity, CancellationToken cancellationToken) | ||||
|         { | ||||
|             await repository.ReplaceOneAsync(entity); | ||||
|             return entity; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										24
									
								
								Core.Inventory.Provider/ServiceCollectionExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								Core.Inventory.Provider/ServiceCollectionExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| using Core.Adapters.Lib; | ||||
| using Core.Blueprint.Mongo; | ||||
| using Core.Inventory.Provider.Contracts; | ||||
| using Core.Inventory.Provider.Providers.Inventory; | ||||
| using Microsoft.Extensions.Configuration; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
|  | ||||
| namespace Core.Inventory.Provider | ||||
| { | ||||
|     public static class ServiceCollectionExtensions | ||||
|     { | ||||
|         public static IServiceCollection AddDALLayerServices(this IServiceCollection services, IConfiguration configuration) | ||||
|         { | ||||
|             services.AddScoped<IFurnitureBaseProvider, FurnitureBaseProvider>(); | ||||
|             services.AddScoped<CollectionRepository<FurnitureBase>>(); | ||||
|  | ||||
|             services.AddScoped<IFurnitureVariantProvider, FurnitureVariantProvider>(); | ||||
|             services.AddScoped<CollectionRepository<FurnitureVariant>>(); | ||||
|  | ||||
|             return services; | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user