Code-complete v2 vehicle API
This commit is contained in:
320
PartSource.Automation/Jobs/AddAndUpdateProducts.cs
Normal file
320
PartSource.Automation/Jobs/AddAndUpdateProducts.cs
Normal file
@@ -0,0 +1,320 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using PartSource.Automation.Jobs.Interfaces;
|
||||
using PartSource.Automation.Models;
|
||||
using PartSource.Data;
|
||||
using PartSource.Data.Models;
|
||||
using PartSource.Services.Integrations;
|
||||
using Ratermania.Shopify.Entities;
|
||||
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<AutomationJobResult> Run()
|
||||
{
|
||||
//await SyncronizeIdsAndSkus();
|
||||
//await AddSkus();
|
||||
await AddVariants();
|
||||
|
||||
return new AutomationJobResult
|
||||
{
|
||||
IsSuccess = true
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ensures syncronization between Shopify IDs and Partsource SKUs
|
||||
/// </summary>
|
||||
private async Task SyncronizeIdsAndSkus()
|
||||
{
|
||||
IEnumerable<Product> products = await _shopifyClient.Products.Get();
|
||||
|
||||
_partSourceContext.Database.ExecuteSqlCommand("UPDATE ImportData SET ShopifyId = NULL");
|
||||
|
||||
while (products != null && products.Any())
|
||||
{
|
||||
foreach (Product product in products)
|
||||
{
|
||||
foreach (ProductVariant 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<ImportData> 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<ProductImage> productImages = new List<ProductImage>();
|
||||
|
||||
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<string> productTags = new List<string>
|
||||
{
|
||||
items[0].LineCode,
|
||||
items[0].PartNumber,
|
||||
};
|
||||
|
||||
List<ProductVariant> productVariants = new List<ProductVariant>();
|
||||
|
||||
//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<ImportData> 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<ProductImage> productImages = new List<ProductImage>();
|
||||
|
||||
if (!string.IsNullOrEmpty(items[0].ImageSrc))
|
||||
{
|
||||
productImages = items.SelectMany(v =>
|
||||
{
|
||||
IList<ProductImage> images = new List<ProductImage>();
|
||||
|
||||
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<string> productTags = new List<string>
|
||||
{
|
||||
items[0].LineCode,
|
||||
items[0].PartNumber,
|
||||
};
|
||||
|
||||
List<ProductVariant> productVariants = new List<ProductVariant>();
|
||||
|
||||
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);
|
||||
// }
|
||||
//}
|
||||
}
|
||||
Reference in New Issue
Block a user