using Microsoft.EntityFrameworkCore; using PartSource.Automation.Jobs.Interfaces; using PartSource.Automation.Models; using PartSource.Data; using PartSource.Data.Models; using Ratermania.Shopify; using Ratermania.Shopify.Resources; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace PartSource.Automation.Jobs { public class AddAndUpdateProducts : IAutomationJob { private readonly PartSourceContext _partSourceContext; private readonly ShopifyClient _shopifyClient; public AddAndUpdateProducts(PartSourceContext partSourceContext, ShopifyClient shopifyClient) { _partSourceContext = partSourceContext; _shopifyClient = shopifyClient; } public async Task Run() { //throw new Exception("You need to add a ProductVariant resource to the Shopify client"); await SyncronizeIdsAndSkus(); //await AddSkus(); // await AddVariants(); return new AutomationJobResult { IsSuccess = true }; } /// /// Ensures syncronization between Shopify IDs and Partsource SKUs /// private async Task SyncronizeIdsAndSkus() { IEnumerable products = await _shopifyClient.Products.Get(); _partSourceContext.Database.ExecuteSqlCommand("UPDATE ImportData SET ShopifyId = NULL"); while (products != null && products.Any()) { foreach (Product product in products) { foreach (Variant variant in product.Variants) { ImportData importData = _partSourceContext.ImportData.FirstOrDefault(i => i.VariantSku == variant.Sku); if (importData != null) { importData.ShopifyId = product.Id; } } } await _partSourceContext.SaveChangesAsync(); try { products = await _shopifyClient.Products.GetNext(); } catch { products = await _shopifyClient.Products.GetPrevious(); } } } public async Task AddSkus() { IList items = _partSourceContext.ImportData .Where(i => i.IsVariant == null && i.ShopifyId == null) // .OrderBy(i => i.Title) .ToList(); // items = items.Where(i => i.Title == items.First().Title).ToList(); // foreach (ImportData importData in items) { try { // Images IList productImages = new List(); if (!string.IsNullOrEmpty(importData.ImageSrc)) { foreach (string src in importData?.ImageSrc.Split(',')) { productImages.Add(new ProductImage { Src = src, Alt = importData.ImageAltText }); } if (productImages.Count > 0) { productImages.Add(new ProductImage { Src = "https://cdn.shopify.com/s/files/1/2239/4255/files/No_Image_Found.jpg", Alt = "No Image Found" }); } } // Product Tags List productTags = new List { items[0].LineCode, items[0].PartNumber, }; //List productVariants = new List(); ////foreach (ImportData itemVariant in items) ////{ //productVariants.Add(new ProductVariant //{ // InventoryPolicy = "Deny", // CompareAtPrice = importData.CompareAt, // Price = importData.Price, // Sku = importData.VariantSku, // Title = importData.VariantTitle ?? importData.Title, // Option1 = importData.VariantTitle, // RequiresShipping = false, //}); //} Product requestData = new Product { BodyHtml = importData.BodyHtml, Title = importData.Title, Vendor = importData.Vendor, Tags = string.Join(",", productTags), Published = true, //ProductType = importData.FINELINE_NM, Images = productImages.ToArray(), //Variants = productVariants.ToArray(), CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }; requestData = await _shopifyClient.Products.Add(requestData); if (requestData.Id > 0) { //foreach (ImportData variant in items) //{ // variant.ShopifyId = requestData.Id; //} importData.ShopifyId = requestData.Id; _partSourceContext.SaveChanges(); Console.WriteLine($"{importData.VariantSku}"); } else { Console.WriteLine($"SHOPIFY ID WAS 0 - {importData.VariantSku}"); } } catch (Exception ex) { Console.WriteLine($"Failed to add SKU {importData.VariantSku}: {ex.StackTrace}"); } //items = _partSourceContext.ImportData // .Where(i => i.Title == _partSourceContext.ImportData.First(d => d.ShopifyId == null).Title) // .ToList(); } } public async Task AddVariants() { IList items = _partSourceContext.ImportData .Where(i => i.IsVariant.Value && i.ShopifyId == null) .OrderBy(i => i.Title) .ToList(); items = items.Where(i => i.Title == items.First().Title).ToList(); while (items != null && items.Count > 0) { // Images IList productImages = new List(); if (!string.IsNullOrEmpty(items[0].ImageSrc)) { productImages = items.SelectMany(v => { IList images = new List(); foreach (string src in v.ImageSrc?.Split(',')) { images.Add(new ProductImage { Src = src, Alt = v.ImageAltText }); } return images; }).ToList(); if (productImages.Count > 0) { productImages.Add(new ProductImage { Src = "https://cdn.shopify.com/s/files/1/2239/4255/files/No_Image_Found.jpg", Alt = "No Image Found" }); } } // Product Tags List productTags = new List { items[0].LineCode, items[0].PartNumber, }; //List productVariants = new List(); //foreach (ImportData itemVariant in items) //{ // productVariants.Add(new ProductVariant // { // InventoryPolicy = "Deny", // CompareAtPrice = itemVariant.CompareAt, // Price = itemVariant.Price, // Sku = itemVariant.VariantSku, // Title = itemVariant.VariantTitle, // Option1 = itemVariant.VariantTitle, // RequiresShipping = false, // }); //} Product requestData = new Product { BodyHtml = items[0].BodyHtml, Title = items[0].Title, Vendor = items[0].Vendor, Tags = string.Join(",", productTags), Published = true, //ProductType = importData.FINELINE_NM, Images = productImages.ToArray(), //Variants = productVariants.ToArray(), CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }; requestData = await _shopifyClient.Products.Add(requestData); if (requestData.Id > 0) { foreach (ImportData variant in items) { variant.ShopifyId = requestData.Id; } _partSourceContext.SaveChanges(); Console.WriteLine($"{items[0].VariantSku}"); } else { Console.WriteLine($"SHOPIFY ID WAS 0 - {items[0].VariantSku}"); } ImportData next = _partSourceContext.ImportData.FirstOrDefault(i => i.IsVariant != null && i.ShopifyId == null); if (next != null) { items = _partSourceContext.ImportData .Where(i => i.Title == next.Title) .ToList(); } else { items = null; } } } } //private void Log(string message) //{ // try // { // using (FileStream fileStream = File.OpenWrite(@"C:\users\tommy\desktop\log.txt")) // { // fileStream.Write(Encoding.UTF8.GetBytes(message + "\n")); // } // } // catch // { // // LOL Fix this // Log(message); // } //} }