mirror of
https://gitea.gofwd.group/Forward_Group/ballistic-builder-spring.git
synced 2025-12-05 18:46:44 -05:00
working pipeline. curl admin/imports/4 imported a test product into the db.
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
package group.goforward.ballistic.imports;
|
package group.goforward.ballistic.imports;
|
||||||
|
|
||||||
public interface MerchantFeedImportService {
|
public interface MerchantFeedImportService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import the feed for a given merchant id.
|
||||||
|
*/
|
||||||
void importMerchantFeed(Integer merchantId);
|
void importMerchantFeed(Integer merchantId);
|
||||||
}
|
}
|
||||||
@@ -1,16 +1,108 @@
|
|||||||
package group.goforward.ballistic.imports;
|
package group.goforward.ballistic.imports;
|
||||||
|
|
||||||
|
import group.goforward.ballistic.model.Brand;
|
||||||
|
import group.goforward.ballistic.model.Merchant;
|
||||||
|
import group.goforward.ballistic.model.Product;
|
||||||
|
import group.goforward.ballistic.repos.BrandRepository;
|
||||||
|
import group.goforward.ballistic.repos.MerchantRepository;
|
||||||
|
import group.goforward.ballistic.repos.ProductRepository;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional
|
@Transactional
|
||||||
public class MerchantFeedImportServiceImpl implements MerchantFeedImportService {
|
public class MerchantFeedImportServiceImpl implements MerchantFeedImportService {
|
||||||
|
|
||||||
|
private final MerchantRepository merchantRepository;
|
||||||
|
private final BrandRepository brandRepository;
|
||||||
|
private final ProductRepository productRepository;
|
||||||
|
|
||||||
|
public MerchantFeedImportServiceImpl(MerchantRepository merchantRepository,
|
||||||
|
BrandRepository brandRepository,
|
||||||
|
ProductRepository productRepository) {
|
||||||
|
this.merchantRepository = merchantRepository;
|
||||||
|
this.brandRepository = brandRepository;
|
||||||
|
this.productRepository = productRepository;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void importMerchantFeed(Integer merchantId) {
|
public void importMerchantFeed(Integer merchantId) {
|
||||||
// TODO: real import logic will be re-added.
|
System.out.println("IMPORT >>> importMerchantFeed(" + merchantId + ")");
|
||||||
// This stub exists to fix the repository/package mixup and get the project compiling again.
|
|
||||||
throw new UnsupportedOperationException("Merchant feed import not yet implemented after refactor.");
|
Merchant merchant = merchantRepository.findById(merchantId)
|
||||||
|
.orElseThrow(() -> new IllegalArgumentException("Merchant not found: " + merchantId));
|
||||||
|
|
||||||
|
// For now, just pick a brand to prove inserts work.
|
||||||
|
Brand brand = brandRepository.findByNameIgnoreCase("Aero Precision")
|
||||||
|
.orElseThrow(() -> new IllegalStateException("Brand 'Aero Precision' not found"));
|
||||||
|
|
||||||
|
// Fake a single row – we’ll swap this for real CSV parsing once the plumbing works
|
||||||
|
MerchantFeedRow row = new MerchantFeedRow(
|
||||||
|
"TEST-SKU-001",
|
||||||
|
"APPG100002",
|
||||||
|
brand.getName(),
|
||||||
|
"Test Product From Import",
|
||||||
|
null, null, null, null, null,
|
||||||
|
null, null, null, null, null,
|
||||||
|
null, null,
|
||||||
|
null, null, null, null, null, null, null, null
|
||||||
|
);
|
||||||
|
|
||||||
|
Product p = createProduct(brand, row);
|
||||||
|
System.out.println("IMPORT >>> created product id=" + p.getId()
|
||||||
|
+ ", name=" + p.getName()
|
||||||
|
+ ", merchant=" + merchant.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Product createProduct(Brand brand, MerchantFeedRow row) {
|
||||||
|
System.out.println("IMPORT >>> createProduct brand=" + brand.getName()
|
||||||
|
+ ", sku=" + row.sku()
|
||||||
|
+ ", productName=" + row.productName());
|
||||||
|
|
||||||
|
Product p = new Product();
|
||||||
|
p.setBrand(brand);
|
||||||
|
|
||||||
|
String name = row.productName();
|
||||||
|
if (name == null || name.isBlank()) {
|
||||||
|
name = row.sku();
|
||||||
|
}
|
||||||
|
if (name == null || name.isBlank()) {
|
||||||
|
name = "Unknown Product";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set required fields: name and slug
|
||||||
|
p.setName(name);
|
||||||
|
|
||||||
|
// Generate a simple slug from the name (fallback to SKU if needed)
|
||||||
|
String baseForSlug = name;
|
||||||
|
if (baseForSlug == null || baseForSlug.isBlank()) {
|
||||||
|
baseForSlug = row.sku();
|
||||||
|
}
|
||||||
|
if (baseForSlug == null || baseForSlug.isBlank()) {
|
||||||
|
baseForSlug = "product-" + System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
String slug = baseForSlug
|
||||||
|
.toLowerCase()
|
||||||
|
.replaceAll("[^a-z0-9]+", "-")
|
||||||
|
.replaceAll("(^-|-$)", "");
|
||||||
|
|
||||||
|
if (slug.isBlank()) {
|
||||||
|
slug = "product-" + System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
p.setSlug(slug);
|
||||||
|
|
||||||
|
if (p.getPlatform() == null || p.getPlatform().isBlank()) {
|
||||||
|
p.setPlatform("AR-15");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p.getPartRole() == null || p.getPartRole().isBlank()) {
|
||||||
|
p.setPartRole("unknown");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return productRepository.save(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package group.goforward.ballistic.imports;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
public record MerchantFeedRow(
|
||||||
|
String sku,
|
||||||
|
String manufacturerId,
|
||||||
|
String brandName,
|
||||||
|
String productName,
|
||||||
|
String longDescription,
|
||||||
|
String shortDescription,
|
||||||
|
String department,
|
||||||
|
String category,
|
||||||
|
String subCategory,
|
||||||
|
String thumbUrl,
|
||||||
|
String imageUrl,
|
||||||
|
String buyLink,
|
||||||
|
String keywords,
|
||||||
|
String reviews,
|
||||||
|
BigDecimal retailPrice,
|
||||||
|
BigDecimal salePrice,
|
||||||
|
String brandPageLink,
|
||||||
|
String brandLogoImage,
|
||||||
|
String productPageViewTracking,
|
||||||
|
String variantsXml,
|
||||||
|
String mediumImageUrl,
|
||||||
|
String productContentWidget,
|
||||||
|
String googleCategorization,
|
||||||
|
String itemBasedCommission
|
||||||
|
) {}
|
||||||
@@ -1,11 +1,17 @@
|
|||||||
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Product;
|
import group.goforward.ballistic.model.Product;
|
||||||
import group.goforward.ballistic.model.Brand;
|
import group.goforward.ballistic.model.Brand;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface ProductRepository extends JpaRepository<Product, Integer> {
|
public interface ProductRepository extends JpaRepository<Product, Integer> {
|
||||||
|
|
||||||
Optional<Product> findByUuid(UUID uuid);
|
Optional<Product> findByUuid(UUID uuid);
|
||||||
|
|
||||||
Optional<Product> findByBrandAndMpn(Brand brand, String mpn);
|
Optional<Product> findByBrandAndMpn(Brand brand, String mpn);
|
||||||
|
|
||||||
Optional<Product> findByBrandAndUpc(Brand brand, String upc);
|
Optional<Product> findByBrandAndUpc(Brand brand, String upc);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user