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