public Tagge.Common.Models.CategorySetResponse ConvertToResponse()
        {
            var response = new Tagge.Common.Models.CategorySetResponse();

            // Properties
            response.Id          = Id;
            response.Name        = Name;
            response.Description = Description;

            // Categories
            if (Categories != null)
            {
                response.Categories = new List <Sheev.Common.Models.GenericResponse>();
                foreach (var category in Categories)
                {
                    var singleSimpleResponse = new Sheev.Common.Models.GenericResponse()
                    {
                        Id   = category.InternalId.ToString(),
                        Name = category.Name
                    };

                    response.Categories.Add(singleSimpleResponse);
                }
            }

            // Custom Fields
            if (CustomFields != null)
            {
                response.CustomFields = new List <Tagge.Common.Models.GenericCustomFieldResponse>();
                foreach (var customField in CustomFields)
                {
                    response.CustomFields.Add(customField.ConvertToResponse());
                }
            }

            // ExternalIds - Managed in PC_ExternalId

            return(response);
        }
        /// <summary>
        /// Updates an existing category set
        /// </summary>
        /// <param name="id"></param>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <param name="trackingGuid"></param>
        /// <returns></returns>
        //public async Task<Tagge.Common.Models.CategorySetResponse> Update(long id, Tagge.Common.Models.CategorySetRequest request, Models.ContextModel context, Guid trackingGuid)
        public async Task <Tagge.Common.Models.CategorySetResponse> Update(IBaseContextModel context, long id, Tagge.Common.Models.CategorySetRequest request, Guid trackingGuid)
        {
            var response  = new Tagge.Common.Models.CategorySetResponse();
            var companyId = context.Security.GetCompanyId();

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

                //// Get MongoDB
                //var db = context.Database;
                //var categorySetCollection = db.GetCollection<Deathstar.Data.Models.PC_CategorySet>(collectionName);
                var counterCollection = context.Database.GetCollection <Deathstar.Data.Models.Counter>("Counters");

                // Word
                var dbCategorySet = new Deathstar.Data.Models.PC_CategorySet();

                // Check to see if the Category Set is a duplicate
                var duplicatefilter = Builders <Deathstar.Data.Models.PC_CategorySet> .Filter.Eq(x => x.DV_CompanyId, companyId.ToString());

                duplicatefilter = duplicatefilter & Builders <Deathstar.Data.Models.PC_CategorySet> .Filter.Eq(x => x.Id, id);

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

                var categoryExists = _categorySetCollection.Find(duplicatefilter).FirstOrDefault();

                if (categoryExists == null)
                {
                    throw new HttpResponseException()
                          {
                              StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status400BadRequest, ReasonPhrase = $"Category Set Already Exists. Use PUT to update category. (Id = {categoryExists.Id})!"
                          }
                }
                ;

                // Validate Category Sets
                await Validate(context, request.Categories, trackingGuid);////new CategoryModel(context).Validate(request.Categories, trackingGuid);

                // Convert request to Category
                dbCategorySet.ConvertToDatabaseObject(companyId.ToString(), request);

                // Categories
                if (request.Categories != null && request.Categories.Count > 0)
                {
                    foreach (var category in request.Categories)
                    {
                        dbCategorySet.Categories.Add(new Deathstar.Data.Models.TM_GenericEntry()
                        {
                            Name       = category.Name,
                            InternalId = category.Id
                        });
                    }
                }

                // Custom Fields
                if (request.CustomFields != null && request.CustomFields.Count > 0)
                {
                    dbCategorySet.CustomFields = await _customFielModel.SaveOrUpdateGenericCustomFields(request.CustomFields, categoryExists.CustomFields, "PC_CategorySet", id.ToString(), trackingGuid);
                }

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

                dbCategorySet.IsActive = true;

                // filter
                var filters = Builders <Deathstar.Data.Models.PC_CategorySet> .Filter.Eq(x => x.Id, id);

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

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

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

                var update = new BsonDocument()
                {
                    { "$set", BsonDocument.Parse(JsonConvert.SerializeObject(dbCategorySet, serializerSettings)) }
                };


                // Save or Update database record
                await _categorySetCollection.UpdateOneAsync(filters, update);

                // Building the Response
                response = dbCategorySet.ConvertToResponse();

                // Add Id
                response.Id = id;

                // ExternalIds
                if (request.ExternalIds != null && request.ExternalIds.Count > 0)
                {
                    response.ExternalIds = await _externalIdModel.SaveOrUpdateGenericExternalId(request.ExternalIds, "PC_CategorySet", id.ToString(), trackingGuid);
                }


                IG2000.Data.Utilities.Logging.LogTrackingEvent($"Category Set (id: {dbCategorySet.Id}, name: {dbCategorySet.Name}) successfully saved.", "Save Category Set", LT319.Common.Utilities.Constants.TrackingStatus.Complete, context, trackingGuid);

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

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

                return(response);
            }
            catch (HttpResponseException webEx)
            {
                IG2000.Data.Utilities.Logging.LogTrackingEvent($"Category Set ( Name: {request.Name}) 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, "CategorySet.Save()", context, trackingGuid, System.Diagnostics.EventLogEntryType.Error);
                throw new HttpResponseException()
                      {
                          StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status500InternalServerError, ReasonPhrase = ex.Message
                      };
            }
        }