diff --git a/Core.Inventory.DAL.API/Controllers/TagTypeController.cs b/Core.Inventory.DAL.API/Controllers/TagTypeController.cs
new file mode 100644
index 0000000..77a3f13
--- /dev/null
+++ b/Core.Inventory.DAL.API/Controllers/TagTypeController.cs
@@ -0,0 +1,154 @@
+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
+{
+ ///
+ /// Handles all requests for TagType authentication.
+ ///
+ [ApiVersion(MimeTypes.ApplicationVersion)]
+ [Route("api/v{api-version:apiVersion}/[controller]")]
+ [Produces(MimeTypes.ApplicationJson)]
+ [Consumes(MimeTypes.ApplicationJson)]
+ [ApiController]
+ [AllowAnonymous]
+ public class TagTypeController(ITagTypeProvider service) : ControllerBase
+ {
+ ///
+ /// Gets all the TagTypes.
+ ///
+ /// The found entities.
+ /// The tagTypes found.
+ /// The tagTypes not found error.
+ /// The service internal error.
+ [HttpGet]
+ [Consumes(MimeTypes.ApplicationJson)]
+ [Produces(MimeTypes.ApplicationJson)]
+ [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)]
+ public async Task GetAllTagTypesAsync(CancellationToken cancellationToken)
+ {
+ var result = await service.GetAllTagTypes(cancellationToken).ConfigureAwait(false);
+ return Ok(result);
+ }
+
+ ///
+ /// Gets all the TagTypes by TagType identifiers.
+ ///
+ /// The list of TagType identifiers.
+ /// The found entities.
+ /// The TagTypes found.
+ /// The TagTypes not found error.
+ /// The service internal error.
+ [HttpPost]
+ [Route("GetTagTypeList")]
+ [Consumes(MimeTypes.ApplicationJson)]
+ [Produces(MimeTypes.ApplicationJson)]
+ [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)]
+ public async Task GetAllTagTypesByList([FromBody] string[] tagTypes, CancellationToken cancellationToken)
+ {
+ if (tagTypes == null || !tagTypes.Any())
+ {
+ return BadRequest("TagType identifiers are required.");
+ }
+
+ var result = await service.GetAllTagTypesByList(tagTypes, cancellationToken).ConfigureAwait(false);
+ return Ok(result);
+ }
+
+
+ ///
+ /// Gets the TagType by identifier.
+ ///
+ /// The TagType identifier.
+ /// The found entity.
+ /// The TagType found.
+ /// The TagType not found error.
+ /// The service internal error.
+ [HttpGet]
+ [Route("{id}")]
+ [Consumes(MimeTypes.ApplicationJson)]
+ [Produces(MimeTypes.ApplicationJson)]
+ [ProducesResponseType(typeof(TagTypeAdapter), StatusCodes.Status200OK)]
+ public async Task GetTagTypeByIdAsync([FromRoute] string id, CancellationToken cancellationToken)
+ {
+ var result = await service.GetTagTypeById(id, cancellationToken).ConfigureAwait(false);
+
+ if (result == null)
+ {
+ return NotFound("Entity not found");
+ }
+
+ return Ok(result);
+ }
+
+ ///
+ /// Creates a new TagType.
+ ///
+ /// The TagType to be added.
+ /// The created entity.
+ /// The TagType created.
+ /// The TagType could not be created.
+ /// The service internal e|ror.
+ [HttpPost]
+ [ProducesResponseType(typeof(TagTypeAdapter), StatusCodes.Status201Created)]
+ public async Task CreateTagTypeAsync([FromBody] TagTypeRequest newTagType, CancellationToken cancellationToken)
+ {
+ var result = await service.CreateTagType(newTagType, cancellationToken).ConfigureAwait(false);
+ return Created("CreatedWithIdAsync", result);
+ }
+
+ ///
+ /// Updates a full TagType by identifier.
+ ///
+ /// The TagType to update.
+ /// The TagType identifier.
+ /// The updated entity.
+ /// The TagType updated.
+ /// The TagType not found.
+ /// The TagType could not be updated.
+ /// The service internal error.
+ [HttpPut]
+ [Route("{id}")]
+ [Consumes(MimeTypes.ApplicationJson)]
+ [Produces(MimeTypes.ApplicationJson)]
+ [ProducesResponseType(typeof(TagTypeAdapter), StatusCodes.Status200OK)]
+ public async Task UpdateTagTypeAsync([FromRoute] string id, TagTypeAdapter entity, CancellationToken cancellationToken)
+ {
+ if (id != entity.Id?.ToString())
+ {
+ return BadRequest("TagType ID mismatch");
+ }
+
+ var result = await service.UpdateTagType(entity, cancellationToken).ConfigureAwait(false);
+
+ return Ok(result);
+ }
+
+ ///
+ /// Changes the status of the TagType.
+ ///
+ /// The TagType identifier.
+ /// The new status of the TagType.
+ /// The updated entity.
+ /// The TagType updates.
+ /// The TagType not found.
+ /// The TagType could not be deleted.
+ /// The service internal error.
+ [HttpPatch]
+ [Route("{id}/{newStatus}/ChangeStatus")]
+ [Consumes(MimeTypes.ApplicationJson)]
+ [Produces(MimeTypes.ApplicationJson)]
+ [ProducesResponseType(typeof(TagTypeAdapter), StatusCodes.Status200OK)]
+ public async Task ChangeTagTypeStatus([FromRoute] string id, [FromRoute] StatusEnum newStatus, CancellationToken cancellationToken)
+ {
+ var result = await service.ChangeTagTypeStatus(id, newStatus, cancellationToken).ConfigureAwait(false);
+ return Ok(result);
+ }
+ }
+}
diff --git a/Core.Inventory.Domain/Contexts/Inventory/Request/TagTypeRequest.cs b/Core.Inventory.Domain/Contexts/Inventory/Request/TagTypeRequest.cs
new file mode 100644
index 0000000..874bd76
--- /dev/null
+++ b/Core.Inventory.Domain/Contexts/Inventory/Request/TagTypeRequest.cs
@@ -0,0 +1,44 @@
+using MongoDB.Bson;
+using MongoDB.Bson.Serialization.Attributes;
+using System.Text.Json.Serialization;
+
+namespace Core.Inventory.Domain.Contexts.Inventory.Request
+{
+ ///
+ /// Data transfer object (DTO) for adding tagType.
+ ///
+ public class TagTypeRequest
+ {
+ ///
+ /// Gets or sets the tenantId of the tagType.
+ ///
+ [BsonElement("tenantId")]
+ [BsonRepresentation(BsonType.String)]
+ [JsonPropertyName("tenantId")]
+ public string TenantId { get; set; } = null!;
+
+ ///
+ /// Gets or sets the typeName of the tagType.
+ ///
+ [BsonElement("typeName")]
+ [BsonRepresentation(BsonType.String)]
+ [JsonPropertyName("typeName")]
+ public string TypeName { get; set; } = null!;
+
+ ///
+ /// Gets or sets the level of the tagType.
+ ///
+ [BsonElement("level")]
+ [BsonRepresentation(BsonType.Int32)]
+ [JsonPropertyName("level")]
+ public int Level { get; set; }
+
+ ///
+ /// Gets or sets the parentTypeId of the tagType.
+ ///
+ [BsonElement("parentTypeId")]
+ [BsonRepresentation(BsonType.String)]
+ [JsonPropertyName("parentTypeId")]
+ public string ParentTypeId { get; set; } = null!;
+ }
+}
diff --git a/Core.Inventory.Provider/Contracts/ITagTypeProvider.cs b/Core.Inventory.Provider/Contracts/ITagTypeProvider.cs
new file mode 100644
index 0000000..9c0b567
--- /dev/null
+++ b/Core.Inventory.Provider/Contracts/ITagTypeProvider.cs
@@ -0,0 +1,59 @@
+using Core.Adapters.Lib;
+using Core.Blueprint.Mongo;
+using Core.Inventory.Domain.Contexts.Inventory.Request;
+
+namespace Core.Inventory.Provider.Contracts
+{
+ public interface ITagTypeProvider
+ {
+ ///
+ /// Creates a new TagType.
+ ///
+ /// The TagType to be created.
+ /// A representing
+ /// the asynchronous execution of the service.
+ ValueTask CreateTagType(TagTypeRequest newTagType, CancellationToken cancellationToken);
+
+ ///
+ /// Gets an TagType by identifier.
+ ///
+ /// The TagType identifier.
+ /// A representing
+ /// the asynchronous execution of the service.
+ ValueTask GetTagTypeById(string _id, CancellationToken cancellationToken);
+
+ ///
+ /// Gets all the tagTypes.
+ ///
+ /// A representing
+ /// the asynchronous execution of the service.
+ ValueTask> GetAllTagTypes(CancellationToken cancellationToken);
+
+ ///
+ /// Gets all the tagTypes by tagTypes identifier list.
+ ///
+ /// The list of tagTypes identifiers.
+ /// A representing
+ /// the asynchronous execution of the service.
+ ValueTask> GetAllTagTypesByList(string[] TagTypes, CancellationToken cancellationToken);
+
+ ///
+ /// Changes the status of the tagType.
+ ///
+ /// The tagType identifier.
+ /// The new status of the tagType.
+ /// The updated entity.
+ /// A representing
+ /// the asynchronous execution of the service.
+ ValueTask ChangeTagTypeStatus(string id, StatusEnum newStatus, CancellationToken cancellationToken);
+
+ ///
+ /// Updates a TagType by id.
+ ///
+ /// The TagType to be updated.
+ /// The TagType identifier.
+ /// A representing
+ /// the asynchronous execution of the service.
+ ValueTask UpdateTagType(TagTypeAdapter entity, CancellationToken cancellationToken);
+ }
+}
diff --git a/Core.Inventory.Provider/Core.Inventory.Provider.csproj b/Core.Inventory.Provider/Core.Inventory.Provider.csproj
index d04076e..963ec5e 100644
--- a/Core.Inventory.Provider/Core.Inventory.Provider.csproj
+++ b/Core.Inventory.Provider/Core.Inventory.Provider.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/Core.Inventory.Provider/Providers/Inventory/TagTypeProvider.cs b/Core.Inventory.Provider/Providers/Inventory/TagTypeProvider.cs
new file mode 100644
index 0000000..2d765b5
--- /dev/null
+++ b/Core.Inventory.Provider/Providers/Inventory/TagTypeProvider.cs
@@ -0,0 +1,149 @@
+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;
+using MongoDB.Driver;
+
+namespace Core.Inventory.Provider.Providers.Inventory
+{
+ ///
+ /// Handles all services and business rules related to .
+ ///
+ public class TagTypeProvider : ITagTypeProvider
+ {
+ private readonly CollectionRepository repository;
+ private readonly CacheSettings cacheSettings;
+ private readonly IRedisCacheProvider cacheProvider;
+
+ public TagTypeProvider(CollectionRepository repository,
+ IRedisCacheProvider cacheProvider,
+ IOptions cacheSettings)
+ {
+ this.repository = repository;
+ this.repository.CollectionInitialization();
+ this.cacheSettings = cacheSettings.Value;
+ this.cacheProvider = cacheProvider;
+ }
+
+ ///
+ /// Creates a new TagType.
+ ///
+ /// The TagType to be created.
+ /// A representing
+ /// the asynchronous execution of the service.
+ public async ValueTask CreateTagType(TagTypeRequest newTagType, CancellationToken cancellationToken)
+ {
+ var tagTypeCollection = newTagType.Adapt();
+
+ await repository.InsertOneAsync(tagTypeCollection);
+
+ return tagTypeCollection;
+ }
+
+ ///
+ /// Gets an TagType by identifier.
+ ///
+ /// The TagType identifier.
+ /// A representing
+ /// the asynchronous execution of the service.0
+ public async ValueTask GetTagTypeById(string _id, CancellationToken cancellationToken)
+ {
+ var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetTagTypeById", _id);
+ var cachedData = await cacheProvider.GetAsync(cacheKey);
+
+ if (cachedData is not null) { return cachedData; }
+
+ var tagType = await repository.FindByIdAsync(_id);
+
+ await cacheProvider.SetAsync(cacheKey, tagType);
+
+ return tagType;
+ }
+
+ ///
+ /// Gets all the TagTypes.
+ ///
+ /// A representing
+ /// the asynchronous execution of the service.
+ public async ValueTask> GetAllTagTypes(CancellationToken cancellationToken)
+ {
+ var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetTagTypes");
+ var cachedData = await cacheProvider.GetAsync>(cacheKey) ?? [];
+
+ if (cachedData.Any()) return cachedData;
+
+ var tagTypes = await repository.AsQueryable();
+
+ await cacheProvider.SetAsync(cacheKey, tagTypes);
+
+ return tagTypes;
+ }
+
+ ///
+ /// Gets all the TagTypes by TagTypes identifier list.
+ ///
+ /// The list of TagTypes identifiers.
+ /// A representing
+ /// the asynchronous execution of the service.
+ public async ValueTask> GetAllTagTypesByList(string[] tagTypes, CancellationToken cancellationToken)
+ {
+ var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetAllTagTypesByList", tagTypes);
+
+ var cachedData = await cacheProvider.GetAsync>(cacheKey) ?? [];
+
+ if (cachedData.Any()) return cachedData;
+
+ var builder = Builders.Filter;
+ var filters = new List>();
+
+ if (tagTypes != null || !tagTypes.Any())
+ {
+ filters.Add(builder.In(x => x._Id, tagTypes));
+ }
+
+ var finalFilter = filters.Any() ? builder.And(filters) : builder.Empty;
+
+ var tagTypesList = await repository.FilterByMongoFilterAsync(finalFilter);
+
+ await cacheProvider.SetAsync(cacheKey, tagTypesList);
+
+ return tagTypesList;
+ }
+
+
+ ///
+ /// Changes the status of the TagType.
+ ///
+ /// The TagType identifier.
+ /// The new status of the TagType.
+ /// A representing
+ /// the asynchronous execution of the service.
+ public async ValueTask ChangeTagTypeStatus(string id, StatusEnum newStatus, CancellationToken cancellationToken)
+ {
+ var entity = await repository.FindByIdAsync(id);
+ entity.Status = newStatus;
+
+ await repository.ReplaceOneAsync(entity);
+
+ return entity;
+ }
+
+ ///
+ /// Updates a TagType by id.
+ ///
+ /// The TagType to be updated.
+ /// The TagType identifier.
+ /// A representing
+ /// the asynchronous execution of the service.
+ public async ValueTask UpdateTagType(TagTypeAdapter entity, CancellationToken cancellationToken)
+ {
+ await repository.ReplaceOneAsync(entity);
+
+ return entity;
+ }
+ }
+}
diff --git a/Core.Inventory.Provider/ServiceCollectionExtensions.cs b/Core.Inventory.Provider/ServiceCollectionExtensions.cs
index c6af67e..4c408a2 100644
--- a/Core.Inventory.Provider/ServiceCollectionExtensions.cs
+++ b/Core.Inventory.Provider/ServiceCollectionExtensions.cs
@@ -17,6 +17,9 @@ namespace Core.Inventory.Provider
services.AddScoped();
services.AddScoped>();
+ services.AddScoped();
+ services.AddScoped>();
+
return services;
}