more organization may need more feature packages like AI

This commit is contained in:
2026-01-06 14:42:23 -05:00
parent f0f12d76a6
commit 3f1e6f7f42
59 changed files with 82 additions and 74 deletions

View File

@@ -3,7 +3,7 @@ package group.goforward.battlbuilder.classification.admin;
import group.goforward.battlbuilder.classification.ClassificationResult;
import group.goforward.battlbuilder.classification.ProductClassifier;
import group.goforward.battlbuilder.model.MerchantCategoryMap;
import group.goforward.battlbuilder.model.PartRoleSource;
import group.goforward.battlbuilder.model.enums.PartRoleSource;
import group.goforward.battlbuilder.model.Product;
import group.goforward.battlbuilder.repos.ProductRepository;
import group.goforward.battlbuilder.repos.ProductOfferRepository;

View File

@@ -1,5 +1,5 @@
// MerchantAdminController.java
package group.goforward.battlbuilder.controllers;
package group.goforward.battlbuilder.controllers.admin;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;

View File

@@ -1,4 +1,4 @@
package group.goforward.battlbuilder.controllers;
package group.goforward.battlbuilder.controllers.admin;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

View File

@@ -1,9 +1,9 @@
package group.goforward.battlbuilder.controllers.api;
package group.goforward.battlbuilder.controllers.api.v1;
import group.goforward.battlbuilder.common.ApiResponse;
import group.goforward.battlbuilder.dto.EmailRequestDto;
import group.goforward.battlbuilder.model.EmailRequest;
import group.goforward.battlbuilder.model.EmailStatus;
import group.goforward.battlbuilder.model.enums.EmailStatus;
import group.goforward.battlbuilder.repos.EmailRequestRepository;
import group.goforward.battlbuilder.services.utils.EmailService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -16,7 +16,7 @@ import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("/api/email")
@RequestMapping({"/api/email","/api/v1/email"})
public class EmailController {
private static final EmailStatus EMAIL_STATUS_SENT = EmailStatus.SENT;

View File

@@ -1,4 +1,4 @@
package group.goforward.battlbuilder.controllers.api;
package group.goforward.battlbuilder.controllers.api.v1;
import group.goforward.battlbuilder.model.ImageMeta;
import group.goforward.battlbuilder.security.UserPrincipal;
@@ -14,7 +14,7 @@ import java.io.InputStream;
import java.time.Duration;
@RestController
@RequestMapping("/api/images")
@RequestMapping({"/api/images", "/api/v1/images"})
public class ImageController {
private final ImageService imageService;

View File

@@ -1,9 +1,9 @@
package group.goforward.battlbuilder.specs;
package group.goforward.battlbuilder.domain.specs;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.model.Product;
import group.goforward.battlbuilder.model.ProductStatus;
import group.goforward.battlbuilder.model.ProductVisibility;
import group.goforward.battlbuilder.model.enums.ProductStatus;
import group.goforward.battlbuilder.model.enums.ProductVisibility;
import group.goforward.battlbuilder.web.dto.admin.AdminProductSearchRequest;
import org.springframework.data.jpa.domain.Specification;

View File

@@ -13,7 +13,7 @@ import java.util.HashMap;
import java.util.Map;
@Entity
@Table(name = "product_enrichments")
@Table(name = "product_enrichments", schema = "public")
public class ProductEnrichment {
@Id

View File

@@ -10,7 +10,7 @@ import java.time.OffsetDateTime;
import java.util.UUID;
@Entity
@Table(name = "accounts")
@Table(name = "accounts", schema = "public" )
public class Account {
@Id
@ColumnDefault("gen_random_uuid()")

View File

@@ -5,7 +5,7 @@ import jakarta.persistence.*;
import java.time.OffsetDateTime;
@Entity
@Table(name = "affiliate_category_map")
@Table(name = "affiliate_category_map", schema = "public")
public class AffiliateCategoryMap {
@Id

View File

@@ -6,6 +6,7 @@ import java.time.OffsetDateTime;
@Entity
@Table(
name = "auth_tokens",
schema = "public",
indexes = {
@Index(name = "idx_auth_tokens_email", columnList = "email"),
@Index(name = "idx_auth_tokens_type_hash", columnList = "type, token_hash")

View File

@@ -8,7 +8,8 @@ import java.time.Instant;
import java.util.UUID;
@Entity
@Table(name = "brands")
@Table(name = "brands",
schema = "public")
public class Brand {
@Id

View File

@@ -8,7 +8,7 @@ import java.time.OffsetDateTime;
import java.util.UUID;
@Entity
@Table(name = "builds")
@Table(name = "builds", schema = "public")
public class Build {
// -----------------------------------------------------

View File

@@ -10,7 +10,7 @@ import java.time.OffsetDateTime;
import java.util.UUID;
@Entity
@Table(name = "build_items")
@Table(name = "build_items", schema = "public")
public class BuildItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

View File

@@ -14,7 +14,7 @@ import java.time.OffsetDateTime;
* - Keep it lightweight. Anything social (votes/comments/media) lives elsewhere.
*/
@Entity
@Table(name = "build_profiles")
@Table(name = "build_profiles", schema = "public")
public class BuildProfile {
// -----------------------------------------------------

View File

@@ -7,7 +7,7 @@ import java.time.OffsetDateTime;
import java.time.ZoneOffset;
@Entity
@Table(name = "canonical_categories")
@Table(name = "canonical_categories", schema = "public")
public class CanonicalCategory {
@Id

View File

@@ -5,7 +5,7 @@ import jakarta.persistence.*;
import java.time.OffsetDateTime;
@Entity
@Table(name = "category_mappings")
@Table(name = "category_mappings", schema = "public")
public class CategoryMapping {
@Id

View File

@@ -1,11 +1,12 @@
package group.goforward.battlbuilder.model;
import group.goforward.battlbuilder.model.enums.EmailStatus;
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "email_requests")
@Table(name = "email_requests", schema = "public")
@NamedQueries({
@NamedQuery(
name = "EmailRequest.findSent",

View File

@@ -5,7 +5,7 @@ import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "email_template")
@Table(name = "email_template", schema = "public")
public class EmailTemplate {
@Id

View File

@@ -5,7 +5,7 @@ import jakarta.persistence.*;
import java.time.Instant;
@Entity
@Table(name = "feed_imports")
@Table(name = "feed_imports", schema = "public")
public class FeedImport {
@Id

View File

@@ -3,7 +3,7 @@ package group.goforward.battlbuilder.model;
import jakarta.persistence.*;
@Entity
@Table(name = "image_blob")
@Table(name = "image_blob", schema = "public")
public class ImageBlob {
@Id

View File

@@ -3,7 +3,7 @@ import jakarta.persistence.*;
import java.time.Instant;
@Entity
@Table(name = "image_meta")
@Table(name = "image_meta", schema = "public")
public class ImageMeta {
@Id

View File

@@ -6,7 +6,7 @@ import org.hibernate.annotations.ColumnDefault;
import java.time.OffsetDateTime;
@Entity
@Table(name = "merchants")
@Table(name = "merchants", schema = "public")
public class Merchant {
@Id

View File

@@ -7,7 +7,7 @@ import java.time.OffsetDateTime;
import java.util.UUID;
@Entity
@Table(name = "part_categories")
@Table(name = "part_categories", schema = "public")
public class PartCategory {
@Id

View File

@@ -4,7 +4,7 @@ import jakarta.persistence.*;
import java.time.OffsetDateTime;
@Entity
@Table(name = "part_role_mappings")
@Table(name = "part_role_mappings", schema = "public")
public class PartRoleMapping {
@Id

View File

@@ -4,7 +4,7 @@ import jakarta.persistence.*;
import java.time.Instant;
@Entity
@Table(name = "part_role_rules")
@Table(name = "part_role_rules", schema = "public")
public class PartRoleRule {
@Id

View File

@@ -7,7 +7,7 @@ import org.hibernate.annotations.ColumnDefault;
import java.time.OffsetDateTime;
@Entity
@Table(name = "platforms")
@Table(name = "platforms", schema = "public")
public class Platform {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

View File

@@ -5,7 +5,7 @@ import jakarta.persistence.*;
import java.time.OffsetDateTime;
@Entity
@Table(name = "platform_rules")
@Table(name = "platform_rules", schema = "public")
public class PlatformRule {
@Id

View File

@@ -6,7 +6,7 @@ import java.math.BigDecimal;
import java.time.Instant;
@Entity
@Table(name = "price_history")
@Table(name = "price_history", schema = "public")
public class PriceHistory {
@Id

View File

@@ -1,5 +1,6 @@
package group.goforward.battlbuilder.model;
import group.goforward.battlbuilder.model.enums.*;
import jakarta.persistence.*;
import java.time.Instant;
import java.util.UUID;
@@ -10,7 +11,7 @@ import java.util.Set;
import java.util.HashSet;
@Entity
@Table(name = "products")
@Table(name = "products", schema="public")
@NamedQuery(name="Products.findByPlatformWithBrand", query= "" +
"SELECT p FROM Product p" +
" JOIN FETCH p.brand b" +

View File

@@ -9,7 +9,7 @@ import java.math.BigDecimal;
import java.time.OffsetDateTime;
@Entity
@Table(name = "product_offers")
@Table(name = "product_offers", schema = "public")
public class ProductOffer {
@Id

View File

@@ -10,6 +10,7 @@ import java.util.UUID;
@Entity
@Table(
name = "short_links",
schema = "public",
indexes = {
@Index(name = "idx_short_links_code", columnList = "code"),
@Index(name = "idx_short_links_type_offer", columnList = "type,product_offer_id"),

View File

@@ -6,7 +6,7 @@ import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "states")
@Table(name = "states", schema = "public")
public class State {
@Id
@Column(name = "id", nullable = false)

View File

@@ -8,7 +8,7 @@ import java.time.OffsetDateTime;
import java.util.UUID;
@Entity
@Table(name = "users")
@Table(name = "users", schema = "public")
public class User {
@Id

View File

@@ -9,7 +9,7 @@ import org.hibernate.annotations.ColumnDefault;
import java.time.Instant;
@Entity
@Table(name = "user_activity_log")
@Table(name = "user_activity_log", schema = "public")
public class UserActivityLog {
@Id
@Column(name = "id", nullable = false)

View File

@@ -1,4 +1,4 @@
package group.goforward.battlbuilder.model;
package group.goforward.battlbuilder.model.enums;
public enum EmailStatus {
PENDING,

View File

@@ -1,4 +1,4 @@
package group.goforward.battlbuilder.model;
package group.goforward.battlbuilder.model.enums;
public enum ImportStatus {
PENDING_MAPPING, // Ingested but not fully mapped / trusted

View File

@@ -1,9 +1,13 @@
package group.goforward.battlbuilder.model;
package group.goforward.battlbuilder.model.enums;
/**
*
*/
public enum PartRoleSource {
MERCHANT_MAP,
RULES,
INFERRED,
MERCHANT_MAP,
OVERRIDE,
RULES,
UNKNOWN
}

View File

@@ -1,4 +1,4 @@
package group.goforward.battlbuilder.model;
package group.goforward.battlbuilder.model.enums;
public enum ProductConfiguration {
STRIPPED, // bare receiver / component

View File

@@ -1,4 +1,4 @@
package group.goforward.battlbuilder.model;
package group.goforward.battlbuilder.model.enums;
public enum ProductStatus {
ACTIVE,

View File

@@ -1,4 +1,4 @@
package group.goforward.battlbuilder.model;
package group.goforward.battlbuilder.model.enums;
public enum ProductVisibility {
PUBLIC,

View File

@@ -3,7 +3,7 @@
* <p>
* Contains JPA entity classes representing the domain model including
* products, merchants, categories, platforms, and user accounts.
*
*
* @author Forward Group, LLC
* @version 1.0
* @since 2025-12-10

View File

@@ -1,7 +1,7 @@
package group.goforward.battlbuilder.repos;
import group.goforward.battlbuilder.model.EmailRequest;
import group.goforward.battlbuilder.model.EmailStatus;
import group.goforward.battlbuilder.model.enums.EmailStatus;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

View File

@@ -1,6 +1,6 @@
package group.goforward.battlbuilder.repos;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.model.Brand;
import group.goforward.battlbuilder.model.Product;
import group.goforward.battlbuilder.catalog.query.ProductWithBestPrice;

View File

@@ -1,8 +1,8 @@
package group.goforward.battlbuilder.repos.spec;
package group.goforward.battlbuilder.repos.catalog.spec;
import group.goforward.battlbuilder.model.Product;
import group.goforward.battlbuilder.model.ProductStatus;
import group.goforward.battlbuilder.model.ProductVisibility;
import group.goforward.battlbuilder.model.enums.ProductStatus;
import group.goforward.battlbuilder.model.enums.ProductVisibility;
import org.springframework.data.jpa.domain.Specification;

View File

@@ -2,7 +2,7 @@ package group.goforward.battlbuilder.services;
import group.goforward.battlbuilder.imports.MerchantFeedRow;
import group.goforward.battlbuilder.model.Merchant;
import group.goforward.battlbuilder.model.PartRoleSource;
import group.goforward.battlbuilder.model.enums.PartRoleSource;
public interface CategoryClassificationService {

View File

@@ -1,7 +1,7 @@
// src/main/java/group/goforward/ballistic/services/ImportStatusAdminService.java
package group.goforward.battlbuilder.services;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.repos.ProductRepository;
import group.goforward.battlbuilder.web.dto.ImportStatusByMerchantDto;
import group.goforward.battlbuilder.web.dto.ImportStatusSummaryDto;

View File

@@ -1,6 +1,6 @@
package group.goforward.battlbuilder.services;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.model.Merchant;
import group.goforward.battlbuilder.model.MerchantCategoryMap;
import group.goforward.battlbuilder.model.CanonicalCategory;

View File

@@ -1,6 +1,6 @@
package group.goforward.battlbuilder.services.admin.impl;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.repos.MerchantCategoryMapRepository;
import group.goforward.battlbuilder.repos.MerchantRepository;
import group.goforward.battlbuilder.repos.ProductRepository;

View File

@@ -3,7 +3,7 @@ package group.goforward.battlbuilder.services.admin.impl;
import group.goforward.battlbuilder.model.Product;
import group.goforward.battlbuilder.repos.ProductRepository;
import group.goforward.battlbuilder.services.admin.AdminProductService;
import group.goforward.battlbuilder.specs.ProductSpecifications;
import group.goforward.battlbuilder.domain.specs.ProductSpecifications;
import group.goforward.battlbuilder.web.dto.admin.AdminProductSearchRequest;
import group.goforward.battlbuilder.web.dto.admin.BulkUpdateResult;
import group.goforward.battlbuilder.web.dto.admin.ProductAdminRowDto;

View File

@@ -3,7 +3,7 @@ package group.goforward.battlbuilder.services.impl;
import group.goforward.battlbuilder.catalog.classification.PartRoleResolver;
import group.goforward.battlbuilder.imports.MerchantFeedRow;
import group.goforward.battlbuilder.model.Merchant;
import group.goforward.battlbuilder.model.PartRoleSource;
import group.goforward.battlbuilder.model.enums.PartRoleSource;
import group.goforward.battlbuilder.services.CategoryClassificationService;
import org.springframework.stereotype.Service;

View File

@@ -8,7 +8,7 @@ package group.goforward.battlbuilder.services.impl;
import group.goforward.battlbuilder.imports.MerchantFeedRow;
import group.goforward.battlbuilder.model.Brand;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.model.Merchant;
import group.goforward.battlbuilder.model.Product;
import group.goforward.battlbuilder.model.ProductOffer;

View File

@@ -1,7 +1,7 @@
package group.goforward.battlbuilder.services.impl;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.PartRoleSource;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.model.enums.PartRoleSource;
import group.goforward.battlbuilder.model.Product;
import group.goforward.battlbuilder.repos.ProductRepository;
import group.goforward.battlbuilder.services.ReclassificationService;

View File

@@ -1,7 +1,7 @@
package group.goforward.battlbuilder.services.utils.impl;
import group.goforward.battlbuilder.model.EmailRequest;
import group.goforward.battlbuilder.model.EmailStatus;
import group.goforward.battlbuilder.model.enums.EmailStatus;
import group.goforward.battlbuilder.repos.EmailRequestRepository;
import group.goforward.battlbuilder.services.utils.EmailService;
import jakarta.mail.internet.MimeMessage;

View File

@@ -1,6 +1,6 @@
package group.goforward.battlbuilder.web.admin;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.repos.ProductRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

View File

@@ -1,7 +1,7 @@
// src/main/java/group/goforward/ballistic/web/dto/ImportStatusByMerchantDto.java
package group.goforward.battlbuilder.web.dto;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
public record ImportStatusByMerchantDto(
String merchantName,

View File

@@ -1,7 +1,7 @@
// src/main/java/group/goforward/ballistic/web/dto/ImportStatusSummaryDto.java
package group.goforward.battlbuilder.web.dto;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
public record ImportStatusSummaryDto(
ImportStatus status,

View File

@@ -1,8 +1,8 @@
package group.goforward.battlbuilder.web.dto.admin;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.ProductStatus;
import group.goforward.battlbuilder.model.ProductVisibility;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.model.enums.ProductStatus;
import group.goforward.battlbuilder.model.enums.ProductVisibility;
/**
* Bound from query params on:

View File

@@ -1,11 +1,10 @@
package group.goforward.battlbuilder.web.dto.admin;
import group.goforward.battlbuilder.model.ImportStatus;
import group.goforward.battlbuilder.model.enums.ImportStatus;
import group.goforward.battlbuilder.model.Product;
import group.goforward.battlbuilder.model.ProductStatus;
import group.goforward.battlbuilder.model.ProductVisibility;
import group.goforward.battlbuilder.model.enums.ProductStatus;
import group.goforward.battlbuilder.model.enums.ProductVisibility;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.UUID;

View File

@@ -1,7 +1,7 @@
package group.goforward.battlbuilder.web.dto.admin;
import group.goforward.battlbuilder.model.ProductStatus;
import group.goforward.battlbuilder.model.ProductVisibility;
import group.goforward.battlbuilder.model.enums.ProductStatus;
import group.goforward.battlbuilder.model.enums.ProductVisibility;
import java.util.Set;