Пример #1
0
        /// <summary>
        /// Convert to Response used for kit only
        /// </summary>
        /// <returns></returns>
        public Tagge.Common.Models.KitResponse ConvertToKitResponse()
        {
            var response = new Tagge.Common.Models.KitResponse();

            // Properties
            response.Id          = PC_Kit_Id;
            response.Sku         = Sku;
            response.Description = Description;
            response.Type        = Type;

            // Components
            if (Components != null)
            {
                response.Components = new List <Tagge.Common.Models.KitComponentResponse>();
                foreach (var component in Components)
                {
                    response.Components.Add(component.ConvertToResponse());
                }
            }

            // 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);
        }
Пример #2
0
        /// <summary>
        /// Convert To Response when part of a bigger item
        /// </summary>
        /// <param name="companyId"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public Tagge.Common.Models.KitResponse ConvertToResponse(string companyId, string tableName, IMongoDatabase db)
        {
            var response = new Tagge.Common.Models.KitResponse();

            // Properties
            response.Id          = PC_Kit_Id;
            response.Sku         = Sku;
            response.Description = Description;
            response.Type        = Type;

            // Components
            if (Components != null)
            {
                response.Components = new List <Tagge.Common.Models.KitComponentResponse>();
                foreach (var component in Components)
                {
                    response.Components.Add(component.ConvertToResponse(companyId, tableName, db));
                }
            }

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

            // ExternalIds
            response.ExternalIds = PC_ExternalId.ConvertToResponse(PC_Kit_Id, tableName, companyId, db);

            return(response);
        }
Пример #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>
        /// Get a kit by id
        /// </summary>
        /// <param name="id"></param>
        /// <param name="context"></param>
        /// <param name="trackingGuid"></param>
        /// <returns></returns>
        public async Task <Tagge.Common.Models.KitResponse> GetById(string id, Guid trackingGuid)
        {
            var response  = new Tagge.Common.Models.KitResponse();
            var companyId = context.Security.GetCompanyId();

            // MongoDB Settings
            var    database              = context.MongoDbSettings.Value.Databases.FirstOrDefault(x => x.Name == "DeathStar");
            string collectionName        = 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>(collectionName);
            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);

            // 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);

            // Does the product exist?
            var dbProduct = await productCollection.FindAsync(filters).Result.FirstOrDefaultAsync();

            // Looks like it does
            if (dbProduct != null)
            {
                // Build the Product version Response
                response = dbProduct.Kit.ConvertToKitResponse();

                // Add Id
                response.Id = dbProduct.Kit.PC_Kit_Id;

                // External Ids
                response.ExternalIds = await _externalIdModel.GetByParentId(dbProduct.Kit.PC_Kit_Id.ToString(), "PC_Kit", trackingGuid);
            }
            else
            {
                // Product wasnt found now gotta try the variant
                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, parentId);

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

                // Where in the world is the variant?
                var dbVariant = await variantCollection.FindAsync(variantFilters).Result.FirstOrDefaultAsync();

                // Its missing of course!
                if (dbVariant == null)
                {
                    string reason = $"Kit not found by Id:{id} provided.";

                    IG2000.Data.Utilities.Logging.LogTrackingEvent($"Kit was unable to be retrieved! Reason: {reason}", $"Status Code: {Microsoft.AspNetCore.Http.StatusCodes.Status404NotFound}", LT319.Common.Utilities.Constants.TrackingStatus.Error, context, trackingGuid);
                    throw new HttpResponseException()
                          {
                              StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status404NotFound, ReasonPhrase = reason
                          };
                }

                // Build the Variant version Response
                response = dbVariant.Kit.ConvertToKitResponse();

                // Add Id
                response.Id = dbVariant.Kit.PC_Kit_Id;

                // External Ids
                response.ExternalIds = await _externalIdModel.GetByParentId(dbVariant.Kit.PC_Kit_Id.ToString(), "PC_VariantKit", trackingGuid);
            }

            //IG2000.Data.Utilities.Logging.LogTrackingEvent($"Product (id: {dbProduct.Id}, sku: {dbProduct.Sku}) successfully retrieved.", "Get Product (MongoDB)", LT319.Common.Utilities.Constants.TrackingStatus.Complete, trackingGuid);

            return(response);
        }