コード例 #1
0
        /// <summary>
        /// Delete or Reactivate a Kit
        /// </summary>
        /// <param name="id"></param>
        /// <param name="reactivate"></param>
        /// <param name="context"></param>
        /// <param name="trackingGuid"></param>
        /// <returns></returns>
        public async Task <int> DeleteOrReactivate(string id, bool reactivate, Guid trackingGuid)
        {
            var companyId = context.Security.GetCompanyId();

            // MongoDB Settings
            var    database = context.MongoDbSettings.Value.Databases.FirstOrDefault(x => x.Name == "DeathStar");
            string productCollectionName = database.Collections.FirstOrDefault(x => x.Name == "PC_Product").Name;
            string variantCollectionName = database.Collections.FirstOrDefault(x => x.Name == "PC_ProductVariant").Name;

            // Get MongoDB
            var db = context.Database;
            var productCollection = db.GetCollection <Deathstar.Data.Models.PC_Product>(productCollectionName);
            var variantCollection = db.GetCollection <Deathstar.Data.Models.PC_ProductVariant>(variantCollectionName);

            // Break combined id
            string[] ids = id.Split('|');

            // Parent id
            long.TryParse(ids[0], out long parentId);

            // Table
            string tableName = string.Empty;

            // Product
            var dbProduct = new Deathstar.Data.Models.PC_Product();

            // Variant
            var dbVariant = new Deathstar.Data.Models.PC_ProductVariant();

            // Filters - note always start with the company id
            var filters = Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

            filters = filters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.Id, parentId);

            filters = filters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.IsActive, true);

            // Find that product!
            dbProduct = await productCollection.Find(filters).FirstOrDefaultAsync();

            if (dbProduct != null)
            {
                // Delete or Reactivate the Alternate id
                var update = Builders <Deathstar.Data.Models.PC_Product> .Update.Combine(
                    Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.UpdatedBy, context.Security.GetEmail()),
                    Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.UpdatedDateTime, DateTimeOffset.Now.ToString("yyyy/MM/dd HH:mm:ss.fff zzz")),
                    Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.IsActive, reactivate)
                    );

                // Update Filter
                var updateFilters = Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.Id, parentId);

                updateFilters = updateFilters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.IsActive, true);

                updateFilters = updateFilters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                dbProduct = await productCollection.Find(filters).FirstOrDefaultAsync();

                // Insert
                await productCollection.UpdateOneAsync(updateFilters, update);

                // Delete or Reactivate the External id
            }
            else
            {
                var variantFilters = Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.Id, parentId);

                variantFilters = variantFilters & Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.IsActive, true);

                variantFilters = variantFilters & Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                dbVariant = await variantCollection.Find(variantFilters).FirstOrDefaultAsync();

                if (dbVariant == null)
                {
                    IG2000.Data.Utilities.Logging.LogTrackingEvent($"Invalid sku: {id}", $"Status Code: {Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest}", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                    throw new HttpResponseException()
                          {
                              StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest, ReasonPhrase = $"Invalid sku: {id}"
                          };
                }

                // Update the Following Fields
                var update = Builders <Deathstar.Data.Models.PC_ProductVariant> .Update
                             .Set(x => x.Kit.IsActive, reactivate)
                             .Set(x => x.Kit.UpdatedBy, context.Security.GetEmail())
                             .Set(x => x.Kit.UpdatedDateTime, DateTimeOffset.Now.ToString("yyyy/MM/dd HH:mm:ss.fff zzz"));

                // Update database record
                await variantCollection.UpdateOneAsync(variantFilters, update);

                // Delete or Reactivate the External id
            }

            return(Microsoft.AspNetCore.Http.StatusCodes.Status204NoContent);
        }
コード例 #2
0
        public async Task DeleteOrReactivate(IBaseContextModel context, string combinedId, string tableName, bool reactivate, Guid trackingGuid)
        {
            var response = new Tagge.Common.Models.ProductCategoryResponse();

            // Company Id
            var companyId = context.Security.GetCompanyId();

            try
            {
                // MongoDB Settings
                var    database = context.MongoDbSettings.Value.Databases.FirstOrDefault(x => x.Name == "DeathStar");
                string productCollectionName = database.Collections.FirstOrDefault(x => x.Name == "PC_Product").Name;
                string variantCollectionName = database.Collections.FirstOrDefault(x => x.Name == "PC_ProductVariant").Name;

                // Get MongoDB
                var db = context.Database;

                // Word
                var dbCategory = new Deathstar.Data.Models.PC_Category();

                // Id prefix
                string idPrefix = string.Empty;

                // Product Category
                var dbProductCategory = new Deathstar.Data.Models.PC_ProductCategory();

                // Product
                var dbProduct = new Deathstar.Data.Models.PC_Product();

                // Variant
                var dbVariant = new Deathstar.Data.Models.PC_ProductVariant();

                // Break combined id
                string[] ids = combinedId.Split('|');

                // Product id
                long.TryParse(ids[0], out long internalId);

                // Switch between Product & Variant
                if (tableName == "PC_Product")
                {
                    // Get the table ready
                    var productCollection = db.GetCollection <Deathstar.Data.Models.PC_Product>(productCollectionName);

                    // Filters - note always start with the company id
                    var filters = Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                    filters = filters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.Id, internalId);

                    filters = filters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.IsActive, true);

                    // Find product first
                    dbProduct = await productCollection.Find(filters).FirstOrDefaultAsync();

                    if (dbProduct == null)
                    {
                        IG2000.Data.Utilities.Logging.LogTrackingEvent($"Invalid Id: {combinedId}", $"Status Code: {Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest}", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                        throw new HttpResponseException()
                              {
                                  StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest, ReasonPhrase = $"Invalid Id: {combinedId}"
                              };
                    }

                    // Find the category within the product
                    dbProductCategory = dbProduct.Categories.FirstOrDefault(x => x.PC_ProductCategory_Id == combinedId);

                    if (dbProductCategory == null)
                    {
                        throw new HttpResponseException()
                              {
                                  StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status404NotFound, ReasonPhrase = $"Product Category not found by id({combinedId}) provided"
                              }
                    }
                    ;

                    dbProduct.Categories.Remove(dbProductCategory);

                    // Set Product Id to 0 cause of the serializer
                    dbProduct.Id = 0;

                    var serializerSettings = new JsonSerializerSettings()
                    {
                        NullValueHandling    = NullValueHandling.Ignore,
                        DefaultValueHandling = DefaultValueHandling.Ignore
                    };
                    var update = new BsonDocument()
                    {
                        { "$set", BsonDocument.Parse(JsonConvert.SerializeObject(dbProduct, serializerSettings)) }
                    };

                    // Update database record
                    await productCollection.UpdateOneAsync(filters, update);

                    // Build the Webhook event
                    var whProductRequest = new Sheev.Common.Models.WebhookResponse()
                    {
                        CompanyId = companyId.ToString(),
                        Type      = "Product Category Assignment",
                        Scope     = $"product/category/deleted",
                        Id        = combinedId
                    };

                    // Trigger the Webhook event
                    await _webHookModel.FireWebhookEvent(whProductRequest, context, trackingGuid);
                }
                else
                {
                    // Get the table ready
                    var variantFilters = Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.Id, internalId);

                    // Filter building
                    var variantCollection = db.GetCollection <Deathstar.Data.Models.PC_ProductVariant>(variantCollectionName);
                    variantFilters = variantFilters & Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.IsActive, true);

                    variantFilters = variantFilters & Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                    dbVariant = await variantCollection.Find(variantFilters).FirstOrDefaultAsync();

                    if (dbVariant == null)
                    {
                        IG2000.Data.Utilities.Logging.LogTrackingEvent($"Invalid Id: {combinedId}", $"Status Code: {Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest}", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                        throw new HttpResponseException()
                              {
                                  StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest, ReasonPhrase = $"Invalid Id: {combinedId}"
                              };
                    }

                    // Find the category
                    dbProductCategory = dbVariant.Categories.FirstOrDefault(x => x.PC_ProductCategory_Id == combinedId);

                    // Category is missing
                    if (dbProductCategory == null)
                    {
                        throw new HttpResponseException()
                              {
                                  StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status404NotFound, ReasonPhrase = $"Product Category not found by id({combinedId}) provided"
                              }
                    }
                    ;

                    dbVariant.Categories.Remove(dbProductCategory);

                    // Set Product Id to 0 cause of the serializer
                    dbVariant.Id = 0;

                    var serializerSettings = new JsonSerializerSettings()
                    {
                        NullValueHandling    = NullValueHandling.Ignore,
                        DefaultValueHandling = DefaultValueHandling.Ignore
                    };
                    var variantUpdate = new BsonDocument()
                    {
                        { "$set", BsonDocument.Parse(JsonConvert.SerializeObject(dbVariant, serializerSettings)) }
                    };

                    await variantCollection.UpdateOneAsync(variantFilters, variantUpdate);

                    // Build the Webhook event
                    var whVariantRequest = new Sheev.Common.Models.WebhookResponse()
                    {
                        CompanyId = companyId.ToString(),
                        Type      = "Product Category Assignment",
                        Scope     = $"product/variant/category/deleted",
                        Id        = combinedId
                    };

                    // Trigger the Webhook event
                    await _webHookModel.FireWebhookEvent(whVariantRequest, context, trackingGuid);
                }
            }
            catch (HttpResponseException webEx)
            {
                IG2000.Data.Utilities.Logging.LogTrackingEvent($"Inventory failed to save! Reason: {webEx.ReasonPhrase}", $"Status Code: {webEx.StatusCode}", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                throw;
            }
            catch (Exception ex)
            {
                IG2000.Data.Utilities.Logging.LogTrackingEvent($"See logs for additional details", "Failed", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                IG2000.Data.Utilities.ErrorLogger.Report(ex.Message, "InventoryModel.Save()", context, trackingGuid, System.Diagnostics.EventLogEntryType.Error);
                throw new HttpResponseException()
                      {
                          StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status500InternalServerError, ReasonPhrase = ex.Message
                      };
            }
        }
コード例 #3
0
        /// <summary>
        /// Updates an existing kit
        /// </summary>
        /// <param name="combinedId"></param>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <param name="trackingGuid"></param>
        /// <returns></returns>
        public async Task <Tagge.Common.Models.KitResponse> Update(string combinedId, Tagge.Common.Models.KitRequest request, Guid trackingGuid)
        {
            var response  = new Tagge.Common.Models.KitResponse();
            var companyId = context.Security.GetCompanyId();

            try
            {
                // MongoDB Settings
                var    database = context.MongoDbSettings.Value.Databases.FirstOrDefault(x => x.Name == "DeathStar");
                string productCollectionName = database.Collections.FirstOrDefault(x => x.Name == "PC_Product").Name;
                string variantCollectionName = database.Collections.FirstOrDefault(x => x.Name == "PC_ProductVariant").Name;

                // Get MongoDB
                var db = context.Database;
                var productCollection = db.GetCollection <Deathstar.Data.Models.PC_Product>(productCollectionName);
                var variantCollection = db.GetCollection <Deathstar.Data.Models.PC_ProductVariant>(variantCollectionName);

                // Word
                var dbKit = new Deathstar.Data.Models.PC_Kit();

                // Id prefix
                string idPrefix = string.Empty;

                // Table
                string tableName = string.Empty;

                // Kit table name
                string kitTableName = string.Empty;

                // Product
                var dbProduct = new Deathstar.Data.Models.PC_Product();

                // Variant
                var dbVariant = new Deathstar.Data.Models.PC_ProductVariant();

                // Existing Kit
                var dbExistingKit = new Deathstar.Data.Models.PC_Kit();

                // Break combined id
                string[] ids = combinedId.Split('|');

                // Product id
                long.TryParse(ids[0], out long internalId);

                // Filters - note always start with the company id
                var filters = Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                filters = filters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.Id, internalId);

                filters = filters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.IsActive, true);

                // Variant Filters
                var variantFilters = Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                variantFilters = variantFilters & Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.Id, internalId);

                variantFilters = variantFilters & Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.IsActive, true);

                // Find product first
                dbProduct = await productCollection.Find(filters).FirstOrDefaultAsync();

                if (dbProduct != null)
                {
                    idPrefix      = dbProduct.Id.ToString();
                    tableName     = "PC_Product";
                    kitTableName  = "PC_Kit";
                    dbExistingKit = dbProduct.Kit;
                }
                else
                {
                    // Find that variant
                    dbVariant = await variantCollection.Find(variantFilters).FirstOrDefaultAsync();

                    // Missing variant check
                    if (dbVariant == null)
                    {
                        IG2000.Data.Utilities.Logging.LogTrackingEvent($"Invalid Id: {combinedId}", $"Status Code: {Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest}", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                        throw new HttpResponseException()
                              {
                                  StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest, ReasonPhrase = $"Invalid sku: {request.Sku}"
                              };
                    }

                    idPrefix      = dbVariant.Id.ToString();
                    tableName     = "PC_ProductVariant";
                    kitTableName  = "PC_VariantKit";
                    dbExistingKit = dbVariant.Kit;
                }

                // Validate Kit Type
                await _typeModel.ValidateKitType(request.Type, trackingGuid);

                // Convert request to Location
                dbKit.ConvertToDatabaseObject(request);

                // Set Primary Key
                dbKit.SetPrimaryKey(idPrefix, request.Sku);

                // Components
                if (request.Components != null && request.Components.Count > 0)
                {
                    dbKit.Components = await _kitComponentModel.SaveOrUpdate(dbKit.PC_Kit_Id, tableName, request.Components, dbExistingKit.Components, trackingGuid);
                }

                // Custom Fields
                if (request.CustomFields != null && request.CustomFields.Count > 0)
                {
                    dbKit.CustomFields = await _customFieldModel.SaveOrUpdateGenericCustomFields(request.CustomFields, dbKit.CustomFields, kitTableName, dbKit.PC_Kit_Id, trackingGuid);
                }

                // Add Updated By & Timestamp
                dbKit.UpdatedBy       = context.Security.GetEmail();
                dbKit.UpdatedDateTime = DateTimeOffset.Now.ToString("yyyy/MM/dd HH:mm:ss.fff zzz");

                // IsActive
                dbKit.IsActive = true;

                // Insert
                if (tableName == "PC_Product")
                {
                    // Add
                    dbProduct.Kit = dbKit;

                    // So that the serializer ignores this field
                    dbProduct.Id = 0;

                    // Update
                    var update = Builders <Deathstar.Data.Models.PC_Product> .Update.Combine(
                        Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.Type, dbKit.Type),
                        Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.Description, dbKit.Description),
                        Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.Components, dbKit.Components),
                        Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.CustomFields, dbKit.CustomFields),
                        Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.UpdatedBy, dbKit.UpdatedBy),
                        Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.UpdatedDateTime, dbKit.UpdatedDateTime),
                        Builders <Deathstar.Data.Models.PC_Product> .Update.Set(x => x.Kit.IsActive, true)
                        );

                    // Insert
                    await productCollection.UpdateOneAsync(filters, update);

                    // Building the Response
                    response = dbKit.ConvertToKitResponse();

                    // Add Id
                    response.Id = dbKit.PC_Kit_Id;

                    // ExternalIds
                    if (request.ExternalIds != null && request.ExternalIds.Count > 0)
                    {
                        response.ExternalIds = await _externalIdModel.SaveOrUpdateGenericExternalId(request.ExternalIds, kitTableName, dbKit.PC_Kit_Id, trackingGuid);
                    }
                }
                else
                {
                    // Add
                    dbVariant.Kit = dbKit;

                    // So that the serializer ignores this field
                    dbVariant.Id = 0;

                    // Update
                    var update = Builders <Deathstar.Data.Models.PC_ProductVariant> .Update.Combine(
                        Builders <Deathstar.Data.Models.PC_ProductVariant> .Update.Set(x => x.Kit.Type, dbKit.Type),
                        Builders <Deathstar.Data.Models.PC_ProductVariant> .Update.Set(x => x.Kit.Description, dbKit.Description),
                        Builders <Deathstar.Data.Models.PC_ProductVariant> .Update.Set(x => x.Kit.Components, dbKit.Components),
                        Builders <Deathstar.Data.Models.PC_ProductVariant> .Update.Set(x => x.Kit.CustomFields, dbKit.CustomFields),
                        Builders <Deathstar.Data.Models.PC_ProductVariant> .Update.Set(x => x.Kit.UpdatedBy, dbKit.UpdatedBy),
                        Builders <Deathstar.Data.Models.PC_ProductVariant> .Update.Set(x => x.Kit.UpdatedDateTime, dbKit.UpdatedDateTime),
                        Builders <Deathstar.Data.Models.PC_ProductVariant> .Update.Set(x => x.Kit.IsActive, true)
                        );

                    // Insert
                    await variantCollection.UpdateOneAsync(variantFilters, update);

                    // Building the Response
                    response = dbKit.ConvertToKitResponse();

                    // Add Id
                    response.Id = dbKit.PC_Kit_Id;

                    // ExternalIds
                    if (request.ExternalIds != null && request.ExternalIds.Count > 0)
                    {
                        response.ExternalIds = await _externalIdModel.SaveOrUpdateGenericExternalId(request.ExternalIds, kitTableName, dbKit.PC_Kit_Id, trackingGuid);
                    }
                }


                IG2000.Data.Utilities.Logging.LogTrackingEvent($"Kit (sku: {dbKit.Sku} successfully saved.", "Save Kit", LT319.Common.Utilities.Constants.TrackingStatus.Complete, context, trackingGuid);

                // Trigger the Webhook event
                //if (_useWebhook)
                //{
                //    var whRequest = new WebhookResponse()
                //    {
                //        CompanyId = companyId.ToString(),
                //        Type = "Product",
                //        Scope = "product/created",
                //        Id = response.Id.ToString(),
                //        TrackingGuid = trackingGuid
                //    };

                //    WebhookModel.WebhookTriggerEvent(whRequest, trackingGuid);
                //}

                return(response);
            }
            catch (HttpResponseException webEx)
            {
                IG2000.Data.Utilities.Logging.LogTrackingEvent($"Kit ( Sku: {request.Sku}) failed to save! Reason: {webEx.ReasonPhrase}", $"Status Code: {webEx.StatusCode}", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                throw;
            }
            catch (Exception ex)
            {
                IG2000.Data.Utilities.Logging.LogTrackingEvent($"See logs for additional details", "Failed", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                IG2000.Data.Utilities.ErrorLogger.Report(ex.Message, "KitModel.Update()", context, trackingGuid, System.Diagnostics.EventLogEntryType.Error);
                throw new HttpResponseException()
                      {
                          StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status500InternalServerError, ReasonPhrase = ex.Message
                      };
            }
        }
コード例 #4
0
        /// <summary>
        /// Saves a category assignment
        /// </summary>
        /// <param name="request"></param>
        /// <param name="tableName"></param>
        /// <param name="context"></param>
        /// <param name="trackingGuid"></param>
        /// <returns></returns>
        public async Task <Tagge.Common.Models.ProductCategoryResponse> Save(IBaseContextModel context, Tagge.Common.Models.ProductCategoryRequest request, string tableName, Guid trackingGuid)
        {
            var response = new Tagge.Common.Models.ProductCategoryResponse();

            // Company Id
            var companyId = context.Security.GetCompanyId();

            try
            {
                // MongoDB Settings
                var    database = context.MongoDbSettings.Value.Databases.FirstOrDefault(x => x.Name == "DeathStar");
                string productCollectionName = database.Collections.FirstOrDefault(x => x.Name == "PC_Product").Name;
                string variantCollectionName = database.Collections.FirstOrDefault(x => x.Name == "PC_ProductVariant").Name;

                // Get MongoDB
                var db = context.Database;

                // Word
                var dbCategory = new Deathstar.Data.Models.PC_Category();

                // Id prefix
                string idPrefix = string.Empty;

                // Validate Category
                ////Circular Reference
                string dbCategoryName = await CategoryModel.Validate(request.CategoryId, context, trackingGuid);// _new CategoryModel(context).Validate(request.CategoryId, trackingGuid);

                // Product Category
                var dbProductCategory = new Deathstar.Data.Models.PC_ProductCategory();

                // Convert To Database Object
                dbProductCategory.ConvertToDatabaseObject(dbCategoryName, request);

                // Set Primary Key
                dbProductCategory.SetPrimaryKey(request.InternalId.ToString(), request.CategoryId.ToString());

                // Set Is Active to true
                dbProductCategory.IsActive = true;

                switch (tableName)
                {
                case "PC_Product":
                    var productCollection = db.GetCollection <Deathstar.Data.Models.PC_Product>(productCollectionName);

                    // Product
                    var dbProduct = new Deathstar.Data.Models.PC_Product();

                    // Filters - note always start with the company id
                    var filters = Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                    filters = filters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.Id, request.InternalId);

                    filters = filters & Builders <Deathstar.Data.Models.PC_Product> .Filter.Eq(x => x.IsActive, true);

                    // Find the product
                    dbProduct = await productCollection.Find(filters).FirstOrDefaultAsync();

                    // The product was not valid
                    if (dbProduct == null)
                    {
                        var message = $"Product Id not valid: {request.InternalId}";

                        throw new HttpResponseException()
                              {
                                  StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest, ReasonPhrase = message
                              };
                    }

                    if (dbProduct.Categories != null && dbProduct.Categories.Count > 0)
                    {
                        var dbtempCategory = dbProduct.Categories.FirstOrDefault(x => x.PC_ProductCategory_Id == dbProductCategory.PC_ProductCategory_Id && x.CategoryId == request.CategoryId);

                        if (dbtempCategory == null)
                        {
                            // Add the Category Assignment
                            dbProduct.Categories.Add(dbProductCategory);
                        }
                        else
                        {
                            // Update the Category Assignment
                            dbProductCategory          = dbtempCategory;
                            dbProductCategory.IsActive = true;
                        }
                    }
                    else
                    {
                        // Add the Category Assignment
                        dbProduct.Categories.Add(dbProductCategory);
                    }

                    // Set Product Id to 0 cause of the serializer
                    var productId = dbProduct.Id;
                    dbProduct.Id = 0;

                    var serializerSettings = new JsonSerializerSettings()
                    {
                        NullValueHandling    = NullValueHandling.Ignore,
                        DefaultValueHandling = DefaultValueHandling.Ignore
                    };
                    var update = new BsonDocument()
                    {
                        { "$set", BsonDocument.Parse(JsonConvert.SerializeObject(dbProduct, serializerSettings)) }
                    };

                    // Update database record
                    await productCollection.UpdateOneAsync(filters, update);

                    response = new Common.Models.ProductCategoryResponse()
                    {
                        Id         = dbProductCategory.PC_ProductCategory_Id,
                        ProductId  = productId,
                        CategoryId = request.CategoryId,
                        Type       = "Product"
                    };

                    // Build the Webhook event
                    var whProductRequest = new Sheev.Common.Models.WebhookResponse()
                    {
                        CompanyId    = companyId.ToString(),
                        Type         = "Product Category Assignment",
                        Scope        = $"product/category/created",
                        Id           = response.Id,
                        TrackingGuid = trackingGuid
                    };

                    // Trigger the Webhook event
                    await _webHookModel.FireWebhookEvent(whProductRequest, context, trackingGuid);

                    break;

                case "PC_ProductVariant":
                    var variantCollection = db.GetCollection <Deathstar.Data.Models.PC_ProductVariant>(variantCollectionName);

                    // Variant
                    var dbVariant = new Deathstar.Data.Models.PC_ProductVariant();

                    var variantFilter = Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.Id, request.InternalId);

                    variantFilter = variantFilter & Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.IsActive, true);

                    variantFilter = variantFilter & Builders <Deathstar.Data.Models.PC_ProductVariant> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                    dbVariant = await variantCollection.Find(variantFilter).FirstOrDefaultAsync();

                    if (dbVariant == null)
                    {
                        var message = $"Product Variant Id not valid: {request.InternalId}";

                        throw new HttpResponseException()
                              {
                                  StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest, ReasonPhrase = message
                              };
                    }

                    if (dbVariant.Categories != null && dbVariant.Categories.Count > 0)
                    {
                        var dbtempCategory = dbVariant.Categories.FirstOrDefault(x => x.PC_ProductCategory_Id == dbProductCategory.PC_ProductCategory_Id && x.CategoryId == request.CategoryId && x.IsActive);

                        if (dbtempCategory == null)
                        {
                            // Add the Category Assignment
                            dbVariant.Categories.Add(dbProductCategory);
                        }
                        else
                        {
                            // Update the Category Assignment
                            dbProductCategory          = dbtempCategory;
                            dbProductCategory.IsActive = true;
                        }
                    }
                    else
                    {
                        // Add the Category Assignment
                        dbVariant.Categories.Add(dbProductCategory);
                    }

                    // Set Product Id to 0 cause of the serializer
                    var variantId = dbVariant.Id;
                    dbVariant.Id = 0;

                    var variantSerializerSettings = new JsonSerializerSettings()
                    {
                        NullValueHandling    = NullValueHandling.Ignore,
                        DefaultValueHandling = DefaultValueHandling.Ignore
                    };

                    var variantUpdate = new BsonDocument()
                    {
                        { "$set", BsonDocument.Parse(JsonConvert.SerializeObject(dbVariant, variantSerializerSettings)) }
                    };

                    // Update database record
                    await variantCollection.UpdateOneAsync(variantFilter, variantUpdate);

                    response = new Common.Models.ProductCategoryResponse()
                    {
                        Id         = dbProductCategory.PC_ProductCategory_Id,
                        ProductId  = variantId,
                        CategoryId = request.CategoryId,
                        Type       = "Variant"
                    };

                    // Build the Webhook event
                    var whVariantRequest = new Sheev.Common.Models.WebhookResponse()
                    {
                        CompanyId    = companyId.ToString(),
                        Type         = "Product Category Assignment",
                        Scope        = $"product/variant/category/created",
                        Id           = response.Id,
                        TrackingGuid = trackingGuid
                    };

                    // Trigger the Webhook event
                    await _webHookModel.FireWebhookEvent(whVariantRequest, context, trackingGuid);

                    break;

                default:
                    throw new HttpResponseException()
                          {
                              StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest, ReasonPhrase = $"Invalid Type: {tableName}. Please specify a correct type: Product or Variant"
                          };
                }

                return(response);
            }
            catch (HttpResponseException webEx)
            {
                IG2000.Data.Utilities.Logging.LogTrackingEvent($"Inventory failed to save! Reason: {webEx.ReasonPhrase}", $"Status Code: {webEx.StatusCode}", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                throw;
            }
            catch (Exception ex)
            {
                IG2000.Data.Utilities.Logging.LogTrackingEvent($"See logs for additional details", "Failed", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                IG2000.Data.Utilities.ErrorLogger.Report(ex.Message, "InventoryModel.Save()", context, trackingGuid, System.Diagnostics.EventLogEntryType.Error);
                throw new HttpResponseException()
                      {
                          StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status500InternalServerError, ReasonPhrase = ex.Message
                      };
            }
        }