mirror of
https://gitea.gofwd.group/Forward_Group/ballistic-builder-spring.git
synced 2025-12-06 02:56:44 -05:00
Compare commits
12 Commits
dont-lose-
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
| 90b36c7933 | |||
| 290ef6cea4 | |||
| 12d2ee53b5 | |||
| 2969cdfa23 | |||
| c283ec15b6 | |||
| 3ae68f30c0 | |||
| f3626af709 | |||
| 756a6791fc | |||
| d344b372d1 | |||
| 31815d3145 | |||
| 4138edf45d | |||
| dc5942c47e |
31
.idea/dataSources.xml
generated
Normal file
31
.idea/dataSources.xml
generated
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
|
<data-source source="LOCAL" name="r710" uuid="e6a29f5c-71d9-45f0-931b-554bcf8a94ba">
|
||||||
|
<driver-ref>postgresql</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:postgresql://r710.dev.gofwd.group:5433/postgres</jdbc-url>
|
||||||
|
<jdbc-additional-properties>
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.host.port" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.container.port" />
|
||||||
|
</jdbc-additional-properties>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
<data-source source="LOCAL" name="ss_builder@r710.gofwd.group" uuid="e0fa459b-2f6c-45f1-9c41-66423c870df9">
|
||||||
|
<driver-ref>postgresql</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<imported>true</imported>
|
||||||
|
<remarks>$PROJECT_DIR$/src/main/resources/application.properties</remarks>
|
||||||
|
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:postgresql://r710.gofwd.group:5433/ss_builder</jdbc-url>
|
||||||
|
<jdbc-additional-properties>
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.host.port" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.container.port" />
|
||||||
|
</jdbc-additional-properties>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
132
README.md
132
README.md
@@ -1,67 +1,67 @@
|
|||||||
# Ballistic Builder ( The Armory?) Backend
|
# Ballistic Builder ( The Armory?) Backend
|
||||||
### Internal Engine for the Shadow System Armory?
|
### Internal Engine for the Shadow System Armory?
|
||||||
|
|
||||||
The Ballistic Backend is the operational backbone behind the Shadown System Armory and its admin tools. It ingests merchant feeds, normalizes product data, manages categories, synchronizes prices, and powers the compatibility, pricing, and product logic behind the consumer-facing Builder.
|
The Ballistic Backend is the operational backbone behind the Shadown System Armory and its admin tools. It ingests merchant feeds, normalizes product data, manages categories, synchronizes prices, and powers the compatibility, pricing, and product logic behind the consumer-facing Builder.
|
||||||
|
|
||||||
It’s built for reliability, longevity, and clean extensibility — the kind of foundation you want when scaling from a small beta to a fully public platform.
|
It’s built for reliability, longevity, and clean extensibility — the kind of foundation you want when scaling from a small beta to a fully public platform.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## What This Backend Does
|
## What This Backend Does
|
||||||
|
|
||||||
### **Merchant Feed Ingestion**
|
### **Merchant Feed Ingestion**
|
||||||
- Pulls AvantLink feeds (CSV or TSV)
|
- Pulls AvantLink feeds (CSV or TSV)
|
||||||
- Automatically detects delimiters
|
- Automatically detects delimiters
|
||||||
- Normalizes raw merchant fields
|
- Normalizes raw merchant fields
|
||||||
- Creates or updates product records
|
- Creates or updates product records
|
||||||
- Upserts price and stock offers
|
- Upserts price and stock offers
|
||||||
- Tracks first-seen / last-seen timestamps
|
- Tracks first-seen / last-seen timestamps
|
||||||
- Safely handles malformed or incomplete rows
|
- Safely handles malformed or incomplete rows
|
||||||
- Ensures repeat imports never duplicate offers
|
- Ensures repeat imports never duplicate offers
|
||||||
|
|
||||||
### **Category Mapping Engine**
|
### **Category Mapping Engine**
|
||||||
- Identifies every unique raw category coming from each merchant feed
|
- Identifies every unique raw category coming from each merchant feed
|
||||||
- Exposes *unmapped* categories in the admin UI
|
- Exposes *unmapped* categories in the admin UI
|
||||||
- Allows you to assign:
|
- Allows you to assign:
|
||||||
- Part Role
|
- Part Role
|
||||||
- Product Configuration (Stripped, Complete, Kit, etc.)
|
- Product Configuration (Stripped, Complete, Kit, etc.)
|
||||||
- Applies mappings automatically on future imports
|
- Applies mappings automatically on future imports
|
||||||
- Respects manual overrides such as `platform_locked`
|
- Respects manual overrides such as `platform_locked`
|
||||||
|
|
||||||
### **Builder Support**
|
### **Builder Support**
|
||||||
The frontend Builder depends on this backend for:
|
The frontend Builder depends on this backend for:
|
||||||
|
|
||||||
- Loading parts grouped by role
|
- Loading parts grouped by role
|
||||||
- Offering compatible options
|
- Offering compatible options
|
||||||
- Calculating build cost
|
- Calculating build cost
|
||||||
- Comparing offers across merchants
|
- Comparing offers across merchants
|
||||||
- Providing product metadata, imagery, and offer data
|
- Providing product metadata, imagery, and offer data
|
||||||
|
|
||||||
**Future expansions include:** price history, compatibility engine, build exports, public build pages, multi-merchant aggregation, and automated anomaly detection.
|
**Future expansions include:** price history, compatibility engine, build exports, public build pages, multi-merchant aggregation, and automated anomaly detection.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Tech Stack
|
## Tech Stack
|
||||||
|
|
||||||
- **Spring Boot 3.x**
|
- **Spring Boot 3.x**
|
||||||
- **Java 17**
|
- **Java 17**
|
||||||
- **PostgreSQL**
|
- **PostgreSQL**
|
||||||
- **Hibernate (JPA)**
|
- **Hibernate (JPA)**
|
||||||
- **HikariCP**
|
- **HikariCP**
|
||||||
- **Apache Commons CSV**
|
- **Apache Commons CSV**
|
||||||
- **Maven**
|
- **Maven**
|
||||||
- **REST API**
|
- **REST API**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Local Development
|
## Local Development
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
- Java 17 or newer
|
- Java 17 or newer
|
||||||
- PostgreSQL running locally
|
- PostgreSQL running locally
|
||||||
- Port 8080 open (default backend port)
|
- Port 8080 open (default backend port)
|
||||||
|
|
||||||
### Run Development Server
|
### Run Development Server
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./mvnw spring-boot:run
|
./mvnw spring-boot:run
|
||||||
78
action1.yaml
78
action1.yaml
@@ -1,39 +1,39 @@
|
|||||||
# File: .gitea/workflows/build-and-upload.yml
|
# File: .gitea/workflows/build-and-upload.yml
|
||||||
name: Build and Upload Artifact
|
name: Build and Upload Artifact
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
# Step 1: Check out repository code
|
# Step 1: Check out repository code
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
# Step 2: Set up Node.js (example for a JS project; adjust for your stack)
|
# Step 2: Set up Node.js (example for a JS project; adjust for your stack)
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
|
|
||||||
# Step 3: Install dependencies
|
# Step 3: Install dependencies
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
||||||
# Step 4: Build project
|
# Step 4: Build project
|
||||||
- name: Build project
|
- name: Build project
|
||||||
run: npm run build
|
run: npm run build
|
||||||
|
|
||||||
# Step 5: Upload build output as artifact
|
# Step 5: Upload build output as artifact
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: build-output
|
name: build-output
|
||||||
path: dist/ # Change to your build output directory
|
path: dist/ # Change to your build output directory
|
||||||
retention-days: 7 # Optional: how long to keep artifact
|
retention-days: 7 # Optional: how long to keep artifact
|
||||||
|
|||||||
34
docker/backend/Dockerfile
Normal file
34
docker/backend/Dockerfile
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# Stage 1: Build the application (The Build Stage)
|
||||||
|
# Use a Java SDK image with Maven pre-installed
|
||||||
|
FROM maven:3.9-jdk-17-slim AS build
|
||||||
|
|
||||||
|
# Set the working directory inside the container
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy the Maven project files (pom.xml) first to leverage Docker layer caching
|
||||||
|
COPY pom.xml .
|
||||||
|
|
||||||
|
# Copy the source code
|
||||||
|
COPY src ./src
|
||||||
|
|
||||||
|
# Build the Spring Boot application, skipping tests to speed up the Docker build
|
||||||
|
# This creates the executable JAR file in the 'target' directory
|
||||||
|
RUN mvn clean package -DskipTests
|
||||||
|
|
||||||
|
# Stage 2: Create the final lightweight image (The Runtime Stage)
|
||||||
|
# Use a smaller Java Runtime Environment (JRE) image for a smaller footprint
|
||||||
|
FROM openjdk:17-jre-slim
|
||||||
|
|
||||||
|
# Set the working directory in the final image
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy the built JAR file from the 'build' stage into the final image
|
||||||
|
# The JAR file is typically named 'target/<your-app-name>-<version>.jar'
|
||||||
|
# You may need to adjust the name if you have a non-standard pom.xml
|
||||||
|
COPY --from=build /app/target/*.jar app.jar
|
||||||
|
|
||||||
|
# Expose the default Spring Boot port
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# Define the command to run the application
|
||||||
|
ENTRYPOINT ["java", "-jar", "app.jar"]
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# Stage 1: Build the application
|
|
||||||
FROM openjdk:17-jdk-slim as build
|
|
||||||
WORKDIR /app
|
|
||||||
COPY gradlew .
|
|
||||||
COPY settings.gradle .
|
|
||||||
COPY build.gradle .
|
|
||||||
COPY src ./src
|
|
||||||
# Adjust the build command for Maven: ./mvnw package -DskipTests
|
|
||||||
RUN ./gradlew bootJar
|
|
||||||
|
|
||||||
# Stage 2: Create the final lightweight image
|
|
||||||
FROM openjdk:17-jre-slim
|
|
||||||
WORKDIR /app
|
|
||||||
# Get the built JAR from the build stage
|
|
||||||
COPY --from=build /app/build/libs/*.jar app.jar
|
|
||||||
EXPOSE 8080
|
|
||||||
ENTRYPOINT ["java", "-jar", "app.jar"]
|
|
||||||
@@ -1,63 +1,43 @@
|
|||||||
version: '3.8'
|
version: '3.8'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# --- 1. Spring API Service (Backend) ---
|
# --- 1. Spring API Service (Backend) ---
|
||||||
spring-api:
|
ss_builder-api:
|
||||||
build:
|
build:
|
||||||
context: ./backend # Path to your Spring project's root folder
|
context: ./backend # Path to your Spring project's root folder
|
||||||
dockerfile: Dockerfile # Assumes you have a Dockerfile in ./backend
|
dockerfile: Dockerfile # Assumes you have a Dockerfile in ./backend
|
||||||
container_name: spring-api
|
container_name: ss_builder-api
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080" # Map host port 8080 to container port 8080
|
- "8080:8080" # Map host port 8080 to container port 8080
|
||||||
environment:
|
environment:
|
||||||
# These environment variables link the API to the database service defined below
|
# These environment variables link the API to the database service defined below
|
||||||
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydatabase
|
- SPRING_DATASOURCE_URL=jdbc:postgresql://r710.dev.gofwd.group:5433/ss_builder
|
||||||
- SPRING_DATASOURCE_USERNAME=myuser
|
- SPRING_DATASOURCE_USERNAME=dba
|
||||||
- SPRING_DATASOURCE_PASSWORD=mypassword
|
- SPRING_DATASOURCE_PASSWORD=!@#Qwerty
|
||||||
depends_on:
|
networks:
|
||||||
- db
|
- app-network
|
||||||
networks:
|
|
||||||
- app-network
|
# --- 2. Next.js App Service (Frontend) ---
|
||||||
|
nextjs-app:
|
||||||
# --- 2. Next.js App Service (Frontend) ---
|
build:
|
||||||
nextjs-app:
|
context: ./frontend # Path to your Next.js project's root folder
|
||||||
build:
|
dockerfile: Dockerfile # Assumes you have a Dockerfile in ./frontend
|
||||||
context: ./frontend # Path to your Next.js project's root folder
|
container_name: ss_builder-app
|
||||||
dockerfile: Dockerfile # Assumes you have a Dockerfile in ./frontend
|
ports:
|
||||||
container_name: nextjs-app
|
- "3000:3000" # Map host port 3000 to container port 3000
|
||||||
ports:
|
environment:
|
||||||
- "3000:3000" # Map host port 3000 to container port 3000
|
# This variable is crucial: Next.js needs the URL for the Spring API
|
||||||
environment:
|
# Use the Docker internal service name 'spring-api' and its port 8080
|
||||||
# This variable is crucial: Next.js needs the URL for the Spring API
|
- NEXT_PUBLIC_API_URL=http://ss_builder-api:8080
|
||||||
# Use the Docker internal service name 'spring-api' and its port 8080
|
# For local testing, you might need the host IP for Next.js to call back
|
||||||
- NEXT_PUBLIC_API_URL=http://spring-api:8080
|
# - NEXT_PUBLIC_API_URL_LOCAL=http://localhost:8080
|
||||||
# For local testing, you might need the host IP for Next.js to call back
|
depends_on:
|
||||||
# - NEXT_PUBLIC_API_URL_LOCAL=http://localhost:8080
|
- ss_builder-api
|
||||||
depends_on:
|
networks:
|
||||||
- spring-api
|
- app-network
|
||||||
networks:
|
|
||||||
- app-network
|
|
||||||
|
# --- Docker Network for Inter-Container Communication ---
|
||||||
# --- 3. PostgreSQL Database Service (Example Dependency) ---
|
networks:
|
||||||
db:
|
app-network:
|
||||||
image: postgres:15-alpine # Lightweight and stable PostgreSQL image
|
|
||||||
container_name: postgres-db
|
|
||||||
environment:
|
|
||||||
- POSTGRES_DB=mydatabase
|
|
||||||
- POSTGRES_USER=myuser
|
|
||||||
- POSTGRES_PASSWORD=mypassword
|
|
||||||
volumes:
|
|
||||||
- postgres_data:/var/lib/postgresql/data # Persist the database data
|
|
||||||
ports:
|
|
||||||
- "5432:5432" # Optional: Map DB port for external access (e.g., DBeaver)
|
|
||||||
networks:
|
|
||||||
- app-network
|
|
||||||
|
|
||||||
# --- Docker Volume for Persistent Data ---
|
|
||||||
volumes:
|
|
||||||
postgres_data:
|
|
||||||
|
|
||||||
# --- Docker Network for Inter-Container Communication ---
|
|
||||||
networks:
|
|
||||||
app-network:
|
|
||||||
driver: bridge
|
driver: bridge
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
# Stage 1: Build the static assets
|
# Stage 1: Build the static assets
|
||||||
FROM node:20-alpine as builder
|
FROM node:20-alpine as builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json package-lock.json ./
|
COPY package.json package-lock.json ./
|
||||||
RUN npm install
|
RUN npm install
|
||||||
COPY . .
|
COPY . .
|
||||||
# Run the Next.js build command
|
# Run the Next.js build command
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
# Stage 2: Run the production application (Next.js server)
|
# Stage 2: Run the production application (Next.js server)
|
||||||
FROM node:20-alpine
|
FROM node:20-alpine
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
# Copy only the necessary files for running the app
|
# Copy only the necessary files for running the app
|
||||||
COPY --from=builder /app/.next ./.next
|
COPY --from=builder /app/.next ./.next
|
||||||
COPY --from=builder /app/node_modules ./node_modules
|
COPY --from=builder /app/node_modules ./node_modules
|
||||||
COPY --from=builder /app/package.json ./package.json
|
COPY --from=builder /app/package.json ./package.json
|
||||||
COPY --from=builder /app/public ./public
|
COPY --from=builder /app/public ./public
|
||||||
# Set environment variables
|
# Set environment variables
|
||||||
ENV NODE_ENV production
|
ENV NODE_ENV production
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
# Run the Next.js production server
|
# Run the Next.js production server
|
||||||
CMD ["npm", "start"]
|
CMD ["npm", "start"]
|
||||||
424
importLogic.md
424
importLogic.md
@@ -1,213 +1,213 @@
|
|||||||
# Ballistic Import Pipeline
|
# Ballistic Import Pipeline
|
||||||
A high-level overview of how merchant data flows through the Spring ETL system.
|
A high-level overview of how merchant data flows through the Spring ETL system.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|
||||||
This document explains how the Ballistic backend:
|
This document explains how the Ballistic backend:
|
||||||
|
|
||||||
1. Fetches merchant product feeds (CSV/TSV)
|
1. Fetches merchant product feeds (CSV/TSV)
|
||||||
2. Normalizes raw data into structured entities
|
2. Normalizes raw data into structured entities
|
||||||
3. Updates products and offers in an idempotent way
|
3. Updates products and offers in an idempotent way
|
||||||
4. Supports two sync modes:
|
4. Supports two sync modes:
|
||||||
- Full Import
|
- Full Import
|
||||||
- Offer-Only Sync
|
- Offer-Only Sync
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 1. High-Level Flow
|
# 1. High-Level Flow
|
||||||
|
|
||||||
## ASCII Diagram
|
## ASCII Diagram
|
||||||
|
|
||||||
```
|
```
|
||||||
┌──────────────────────────┐
|
┌──────────────────────────┐
|
||||||
│ /admin/imports/{id} │
|
│ /admin/imports/{id} │
|
||||||
│ (Full Import Trigger) │
|
│ (Full Import Trigger) │
|
||||||
└─────────────┬────────────┘
|
└─────────────┬────────────┘
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
┌──────────────────────────────┐
|
┌──────────────────────────────┐
|
||||||
│ importMerchantFeed(merchantId)│
|
│ importMerchantFeed(merchantId)│
|
||||||
└─────────────┬────────────────┘
|
└─────────────┬────────────────┘
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
┌────────────────────────────────────────────────────────┐
|
┌────────────────────────────────────────────────────────┐
|
||||||
│ readFeedRowsForMerchant() │
|
│ readFeedRowsForMerchant() │
|
||||||
│ - auto-detect delimiter │
|
│ - auto-detect delimiter │
|
||||||
│ - parse CSV/TSV → MerchantFeedRow objects │
|
│ - parse CSV/TSV → MerchantFeedRow objects │
|
||||||
└─────────────────┬──────────────────────────────────────┘
|
└─────────────────┬──────────────────────────────────────┘
|
||||||
│ List<MerchantFeedRow>
|
│ List<MerchantFeedRow>
|
||||||
▼
|
▼
|
||||||
┌──────────────────────────────────────┐
|
┌──────────────────────────────────────┐
|
||||||
│ For each MerchantFeedRow row: │
|
│ For each MerchantFeedRow row: │
|
||||||
│ resolveBrand() │
|
│ resolveBrand() │
|
||||||
│ upsertProduct() │
|
│ upsertProduct() │
|
||||||
│ - find existing via brand+mpn/upc │
|
│ - find existing via brand+mpn/upc │
|
||||||
│ - update fields (mapped partRole) │
|
│ - update fields (mapped partRole) │
|
||||||
│ upsertOfferFromRow() │
|
│ upsertOfferFromRow() │
|
||||||
└──────────────────────────────────────┘
|
└──────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 2. Full Import Explained
|
# 2. Full Import Explained
|
||||||
|
|
||||||
Triggered by:
|
Triggered by:
|
||||||
|
|
||||||
```
|
```
|
||||||
POST /admin/imports/{merchantId}
|
POST /admin/imports/{merchantId}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Step 1 — Load merchant
|
### Step 1 — Load merchant
|
||||||
Using `merchantRepository.findById()`.
|
Using `merchantRepository.findById()`.
|
||||||
|
|
||||||
### Step 2 — Parse feed rows
|
### Step 2 — Parse feed rows
|
||||||
`readFeedRowsForMerchant()`:
|
`readFeedRowsForMerchant()`:
|
||||||
- Auto-detects delimiter (`\t`, `,`, `;`)
|
- Auto-detects delimiter (`\t`, `,`, `;`)
|
||||||
- Validates required headers
|
- Validates required headers
|
||||||
- Parses each row into `MerchantFeedRow`
|
- Parses each row into `MerchantFeedRow`
|
||||||
|
|
||||||
### Step 3 — Process each row
|
### Step 3 — Process each row
|
||||||
|
|
||||||
For each parsed row:
|
For each parsed row:
|
||||||
|
|
||||||
#### a. resolveBrand()
|
#### a. resolveBrand()
|
||||||
- Finds or creates brand
|
- Finds or creates brand
|
||||||
- Defaults to “Aero Precision” if missing
|
- Defaults to “Aero Precision” if missing
|
||||||
|
|
||||||
#### b. upsertProduct()
|
#### b. upsertProduct()
|
||||||
Dedupes by:
|
Dedupes by:
|
||||||
|
|
||||||
1. Brand + MPN
|
1. Brand + MPN
|
||||||
2. Brand + UPC (currently SKU placeholder)
|
2. Brand + UPC (currently SKU placeholder)
|
||||||
|
|
||||||
If no match → create new product.
|
If no match → create new product.
|
||||||
|
|
||||||
Then applies:
|
Then applies:
|
||||||
- Name + slug
|
- Name + slug
|
||||||
- Descriptions
|
- Descriptions
|
||||||
- Images
|
- Images
|
||||||
- MPN/identifiers
|
- MPN/identifiers
|
||||||
- Platform inference
|
- Platform inference
|
||||||
- Category mapping
|
- Category mapping
|
||||||
- Part role inference
|
- Part role inference
|
||||||
|
|
||||||
#### c. upsertOfferFromRow()
|
#### c. upsertOfferFromRow()
|
||||||
Creates or updates a ProductOffer:
|
Creates or updates a ProductOffer:
|
||||||
- Prices
|
- Prices
|
||||||
- Stock
|
- Stock
|
||||||
- Buy URL
|
- Buy URL
|
||||||
- lastSeenAt
|
- lastSeenAt
|
||||||
- firstSeenAt when newly created
|
- firstSeenAt when newly created
|
||||||
|
|
||||||
Idempotent — does not duplicate offers.
|
Idempotent — does not duplicate offers.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 3. Offer-Only Sync
|
# 3. Offer-Only Sync
|
||||||
|
|
||||||
Triggered by:
|
Triggered by:
|
||||||
|
|
||||||
```
|
```
|
||||||
POST /admin/imports/{merchantId}/offers-only
|
POST /admin/imports/{merchantId}/offers-only
|
||||||
```
|
```
|
||||||
|
|
||||||
Does NOT:
|
Does NOT:
|
||||||
- Create products
|
- Create products
|
||||||
- Update product fields
|
- Update product fields
|
||||||
|
|
||||||
It only updates:
|
It only updates:
|
||||||
- price
|
- price
|
||||||
- originalPrice
|
- originalPrice
|
||||||
- inStock
|
- inStock
|
||||||
- buyUrl
|
- buyUrl
|
||||||
- lastSeenAt
|
- lastSeenAt
|
||||||
|
|
||||||
If the offer does not exist, it is skipped.
|
If the offer does not exist, it is skipped.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 4. Auto-Detecting CSV/TSV Parser
|
# 4. Auto-Detecting CSV/TSV Parser
|
||||||
|
|
||||||
The parser:
|
The parser:
|
||||||
|
|
||||||
- Attempts multiple delimiters
|
- Attempts multiple delimiters
|
||||||
- Validates headers
|
- Validates headers
|
||||||
- Handles malformed or short rows
|
- Handles malformed or short rows
|
||||||
- Never throws on missing columns
|
- Never throws on missing columns
|
||||||
- Returns clean MerchantFeedRow objects
|
- Returns clean MerchantFeedRow objects
|
||||||
|
|
||||||
Designed for messy merchant feeds.
|
Designed for messy merchant feeds.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 5. Entities Updated During Import
|
# 5. Entities Updated During Import
|
||||||
|
|
||||||
### Product
|
### Product
|
||||||
- name
|
- name
|
||||||
- slug
|
- slug
|
||||||
- short/long description
|
- short/long description
|
||||||
- main image
|
- main image
|
||||||
- mpn
|
- mpn
|
||||||
- upc (future)
|
- upc (future)
|
||||||
- platform
|
- platform
|
||||||
- rawCategoryKey
|
- rawCategoryKey
|
||||||
- partRole
|
- partRole
|
||||||
|
|
||||||
### ProductOffer
|
### ProductOffer
|
||||||
- merchant
|
- merchant
|
||||||
- product
|
- product
|
||||||
- avantlinkProductId (SKU placeholder)
|
- avantlinkProductId (SKU placeholder)
|
||||||
- price
|
- price
|
||||||
- originalPrice
|
- originalPrice
|
||||||
- inStock
|
- inStock
|
||||||
- buyUrl
|
- buyUrl
|
||||||
- lastSeenAt
|
- lastSeenAt
|
||||||
- firstSeenAt
|
- firstSeenAt
|
||||||
|
|
||||||
### Merchant
|
### Merchant
|
||||||
- lastFullImportAt
|
- lastFullImportAt
|
||||||
- lastOfferSyncAt
|
- lastOfferSyncAt
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 6. Extension Points
|
# 6. Extension Points
|
||||||
|
|
||||||
You can extend the import pipeline in these areas:
|
You can extend the import pipeline in these areas:
|
||||||
|
|
||||||
- Add per-merchant column mapping
|
- Add per-merchant column mapping
|
||||||
- Add true UPC parsing
|
- Add true UPC parsing
|
||||||
- Support multi-platform parts
|
- Support multi-platform parts
|
||||||
- Improve partRole inference
|
- Improve partRole inference
|
||||||
- Implement global deduplication across merchants
|
- Implement global deduplication across merchants
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 7. Quick Reference: Main Methods
|
# 7. Quick Reference: Main Methods
|
||||||
|
|
||||||
| Method | Purpose |
|
| Method | Purpose |
|
||||||
|--------|---------|
|
|--------|---------|
|
||||||
| importMerchantFeed | Full product + offer import |
|
| importMerchantFeed | Full product + offer import |
|
||||||
| readFeedRowsForMerchant | Detect delimiter + parse feed |
|
| readFeedRowsForMerchant | Detect delimiter + parse feed |
|
||||||
| resolveBrand | Normalize brand names |
|
| resolveBrand | Normalize brand names |
|
||||||
| upsertProduct | Idempotent product write |
|
| upsertProduct | Idempotent product write |
|
||||||
| updateProductFromRow | Apply product fields |
|
| updateProductFromRow | Apply product fields |
|
||||||
| upsertOfferFromRow | Idempotent offer write |
|
| upsertOfferFromRow | Idempotent offer write |
|
||||||
| syncOffersOnly | Offer-only sync |
|
| syncOffersOnly | Offer-only sync |
|
||||||
| upsertOfferOnlyFromRow | Update existing offers |
|
| upsertOfferOnlyFromRow | Update existing offers |
|
||||||
| detectCsvFormat | Auto-detect delimiter |
|
| detectCsvFormat | Auto-detect delimiter |
|
||||||
| fetchFeedRows | Simpler parser for offers |
|
| fetchFeedRows | Simpler parser for offers |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 8. Summary
|
# 8. Summary
|
||||||
|
|
||||||
The Ballistic importer is:
|
The Ballistic importer is:
|
||||||
|
|
||||||
- Robust against bad data
|
- Robust against bad data
|
||||||
- Idempotent and safe
|
- Idempotent and safe
|
||||||
- Flexible for multiple merchants
|
- Flexible for multiple merchants
|
||||||
- Extensible for long-term scaling
|
- Extensible for long-term scaling
|
||||||
|
|
||||||
This pipeline powers the product catalog and offer data for the Ballistic ecosystem.
|
This pipeline powers the product catalog and offer data for the Ballistic ecosystem.
|
||||||
3
pom.xml
3
pom.xml
@@ -40,7 +40,8 @@
|
|||||||
<connection></connection>
|
<connection></connection>
|
||||||
<developerConnection>scm:git:https://gitea.gofwd.group/Forward_Group/ballistic-builder-spring.git</developerConnection>
|
<developerConnection>scm:git:https://gitea.gofwd.group/Forward_Group/ballistic-builder-spring.git</developerConnection>
|
||||||
<tag/>
|
<tag/>
|
||||||
<url/>
|
<url>ssh://git@gitea.gofwd.group:2225/Forward_Group/ballistic-builder-spring.git</url>
|
||||||
|
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|||||||
159
sql/add_timestamp_columns.sql
Normal file
159
sql/add_timestamp_columns.sql
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
-- Add timestamp columns (created_at, updated_at, deleted_at) to all tables
|
||||||
|
-- PostgreSQL script for ballistic-builder-spring project
|
||||||
|
|
||||||
|
-- accounts
|
||||||
|
ALTER TABLE accounts
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_accounts_updated_at BEFORE UPDATE ON accounts FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
|
||||||
|
-- affiliate_category_map
|
||||||
|
ALTER TABLE affiliate_category_map
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_affiliate_category_map_updated_at BEFORE UPDATE ON affiliate_category_map FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- brands
|
||||||
|
ALTER TABLE brands
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_brands_updated_at BEFORE UPDATE ON brands FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
|
||||||
|
-- builds
|
||||||
|
ALTER TABLE build_items
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_builds_items_updated_at BEFORE UPDATE ON build_items FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- builds
|
||||||
|
ALTER TABLE builds
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_builds_updated_at BEFORE UPDATE ON builds FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- category_mappings
|
||||||
|
ALTER TABLE category_mappings
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_category_mappings_updated_at BEFORE UPDATE ON category_mappings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- feed_imports
|
||||||
|
ALTER TABLE feed_imports
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_feed_imports_updated_at BEFORE UPDATE ON feed_imports FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- merchants
|
||||||
|
ALTER TABLE merchants
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_merchants_updated_at BEFORE UPDATE ON merchants FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- merchant_category_mappings (truncated table name in search results)
|
||||||
|
ALTER TABLE merchant_category_mappings
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_category_mappings_updated_at BEFORE UPDATE ON category_mappings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- merchant_category_mappings (truncated table name in search results)
|
||||||
|
ALTER TABLE merchant_category_map
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_merchant_category_map_updated_at BEFORE UPDATE ON merchant_category_map FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- part_categories
|
||||||
|
ALTER TABLE part_categories
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_part_categories_updated_at BEFORE UPDATE ON part_categories FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
|
||||||
|
-- part_role_mappings
|
||||||
|
ALTER TABLE part_role_mappings
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_part_role_mappings_updated_at BEFORE UPDATE ON part_role_mappings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- part_role_mappings
|
||||||
|
ALTER TABLE platforms
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_platforms_updated_at BEFORE UPDATE ON platforms FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- price_history
|
||||||
|
ALTER TABLE price_history
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_price_history_updated_at BEFORE UPDATE ON price_history FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
--
|
||||||
|
-- product_offers
|
||||||
|
ALTER TABLE product_offers
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_product_offers_updated_at BEFORE UPDATE ON product_offers FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- products
|
||||||
|
ALTER TABLE products
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_products_updated_at BEFORE UPDATE ON products FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
|
||||||
|
-- states
|
||||||
|
ALTER TABLE states
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_states_updated_at BEFORE UPDATE ON states FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
-- users
|
||||||
|
ALTER TABLE users
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
|
||||||
|
-- Create function to automatically update updated_at timestamp
|
||||||
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||||||
|
RETURNS TRIGGER AS $$
|
||||||
|
BEGIN
|
||||||
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$ language 'plpgsql';
|
||||||
|
|
||||||
|
-- Create triggers for all tables to auto-update updated_at on row modification
|
||||||
|
CREATE TRIGGER update_accounts_updated_at BEFORE UPDATE ON accounts FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_affiliate_category_map_updated_at BEFORE UPDATE ON affiliate_category_map FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_brands_updated_at BEFORE UPDATE ON brands FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_builds_updated_at BEFORE UPDATE ON builds FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_builds_items_updated_at BEFORE UPDATE ON build_items FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_merchants_updated_at BEFORE UPDATE ON merchants FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_merchant_category_mappings_updated_at BEFORE UPDATE ON merchant_category_mappings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
|
CREATE TRIGGER update_part_role_mappings_updated_at BEFORE UPDATE ON part_role_mappings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_price_history_updated_at BEFORE UPDATE ON price_history FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_product_offers_updated_at BEFORE UPDATE ON product_offers FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
CREATE TRIGGER update_products_updated_at BEFORE UPDATE ON products FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||||
52265
sql/ddl.sql
Normal file
52265
sql/ddl.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,16 +1,16 @@
|
|||||||
package group.goforward.ballistic.configuration;
|
package group.goforward.ballistic.configuration;
|
||||||
|
|
||||||
import org.springframework.cache.CacheManager;
|
import org.springframework.cache.CacheManager;
|
||||||
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
|
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class CacheConfig {
|
public class CacheConfig {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public CacheManager cacheManager() {
|
public CacheManager cacheManager() {
|
||||||
// Simple in-memory cache for dev/local
|
// Simple in-memory cache for dev/local
|
||||||
return new ConcurrentMapCacheManager("gunbuilderProducts");
|
return new ConcurrentMapCacheManager("gunbuilderProducts");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -30,14 +30,11 @@ public class CorsConfig {
|
|||||||
"https://localhost:8080",
|
"https://localhost:8080",
|
||||||
"http://localhost:3000",
|
"http://localhost:3000",
|
||||||
"https://localhost:3000",
|
"https://localhost:3000",
|
||||||
"http://192.168.11.210:8070",
|
"https://localhost:3000/gunbuilder",
|
||||||
"https://192.168.11.210:8070",
|
"http://localhost:3000/gunbuilder",
|
||||||
"http://citysites.gofwd.group",
|
"https://localhost:3000/builder",
|
||||||
"https://citysites.gofwd.group",
|
"http://localhost:3000/builder"
|
||||||
"http://citysites.gofwd.group:8070",
|
));
|
||||||
"https://citysites.gofwd.group:8070"
|
|
||||||
|
|
||||||
));
|
|
||||||
|
|
||||||
// Allow all headers
|
// Allow all headers
|
||||||
config.addAllowedHeader("*");
|
config.addAllowedHeader("*");
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
/**
|
/**
|
||||||
* Provides the classes necessary for the Spring Configurations for the ballistic -Builder application.
|
* Provides the classes necessary for the Spring Configurations for the ballistic -Builder application.
|
||||||
* This package includes Configurations for Spring-Boot application
|
* This package includes Configurations for Spring-Boot application
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* <p>The main entry point for managing the inventory is the
|
* <p>The main entry point for managing the inventory is the
|
||||||
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
* @author Don Strawsburg
|
* @author Don Strawsburg
|
||||||
* @version 1.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
package group.goforward.ballistic.configuration;
|
package group.goforward.ballistic.configuration;
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package group.goforward.ballistic.controllers;
|
||||||
|
|
||||||
|
import group.goforward.ballistic.model.Brand;
|
||||||
|
import group.goforward.ballistic.model.State;
|
||||||
|
import group.goforward.ballistic.repos.BrandRepository;
|
||||||
|
import group.goforward.ballistic.services.BrandService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/brands")
|
||||||
|
public class BrandController {
|
||||||
|
@Autowired
|
||||||
|
private BrandRepository repo;
|
||||||
|
@Autowired
|
||||||
|
private BrandService brandService;
|
||||||
|
//@Cacheable(value="getAllStates")
|
||||||
|
@GetMapping("/all")
|
||||||
|
public ResponseEntity<List<Brand>> getAllBrands() {
|
||||||
|
List<Brand> brand = repo.findAll();
|
||||||
|
return ResponseEntity.ok(brand);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public ResponseEntity<Brand> getAllBrandsById(@PathVariable Integer id) {
|
||||||
|
return repo.findById(id)
|
||||||
|
.map(ResponseEntity::ok)
|
||||||
|
.orElse(ResponseEntity.notFound().build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/add")
|
||||||
|
public ResponseEntity<Brand> createbrand(@RequestBody Brand item) {
|
||||||
|
Brand created = brandService.save(item);
|
||||||
|
return ResponseEntity.status(HttpStatus.CREATED).body(created);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/delete/{id}")
|
||||||
|
public ResponseEntity<Void> deleteItem(@PathVariable Integer id) {
|
||||||
|
return brandService.findById(id)
|
||||||
|
.map(item -> {
|
||||||
|
brandService.deleteById(id);
|
||||||
|
return ResponseEntity.noContent().<Void>build();
|
||||||
|
})
|
||||||
|
.orElse(ResponseEntity.notFound().build());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# Stage 1: Build the application
|
|
||||||
FROM openjdk:17-jdk-slim as build
|
|
||||||
WORKDIR /app
|
|
||||||
COPY gradlew .
|
|
||||||
COPY settings.gradle .
|
|
||||||
COPY build.gradle .
|
|
||||||
COPY src ./src
|
|
||||||
# Adjust the build command for Maven: ./mvnw package -DskipTests
|
|
||||||
RUN ./gradlew bootJar
|
|
||||||
|
|
||||||
# Stage 2: Create the final lightweight image
|
|
||||||
FROM openjdk:17-jre-slim
|
|
||||||
WORKDIR /app
|
|
||||||
# Get the built JAR from the build stage
|
|
||||||
COPY --from=build /app/build/libs/*.jar app.jar
|
|
||||||
EXPOSE 8080
|
|
||||||
ENTRYPOINT ["java", "-jar", "app.jar"]
|
|
||||||
@@ -1,39 +1,39 @@
|
|||||||
package group.goforward.ballistic.controllers;
|
package group.goforward.ballistic.controllers;
|
||||||
|
|
||||||
import group.goforward.ballistic.services.MerchantFeedImportService;
|
import group.goforward.ballistic.services.MerchantFeedImportService;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/admin/imports")
|
@RequestMapping("/admin/imports")
|
||||||
@CrossOrigin(origins = "http://localhost:3000")
|
@CrossOrigin(origins = "http://localhost:3000")
|
||||||
public class ImportController {
|
public class ImportController {
|
||||||
|
|
||||||
private final MerchantFeedImportService merchantFeedImportService;
|
private final MerchantFeedImportService merchantFeedImportService;
|
||||||
|
|
||||||
public ImportController(MerchantFeedImportService merchantFeedImportService) {
|
public ImportController(MerchantFeedImportService merchantFeedImportService) {
|
||||||
this.merchantFeedImportService = merchantFeedImportService;
|
this.merchantFeedImportService = merchantFeedImportService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Full product + offer import for a merchant.
|
* Full product + offer import for a merchant.
|
||||||
*
|
*
|
||||||
* POST /admin/imports/{merchantId}
|
* POST /admin/imports/{merchantId}
|
||||||
*/
|
*/
|
||||||
@PostMapping("/{merchantId}")
|
@PostMapping("/{merchantId}")
|
||||||
public ResponseEntity<Void> importMerchant(@PathVariable Integer merchantId) {
|
public ResponseEntity<Void> importMerchant(@PathVariable Integer merchantId) {
|
||||||
merchantFeedImportService.importMerchantFeed(merchantId);
|
merchantFeedImportService.importMerchantFeed(merchantId);
|
||||||
return ResponseEntity.noContent().build();
|
return ResponseEntity.noContent().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Offers-only sync (price/stock) for a merchant.
|
* Offers-only sync (price/stock) for a merchant.
|
||||||
*
|
*
|
||||||
* POST /admin/imports/{merchantId}/offers-only
|
* POST /admin/imports/{merchantId}/offers-only
|
||||||
*/
|
*/
|
||||||
@PostMapping("/{merchantId}/offers-only")
|
@PostMapping("/{merchantId}/offers-only")
|
||||||
public ResponseEntity<Void> syncOffersOnly(@PathVariable Integer merchantId) {
|
public ResponseEntity<Void> syncOffersOnly(@PathVariable Integer merchantId) {
|
||||||
merchantFeedImportService.syncOffersOnly(merchantId);
|
merchantFeedImportService.syncOffersOnly(merchantId);
|
||||||
return ResponseEntity.noContent().build();
|
return ResponseEntity.noContent().build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,63 +1,63 @@
|
|||||||
// MerchantAdminController.java
|
// MerchantAdminController.java
|
||||||
package group.goforward.ballistic.controllers;
|
package group.goforward.ballistic.controllers;
|
||||||
|
|
||||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
import org.springframework.web.bind.annotation.CrossOrigin;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PutMapping;
|
import org.springframework.web.bind.annotation.PutMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import group.goforward.ballistic.model.Merchant;
|
import group.goforward.ballistic.model.Merchant;
|
||||||
import group.goforward.ballistic.repos.MerchantRepository;
|
import group.goforward.ballistic.repos.MerchantRepository;
|
||||||
import group.goforward.ballistic.web.dto.MerchantAdminDto;
|
import group.goforward.ballistic.web.dto.MerchantAdminDto;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/admin/merchants")
|
@RequestMapping("/admin/merchants")
|
||||||
@CrossOrigin(origins = "http://localhost:3000") // TEMP for Cross-Origin Bug
|
@CrossOrigin(origins = "http://localhost:3000") // TEMP for Cross-Origin Bug
|
||||||
public class MerchantAdminController {
|
public class MerchantAdminController {
|
||||||
|
|
||||||
private final MerchantRepository merchantRepository;
|
private final MerchantRepository merchantRepository;
|
||||||
|
|
||||||
public MerchantAdminController(MerchantRepository merchantRepository) {
|
public MerchantAdminController(MerchantRepository merchantRepository) {
|
||||||
this.merchantRepository = merchantRepository;
|
this.merchantRepository = merchantRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public List<MerchantAdminDto> listMerchants() {
|
public List<MerchantAdminDto> listMerchants() {
|
||||||
return merchantRepository.findAll().stream().map(this::toDto).toList();
|
return merchantRepository.findAll().stream().map(this::toDto).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/{id}")
|
@PutMapping("/{id}")
|
||||||
public MerchantAdminDto updateMerchant(
|
public MerchantAdminDto updateMerchant(
|
||||||
@PathVariable Integer id,
|
@PathVariable Integer id,
|
||||||
@RequestBody MerchantAdminDto payload
|
@RequestBody MerchantAdminDto payload
|
||||||
) {
|
) {
|
||||||
Merchant merchant = merchantRepository.findById(id)
|
Merchant merchant = merchantRepository.findById(id)
|
||||||
.orElseThrow(() -> new RuntimeException("Merchant not found"));
|
.orElseThrow(() -> new RuntimeException("Merchant not found"));
|
||||||
|
|
||||||
merchant.setFeedUrl(payload.getFeedUrl());
|
merchant.setFeedUrl(payload.getFeedUrl());
|
||||||
merchant.setOfferFeedUrl(payload.getOfferFeedUrl());
|
merchant.setOfferFeedUrl(payload.getOfferFeedUrl());
|
||||||
merchant.setIsActive(payload.getIsActive() != null ? payload.getIsActive() : true);
|
merchant.setIsActive(payload.getIsActive() != null ? payload.getIsActive() : true);
|
||||||
// don’t touch last* here; those are set by import jobs
|
// don’t touch last* here; those are set by import jobs
|
||||||
|
|
||||||
merchant = merchantRepository.save(merchant);
|
merchant = merchantRepository.save(merchant);
|
||||||
return toDto(merchant);
|
return toDto(merchant);
|
||||||
}
|
}
|
||||||
|
|
||||||
private MerchantAdminDto toDto(Merchant m) {
|
private MerchantAdminDto toDto(Merchant m) {
|
||||||
MerchantAdminDto dto = new MerchantAdminDto();
|
MerchantAdminDto dto = new MerchantAdminDto();
|
||||||
dto.setId(m.getId());
|
dto.setId(m.getId());
|
||||||
dto.setName(m.getName());
|
dto.setName(m.getName());
|
||||||
dto.setFeedUrl(m.getFeedUrl());
|
dto.setFeedUrl(m.getFeedUrl());
|
||||||
dto.setOfferFeedUrl(m.getOfferFeedUrl());
|
dto.setOfferFeedUrl(m.getOfferFeedUrl());
|
||||||
dto.setIsActive(m.getIsActive());
|
dto.setIsActive(m.getIsActive());
|
||||||
dto.setLastFullImportAt(m.getLastFullImportAt());
|
dto.setLastFullImportAt(m.getLastFullImportAt());
|
||||||
dto.setLastOfferSyncAt(m.getLastOfferSyncAt());
|
dto.setLastOfferSyncAt(m.getLastOfferSyncAt());
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,65 +1,65 @@
|
|||||||
package group.goforward.ballistic.controllers;
|
package group.goforward.ballistic.controllers;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Merchant;
|
import group.goforward.ballistic.model.Merchant;
|
||||||
import group.goforward.ballistic.model.MerchantCategoryMapping;
|
import group.goforward.ballistic.model.MerchantCategoryMapping;
|
||||||
import group.goforward.ballistic.repos.MerchantRepository;
|
import group.goforward.ballistic.repos.MerchantRepository;
|
||||||
import group.goforward.ballistic.services.MerchantCategoryMappingService;
|
import group.goforward.ballistic.services.MerchantCategoryMappingService;
|
||||||
import group.goforward.ballistic.web.dto.MerchantCategoryMappingDto;
|
import group.goforward.ballistic.web.dto.MerchantCategoryMappingDto;
|
||||||
import group.goforward.ballistic.web.dto.UpsertMerchantCategoryMappingRequest;
|
import group.goforward.ballistic.web.dto.UpsertMerchantCategoryMappingRequest;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/admin/merchant-category-mappings")
|
@RequestMapping("/admin/merchant-category-mappings")
|
||||||
@CrossOrigin
|
@CrossOrigin
|
||||||
public class MerchantCategoryMappingController {
|
public class MerchantCategoryMappingController {
|
||||||
|
|
||||||
private final MerchantCategoryMappingService mappingService;
|
private final MerchantCategoryMappingService mappingService;
|
||||||
private final MerchantRepository merchantRepository;
|
private final MerchantRepository merchantRepository;
|
||||||
|
|
||||||
public MerchantCategoryMappingController(
|
public MerchantCategoryMappingController(
|
||||||
MerchantCategoryMappingService mappingService,
|
MerchantCategoryMappingService mappingService,
|
||||||
MerchantRepository merchantRepository
|
MerchantRepository merchantRepository
|
||||||
) {
|
) {
|
||||||
this.mappingService = mappingService;
|
this.mappingService = mappingService;
|
||||||
this.merchantRepository = merchantRepository;
|
this.merchantRepository = merchantRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public List<MerchantCategoryMappingDto> listMappings(
|
public List<MerchantCategoryMappingDto> listMappings(
|
||||||
@RequestParam("merchantId") Integer merchantId
|
@RequestParam("merchantId") Integer merchantId
|
||||||
) {
|
) {
|
||||||
List<MerchantCategoryMapping> mappings = mappingService.findByMerchant(merchantId);
|
List<MerchantCategoryMapping> mappings = mappingService.findByMerchant(merchantId);
|
||||||
return mappings.stream()
|
return mappings.stream()
|
||||||
.map(this::toDto)
|
.map(this::toDto)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping
|
@PostMapping
|
||||||
public MerchantCategoryMappingDto upsertMapping(
|
public MerchantCategoryMappingDto upsertMapping(
|
||||||
@RequestBody UpsertMerchantCategoryMappingRequest request
|
@RequestBody UpsertMerchantCategoryMappingRequest request
|
||||||
) {
|
) {
|
||||||
Merchant merchant = merchantRepository
|
Merchant merchant = merchantRepository
|
||||||
.findById(request.getMerchantId())
|
.findById(request.getMerchantId())
|
||||||
.orElseThrow(() -> new IllegalArgumentException("Merchant not found: " + request.getMerchantId()));
|
.orElseThrow(() -> new IllegalArgumentException("Merchant not found: " + request.getMerchantId()));
|
||||||
|
|
||||||
MerchantCategoryMapping mapping = mappingService.upsertMapping(
|
MerchantCategoryMapping mapping = mappingService.upsertMapping(
|
||||||
merchant,
|
merchant,
|
||||||
request.getRawCategory(),
|
request.getRawCategory(),
|
||||||
request.getMappedPartRole()
|
request.getMappedPartRole()
|
||||||
);
|
);
|
||||||
|
|
||||||
return toDto(mapping);
|
return toDto(mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
private MerchantCategoryMappingDto toDto(MerchantCategoryMapping mapping) {
|
private MerchantCategoryMappingDto toDto(MerchantCategoryMapping mapping) {
|
||||||
MerchantCategoryMappingDto dto = new MerchantCategoryMappingDto();
|
MerchantCategoryMappingDto dto = new MerchantCategoryMappingDto();
|
||||||
dto.setId(mapping.getId());
|
dto.setId(mapping.getId());
|
||||||
dto.setMerchantId(mapping.getMerchant().getId());
|
dto.setMerchantId(mapping.getMerchant().getId());
|
||||||
dto.setMerchantName(mapping.getMerchant().getName());
|
dto.setMerchantName(mapping.getMerchant().getName());
|
||||||
dto.setRawCategory(mapping.getRawCategory());
|
dto.setRawCategory(mapping.getRawCategory());
|
||||||
dto.setMappedPartRole(mapping.getMappedPartRole());
|
dto.setMappedPartRole(mapping.getMappedPartRole());
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,23 +1,23 @@
|
|||||||
package group.goforward.ballistic.controllers;
|
package group.goforward.ballistic.controllers;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Merchant;
|
import group.goforward.ballistic.model.Merchant;
|
||||||
import group.goforward.ballistic.repos.MerchantRepository;
|
import group.goforward.ballistic.repos.MerchantRepository;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
public class MerchantDebugController {
|
public class MerchantDebugController {
|
||||||
|
|
||||||
private final MerchantRepository merchantRepository;
|
private final MerchantRepository merchantRepository;
|
||||||
|
|
||||||
public MerchantDebugController(MerchantRepository merchantRepository) {
|
public MerchantDebugController(MerchantRepository merchantRepository) {
|
||||||
this.merchantRepository = merchantRepository;
|
this.merchantRepository = merchantRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/admin/debug/merchants")
|
@GetMapping("/admin/debug/merchants")
|
||||||
public List<Merchant> listMerchants() {
|
public List<Merchant> listMerchants() {
|
||||||
return merchantRepository.findAll();
|
return merchantRepository.findAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
package group.goforward.ballistic.controllers;
|
package group.goforward.ballistic.controllers;
|
||||||
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
public class PingController {
|
public class PingController {
|
||||||
|
|
||||||
@GetMapping("/ping")
|
@GetMapping("/ping")
|
||||||
public String ping() {
|
public String ping() {
|
||||||
return "pong";
|
return "pong";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,137 +1,137 @@
|
|||||||
package group.goforward.ballistic.controllers;
|
package group.goforward.ballistic.controllers;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Product;
|
import group.goforward.ballistic.model.Product;
|
||||||
import group.goforward.ballistic.model.ProductOffer;
|
import group.goforward.ballistic.model.ProductOffer;
|
||||||
import group.goforward.ballistic.repos.ProductOfferRepository;
|
import group.goforward.ballistic.repos.ProductOfferRepository;
|
||||||
import group.goforward.ballistic.web.dto.ProductOfferDto;
|
import group.goforward.ballistic.web.dto.ProductOfferDto;
|
||||||
import group.goforward.ballistic.repos.ProductRepository;
|
import group.goforward.ballistic.repos.ProductRepository;
|
||||||
import group.goforward.ballistic.web.dto.ProductSummaryDto;
|
import group.goforward.ballistic.web.dto.ProductSummaryDto;
|
||||||
import group.goforward.ballistic.web.mapper.ProductMapper;
|
import group.goforward.ballistic.web.mapper.ProductMapper;
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/products")
|
@RequestMapping("/api/products")
|
||||||
@CrossOrigin
|
@CrossOrigin
|
||||||
public class ProductController {
|
public class ProductController {
|
||||||
|
|
||||||
private final ProductRepository productRepository;
|
private final ProductRepository productRepository;
|
||||||
private final ProductOfferRepository productOfferRepository;
|
private final ProductOfferRepository productOfferRepository;
|
||||||
|
|
||||||
public ProductController(
|
public ProductController(
|
||||||
ProductRepository productRepository,
|
ProductRepository productRepository,
|
||||||
ProductOfferRepository productOfferRepository
|
ProductOfferRepository productOfferRepository
|
||||||
) {
|
) {
|
||||||
this.productRepository = productRepository;
|
this.productRepository = productRepository;
|
||||||
this.productOfferRepository = productOfferRepository;
|
this.productOfferRepository = productOfferRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/gunbuilder")
|
@GetMapping("/gunbuilder")
|
||||||
@Cacheable(
|
@Cacheable(
|
||||||
value = "gunbuilderProducts",
|
value = "gunbuilderProducts",
|
||||||
key = "#platform + '::' + (#partRoles == null ? 'ALL' : #partRoles.toString())"
|
key = "#platform + '::' + (#partRoles == null ? 'ALL' : #partRoles.toString())"
|
||||||
)
|
)
|
||||||
public List<ProductSummaryDto> getGunbuilderProducts(
|
public List<ProductSummaryDto> getGunbuilderProducts(
|
||||||
@RequestParam(defaultValue = "AR-15") String platform,
|
@RequestParam(defaultValue = "AR-15") String platform,
|
||||||
@RequestParam(required = false, name = "partRoles") List<String> partRoles
|
@RequestParam(required = false, name = "partRoles") List<String> partRoles
|
||||||
) {
|
) {
|
||||||
long started = System.currentTimeMillis();
|
long started = System.currentTimeMillis();
|
||||||
System.out.println("getGunbuilderProducts: start, platform=" + platform +
|
System.out.println("getGunbuilderProducts: start, platform=" + platform +
|
||||||
", partRoles=" + (partRoles == null ? "null" : partRoles));
|
", partRoles=" + (partRoles == null ? "null" : partRoles));
|
||||||
|
|
||||||
// 1) Load products (with brand pre-fetched)
|
// 1) Load products (with brand pre-fetched)
|
||||||
long tProductsStart = System.currentTimeMillis();
|
long tProductsStart = System.currentTimeMillis();
|
||||||
List<Product> products;
|
List<Product> products;
|
||||||
if (partRoles == null || partRoles.isEmpty()) {
|
if (partRoles == null || partRoles.isEmpty()) {
|
||||||
products = productRepository.findByPlatformWithBrand(platform);
|
products = productRepository.findByPlatformWithBrand(platform);
|
||||||
} else {
|
} else {
|
||||||
products = productRepository.findByPlatformAndPartRoleInWithBrand(platform, partRoles);
|
products = productRepository.findByPlatformAndPartRoleInWithBrand(platform, partRoles);
|
||||||
}
|
}
|
||||||
long tProductsEnd = System.currentTimeMillis();
|
long tProductsEnd = System.currentTimeMillis();
|
||||||
System.out.println("getGunbuilderProducts: loaded products: " +
|
System.out.println("getGunbuilderProducts: loaded products: " +
|
||||||
products.size() + " in " + (tProductsEnd - tProductsStart) + " ms");
|
products.size() + " in " + (tProductsEnd - tProductsStart) + " ms");
|
||||||
|
|
||||||
if (products.isEmpty()) {
|
if (products.isEmpty()) {
|
||||||
long took = System.currentTimeMillis() - started;
|
long took = System.currentTimeMillis() - started;
|
||||||
System.out.println("getGunbuilderProducts: 0 products in " + took + " ms");
|
System.out.println("getGunbuilderProducts: 0 products in " + took + " ms");
|
||||||
return List.of();
|
return List.of();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2) Load offers for these product IDs
|
// 2) Load offers for these product IDs
|
||||||
long tOffersStart = System.currentTimeMillis();
|
long tOffersStart = System.currentTimeMillis();
|
||||||
List<Integer> productIds = products.stream()
|
List<Integer> productIds = products.stream()
|
||||||
.map(Product::getId)
|
.map(Product::getId)
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
List<ProductOffer> allOffers =
|
List<ProductOffer> allOffers =
|
||||||
productOfferRepository.findByProductIdIn(productIds);
|
productOfferRepository.findByProductIdIn(productIds);
|
||||||
long tOffersEnd = System.currentTimeMillis();
|
long tOffersEnd = System.currentTimeMillis();
|
||||||
System.out.println("getGunbuilderProducts: loaded offers: " +
|
System.out.println("getGunbuilderProducts: loaded offers: " +
|
||||||
allOffers.size() + " in " + (tOffersEnd - tOffersStart) + " ms");
|
allOffers.size() + " in " + (tOffersEnd - tOffersStart) + " ms");
|
||||||
|
|
||||||
Map<Integer, List<ProductOffer>> offersByProductId = allOffers.stream()
|
Map<Integer, List<ProductOffer>> offersByProductId = allOffers.stream()
|
||||||
.collect(Collectors.groupingBy(o -> o.getProduct().getId()));
|
.collect(Collectors.groupingBy(o -> o.getProduct().getId()));
|
||||||
|
|
||||||
// 3) Map to DTOs with price and buyUrl
|
// 3) Map to DTOs with price and buyUrl
|
||||||
long tMapStart = System.currentTimeMillis();
|
long tMapStart = System.currentTimeMillis();
|
||||||
List<ProductSummaryDto> result = products.stream()
|
List<ProductSummaryDto> result = products.stream()
|
||||||
.map(p -> {
|
.map(p -> {
|
||||||
List<ProductOffer> offersForProduct =
|
List<ProductOffer> offersForProduct =
|
||||||
offersByProductId.getOrDefault(p.getId(), Collections.emptyList());
|
offersByProductId.getOrDefault(p.getId(), Collections.emptyList());
|
||||||
|
|
||||||
ProductOffer bestOffer = pickBestOffer(offersForProduct);
|
ProductOffer bestOffer = pickBestOffer(offersForProduct);
|
||||||
|
|
||||||
BigDecimal price = bestOffer != null ? bestOffer.getEffectivePrice() : null;
|
BigDecimal price = bestOffer != null ? bestOffer.getEffectivePrice() : null;
|
||||||
String buyUrl = bestOffer != null ? bestOffer.getBuyUrl() : null;
|
String buyUrl = bestOffer != null ? bestOffer.getBuyUrl() : null;
|
||||||
|
|
||||||
return ProductMapper.toSummary(p, price, buyUrl);
|
return ProductMapper.toSummary(p, price, buyUrl);
|
||||||
})
|
})
|
||||||
.toList();
|
.toList();
|
||||||
long tMapEnd = System.currentTimeMillis();
|
long tMapEnd = System.currentTimeMillis();
|
||||||
long took = System.currentTimeMillis() - started;
|
long took = System.currentTimeMillis() - started;
|
||||||
|
|
||||||
System.out.println("getGunbuilderProducts: mapping to DTOs took " +
|
System.out.println("getGunbuilderProducts: mapping to DTOs took " +
|
||||||
(tMapEnd - tMapStart) + " ms");
|
(tMapEnd - tMapStart) + " ms");
|
||||||
System.out.println("getGunbuilderProducts: TOTAL " + took + " ms (" +
|
System.out.println("getGunbuilderProducts: TOTAL " + took + " ms (" +
|
||||||
"products=" + (tProductsEnd - tProductsStart) + " ms, " +
|
"products=" + (tProductsEnd - tProductsStart) + " ms, " +
|
||||||
"offers=" + (tOffersEnd - tOffersStart) + " ms, " +
|
"offers=" + (tOffersEnd - tOffersStart) + " ms, " +
|
||||||
"map=" + (tMapEnd - tMapStart) + " ms)");
|
"map=" + (tMapEnd - tMapStart) + " ms)");
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/{id}/offers")
|
@GetMapping("/{id}/offers")
|
||||||
public List<ProductOfferDto> getOffersForProduct(@PathVariable("id") Integer productId) {
|
public List<ProductOfferDto> getOffersForProduct(@PathVariable("id") Integer productId) {
|
||||||
List<ProductOffer> offers = productOfferRepository.findByProductId(productId);
|
List<ProductOffer> offers = productOfferRepository.findByProductId(productId);
|
||||||
|
|
||||||
return offers.stream()
|
return offers.stream()
|
||||||
.map(offer -> {
|
.map(offer -> {
|
||||||
ProductOfferDto dto = new ProductOfferDto();
|
ProductOfferDto dto = new ProductOfferDto();
|
||||||
dto.setId(offer.getId().toString());
|
dto.setId(offer.getId().toString());
|
||||||
dto.setMerchantName(offer.getMerchant().getName());
|
dto.setMerchantName(offer.getMerchant().getName());
|
||||||
dto.setPrice(offer.getEffectivePrice());
|
dto.setPrice(offer.getEffectivePrice());
|
||||||
dto.setOriginalPrice(offer.getOriginalPrice());
|
dto.setOriginalPrice(offer.getOriginalPrice());
|
||||||
dto.setInStock(Boolean.TRUE.equals(offer.getInStock()));
|
dto.setInStock(Boolean.TRUE.equals(offer.getInStock()));
|
||||||
dto.setBuyUrl(offer.getBuyUrl());
|
dto.setBuyUrl(offer.getBuyUrl());
|
||||||
dto.setLastUpdated(offer.getLastSeenAt());
|
dto.setLastUpdated(offer.getLastSeenAt());
|
||||||
return dto;
|
return dto;
|
||||||
})
|
})
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProductOffer pickBestOffer(List<ProductOffer> offers) {
|
private ProductOffer pickBestOffer(List<ProductOffer> offers) {
|
||||||
if (offers == null || offers.isEmpty()) {
|
if (offers == null || offers.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right now: lowest price wins, regardless of stock (we set inStock=true on import anyway)
|
// Right now: lowest price wins, regardless of stock (we set inStock=true on import anyway)
|
||||||
return offers.stream()
|
return offers.stream()
|
||||||
.filter(o -> o.getEffectivePrice() != null)
|
.filter(o -> o.getEffectivePrice() != null)
|
||||||
.min(Comparator.comparing(ProductOffer::getEffectivePrice))
|
.min(Comparator.comparing(ProductOffer::getEffectivePrice))
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
package group.goforward.ballistic.controllers;
|
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Psa;
|
|
||||||
import group.goforward.ballistic.services.impl.PsaServiceImpl;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/api/psa")
|
|
||||||
public class PsaController {
|
|
||||||
|
|
||||||
private final PsaServiceImpl psaService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public PsaController(PsaServiceImpl psaService) {
|
|
||||||
this.psaService = psaService;
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/api/getAllPsa")
|
|
||||||
public List<Psa> getAllPsa() {
|
|
||||||
return psaService.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/api/getPSAById/{id}")
|
|
||||||
public ResponseEntity<Psa> getPsaById(@PathVariable UUID id) {
|
|
||||||
Optional<Psa> psa = psaService.findById(id);
|
|
||||||
return psa.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping
|
|
||||||
public Psa createPsa(@RequestBody Psa psa) {
|
|
||||||
return psaService.save(psa);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping("/api/updatePsa/{id}")
|
|
||||||
public ResponseEntity<Psa> updatePsa(@PathVariable UUID id, @RequestBody Psa psaDetails) {
|
|
||||||
Optional<Psa> psa = psaService.findById(id);
|
|
||||||
if (psa.isPresent()) {
|
|
||||||
Psa updatedPsa = psa.get();
|
|
||||||
// Update fields of the Psa entity as needed
|
|
||||||
return ResponseEntity.ok(psaService.save(updatedPsa));
|
|
||||||
} else {
|
|
||||||
return ResponseEntity.notFound().build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@DeleteMapping("/api/deletePsa/{id}")
|
|
||||||
public ResponseEntity<Void> deletePsa(@PathVariable UUID id) {
|
|
||||||
psaService.deleteById(id);
|
|
||||||
return ResponseEntity.noContent().build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,6 +5,7 @@ import group.goforward.ballistic.model.State;
|
|||||||
import group.goforward.ballistic.repos.StateRepository;
|
import group.goforward.ballistic.repos.StateRepository;
|
||||||
import group.goforward.ballistic.services.StatesService;
|
import group.goforward.ballistic.services.StatesService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
@@ -13,44 +14,38 @@ import java.util.List;
|
|||||||
|
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping()
|
@RequestMapping("/api/states")
|
||||||
public class StateController {
|
public class StateController {
|
||||||
@Autowired
|
@Autowired
|
||||||
private StateRepository repo;
|
private StateRepository repo;
|
||||||
@Autowired
|
@Autowired
|
||||||
private StatesService statesService;
|
private StatesService statesService;
|
||||||
|
//@Cacheable(value="getAllStates")
|
||||||
@GetMapping("/api/getAllStates")
|
@GetMapping("/all")
|
||||||
public ResponseEntity<List<State>> getAllStates() {
|
public ResponseEntity<List<State>> getAllStates() {
|
||||||
List<State> state = repo.findAll();
|
List<State> state = repo.findAll();
|
||||||
return ResponseEntity.ok(state);
|
return ResponseEntity.ok(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/api/getAllStatesTest")
|
@GetMapping("/{id}")
|
||||||
public ApiResponse<List<State>> getAllStatesTest() {
|
|
||||||
List<State> state = repo.findAll();
|
|
||||||
return ApiResponse.success(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/api/getAllStatesById/{id}")
|
|
||||||
public ResponseEntity<State> getAllStatesById(@PathVariable Integer id) {
|
public ResponseEntity<State> getAllStatesById(@PathVariable Integer id) {
|
||||||
return repo.findById(id)
|
return repo.findById(id)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.orElse(ResponseEntity.notFound().build());
|
.orElse(ResponseEntity.notFound().build());
|
||||||
}
|
}
|
||||||
@GetMapping("/api/getAllStatesByAbbreviation/{abbreviation}")
|
@GetMapping("/byAbbrev/{abbreviation}")
|
||||||
public ResponseEntity<State> getAllStatesByAbbreviation(@PathVariable String abbreviation) {
|
public ResponseEntity<State> getAllStatesByAbbreviation(@PathVariable String abbreviation) {
|
||||||
return repo.findByAbbreviation(abbreviation)
|
return repo.findByAbbreviation(abbreviation)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.orElse(ResponseEntity.notFound().build());
|
.orElse(ResponseEntity.notFound().build());
|
||||||
}
|
}
|
||||||
@PostMapping("/api/addState")
|
@PostMapping("/addState")
|
||||||
public ResponseEntity<State> createState(@RequestBody State item) {
|
public ResponseEntity<State> createState(@RequestBody State item) {
|
||||||
State created = statesService.save(item);
|
State created = statesService.save(item);
|
||||||
return ResponseEntity.status(HttpStatus.CREATED).body(created);
|
return ResponseEntity.status(HttpStatus.CREATED).body(created);
|
||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/api/deleteState/{id}")
|
@DeleteMapping("/deleteState/{id}")
|
||||||
public ResponseEntity<Void> deleteItem(@PathVariable Integer id) {
|
public ResponseEntity<Void> deleteItem(@PathVariable Integer id) {
|
||||||
return statesService.findById(id)
|
return statesService.findById(id)
|
||||||
.map(item -> {
|
.map(item -> {
|
||||||
|
|||||||
@@ -1,50 +1,53 @@
|
|||||||
package group.goforward.ballistic.controllers;
|
package group.goforward.ballistic.controllers;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.User;
|
import group.goforward.ballistic.model.User;
|
||||||
import group.goforward.ballistic.repos.UserRepository;
|
import group.goforward.ballistic.repos.UserRepository;
|
||||||
import group.goforward.ballistic.services.UsersService;
|
import group.goforward.ballistic.services.UsersService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping()
|
@RequestMapping("/api/user")
|
||||||
public class UserController {
|
public class UserController {
|
||||||
@Autowired
|
private final UserRepository repo;
|
||||||
private UserRepository repo;
|
private final UsersService usersService;
|
||||||
@Autowired
|
|
||||||
private UsersService usersService;
|
public UserController(UserRepository repo, UsersService usersService) {
|
||||||
|
this.repo = repo;
|
||||||
@GetMapping("/api/getAllUsers")
|
this.usersService = usersService;
|
||||||
public ResponseEntity<List<User>> getAllUsers() {
|
}
|
||||||
List<User> data = repo.findAll();
|
|
||||||
return ResponseEntity.ok(data);
|
@GetMapping("/all")
|
||||||
}
|
public ResponseEntity<List<User>> getAllUsers() {
|
||||||
|
List<User> data = repo.findAll();
|
||||||
|
return ResponseEntity.ok(data);
|
||||||
@GetMapping("/api/getAllUsersById/{id}")
|
}
|
||||||
public ResponseEntity<User> getAllStatesById(@PathVariable Integer id) {
|
|
||||||
return repo.findById(id)
|
|
||||||
.map(ResponseEntity::ok)
|
@GetMapping("/byId/{id}")
|
||||||
.orElse(ResponseEntity.notFound().build());
|
public ResponseEntity<User> getAllStatesById(@PathVariable Integer id) {
|
||||||
}
|
return repo.findById(id)
|
||||||
@PostMapping("/api/addUser")
|
.map(ResponseEntity::ok)
|
||||||
public ResponseEntity<User> createUser(@RequestBody User item) {
|
.orElse(ResponseEntity.notFound().build());
|
||||||
User created = usersService.save(item);
|
}
|
||||||
return ResponseEntity.status(HttpStatus.CREATED).body(created);
|
@PostMapping("/addUser")
|
||||||
}
|
public ResponseEntity<User> createUser(@RequestBody User item) {
|
||||||
|
User created = usersService.save(item);
|
||||||
@DeleteMapping("/api/deleteUser/{id}")
|
return ResponseEntity.status(HttpStatus.CREATED).body(created);
|
||||||
public ResponseEntity<Void> deleteItem(@PathVariable Integer id) {
|
}
|
||||||
return usersService.findById(id)
|
|
||||||
.map(item -> {
|
@DeleteMapping("/deleteUser/{id}")
|
||||||
usersService.deleteById(id);
|
public ResponseEntity<Void> deleteItem(@PathVariable Integer id) {
|
||||||
return ResponseEntity.noContent().<Void>build();
|
return usersService.findById(id)
|
||||||
})
|
.map(item -> {
|
||||||
.orElse(ResponseEntity.notFound().build());
|
usersService.deleteById(id);
|
||||||
}
|
return ResponseEntity.noContent().<Void>build();
|
||||||
}
|
})
|
||||||
|
.orElse(ResponseEntity.notFound().build());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
/**
|
/**
|
||||||
* Provides the classes necessary for the Spring Controllers for the ballistic -Builder application.
|
* Provides the classes necessary for the Spring Controllers for the ballistic -Builder application.
|
||||||
* This package includes Controllers for Spring-Boot application
|
* This package includes Controllers for Spring-Boot application
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* <p>The main entry point for managing the inventory is the
|
* <p>The main entry point for managing the inventory is the
|
||||||
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
* @author Don Strawsburg
|
* @author Don Strawsburg
|
||||||
* @version 1.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
package group.goforward.ballistic.controllers;
|
package group.goforward.ballistic.controllers;
|
||||||
@@ -1,30 +1,30 @@
|
|||||||
package group.goforward.ballistic.imports;
|
package group.goforward.ballistic.imports;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public record MerchantFeedRow(
|
public record MerchantFeedRow(
|
||||||
String sku,
|
String sku,
|
||||||
String manufacturerId,
|
String manufacturerId,
|
||||||
String brandName,
|
String brandName,
|
||||||
String productName,
|
String productName,
|
||||||
String longDescription,
|
String longDescription,
|
||||||
String shortDescription,
|
String shortDescription,
|
||||||
String department,
|
String department,
|
||||||
String category,
|
String category,
|
||||||
String subCategory,
|
String subCategory,
|
||||||
String thumbUrl,
|
String thumbUrl,
|
||||||
String imageUrl,
|
String imageUrl,
|
||||||
String buyLink,
|
String buyLink,
|
||||||
String keywords,
|
String keywords,
|
||||||
String reviews,
|
String reviews,
|
||||||
BigDecimal retailPrice,
|
BigDecimal retailPrice,
|
||||||
BigDecimal salePrice,
|
BigDecimal salePrice,
|
||||||
String brandPageLink,
|
String brandPageLink,
|
||||||
String brandLogoImage,
|
String brandLogoImage,
|
||||||
String productPageViewTracking,
|
String productPageViewTracking,
|
||||||
String variantsXml,
|
String variantsXml,
|
||||||
String mediumImageUrl,
|
String mediumImageUrl,
|
||||||
String productContentWidget,
|
String productContentWidget,
|
||||||
String googleCategorization,
|
String googleCategorization,
|
||||||
String itemBasedCommission
|
String itemBasedCommission
|
||||||
) {}
|
) {}
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
package group.goforward.ballistic.imports.dto;
|
package group.goforward.ballistic.imports.dto;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public record MerchantFeedRow(
|
public record MerchantFeedRow(
|
||||||
String brandName,
|
String brandName,
|
||||||
String productName,
|
String productName,
|
||||||
String mpn,
|
String mpn,
|
||||||
String upc,
|
String upc,
|
||||||
String avantlinkProductId,
|
String avantlinkProductId,
|
||||||
String sku,
|
String sku,
|
||||||
String categoryPath,
|
String categoryPath,
|
||||||
String buyUrl,
|
String buyUrl,
|
||||||
BigDecimal price,
|
BigDecimal price,
|
||||||
BigDecimal originalPrice,
|
BigDecimal originalPrice,
|
||||||
boolean inStock
|
boolean inStock
|
||||||
) {}
|
) {}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
/**
|
/**
|
||||||
* Provides the classes necessary for the Spring Data Transfer Objects for the ballistic -Builder application.
|
* Provides the classes necessary for the Spring Data Transfer Objects for the ballistic -Builder application.
|
||||||
* This package includes DTO for Spring-Boot application
|
* This package includes DTO for Spring-Boot application
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* <p>The main entry point for managing the inventory is the
|
* <p>The main entry point for managing the inventory is the
|
||||||
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
* @author Sean Strawsburg
|
* @author Sean Strawsburg
|
||||||
* @version 1.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
package group.goforward.ballistic.imports.dto;
|
package group.goforward.ballistic.imports.dto;
|
||||||
@@ -6,6 +6,7 @@ import jakarta.persistence.Id;
|
|||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
import org.hibernate.annotations.ColumnDefault;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@@ -53,6 +54,15 @@ public class Account {
|
|||||||
@Column(name = "scope", length = Integer.MAX_VALUE)
|
@Column(name = "scope", length = Integer.MAX_VALUE)
|
||||||
private String scope;
|
private String scope;
|
||||||
|
|
||||||
|
@Column(name = "created_at")
|
||||||
|
private OffsetDateTime createdAt;
|
||||||
|
|
||||||
|
@Column(name = "updated_at")
|
||||||
|
private OffsetDateTime updatedAt;
|
||||||
|
|
||||||
|
@Column(name = "deleted_at")
|
||||||
|
private OffsetDateTime deletedAt;
|
||||||
|
|
||||||
public UUID getId() {
|
public UUID getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
@@ -157,4 +167,28 @@ public class Account {
|
|||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getCreatedAt() {
|
||||||
|
return createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedAt(OffsetDateTime createdAt) {
|
||||||
|
this.createdAt = createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getUpdatedAt() {
|
||||||
|
return updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdatedAt(OffsetDateTime updatedAt) {
|
||||||
|
this.updatedAt = updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getDeletedAt() {
|
||||||
|
return deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeletedAt(OffsetDateTime deletedAt) {
|
||||||
|
this.deletedAt = deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,293 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "aero_precision")
|
|
||||||
public class
|
|
||||||
AeroPrecision {
|
|
||||||
@Id
|
|
||||||
@Column(name = "sku", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String sku;
|
|
||||||
|
|
||||||
@Column(name = "manufacturer_id", length = Integer.MAX_VALUE)
|
|
||||||
private String manufacturerId;
|
|
||||||
|
|
||||||
@Column(name = "brand_name", length = Integer.MAX_VALUE)
|
|
||||||
private String brandName;
|
|
||||||
|
|
||||||
@Column(name = "product_name", length = Integer.MAX_VALUE)
|
|
||||||
private String productName;
|
|
||||||
|
|
||||||
@Column(name = "long_description", length = Integer.MAX_VALUE)
|
|
||||||
private String longDescription;
|
|
||||||
|
|
||||||
@Column(name = "short_description", length = Integer.MAX_VALUE)
|
|
||||||
private String shortDescription;
|
|
||||||
|
|
||||||
@Column(name = "department", length = Integer.MAX_VALUE)
|
|
||||||
private String department;
|
|
||||||
|
|
||||||
@Column(name = "category", length = Integer.MAX_VALUE)
|
|
||||||
private String category;
|
|
||||||
|
|
||||||
@Column(name = "subcategory", length = Integer.MAX_VALUE)
|
|
||||||
private String subcategory;
|
|
||||||
|
|
||||||
@Column(name = "thumb_url", length = Integer.MAX_VALUE)
|
|
||||||
private String thumbUrl;
|
|
||||||
|
|
||||||
@Column(name = "image_url", length = Integer.MAX_VALUE)
|
|
||||||
private String imageUrl;
|
|
||||||
|
|
||||||
@Column(name = "buy_link", length = Integer.MAX_VALUE)
|
|
||||||
private String buyLink;
|
|
||||||
|
|
||||||
@Column(name = "keywords", length = Integer.MAX_VALUE)
|
|
||||||
private String keywords;
|
|
||||||
|
|
||||||
@Column(name = "reviews", length = Integer.MAX_VALUE)
|
|
||||||
private String reviews;
|
|
||||||
|
|
||||||
@Column(name = "retail_price")
|
|
||||||
private BigDecimal retailPrice;
|
|
||||||
|
|
||||||
@Column(name = "sale_price")
|
|
||||||
private BigDecimal salePrice;
|
|
||||||
|
|
||||||
@Column(name = "brand_page_link", length = Integer.MAX_VALUE)
|
|
||||||
private String brandPageLink;
|
|
||||||
|
|
||||||
@Column(name = "brand_logo_image", length = Integer.MAX_VALUE)
|
|
||||||
private String brandLogoImage;
|
|
||||||
|
|
||||||
@Column(name = "product_page_view_tracking", length = Integer.MAX_VALUE)
|
|
||||||
private String productPageViewTracking;
|
|
||||||
|
|
||||||
@Column(name = "variants_xml", length = Integer.MAX_VALUE)
|
|
||||||
private String variantsXml;
|
|
||||||
|
|
||||||
@Column(name = "medium_image_url", length = Integer.MAX_VALUE)
|
|
||||||
private String mediumImageUrl;
|
|
||||||
|
|
||||||
@Column(name = "product_content_widget", length = Integer.MAX_VALUE)
|
|
||||||
private String productContentWidget;
|
|
||||||
|
|
||||||
@Column(name = "google_categorization", length = Integer.MAX_VALUE)
|
|
||||||
private String googleCategorization;
|
|
||||||
|
|
||||||
@Column(name = "item_based_commission", length = Integer.MAX_VALUE)
|
|
||||||
private String itemBasedCommission;
|
|
||||||
|
|
||||||
@ColumnDefault("gen_random_uuid()")
|
|
||||||
@Column(name = "uuid")
|
|
||||||
private UUID uuid;
|
|
||||||
|
|
||||||
public String getSku() {
|
|
||||||
return sku;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSku(String sku) {
|
|
||||||
this.sku = sku;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getManufacturerId() {
|
|
||||||
return manufacturerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setManufacturerId(String manufacturerId) {
|
|
||||||
this.manufacturerId = manufacturerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBrandName() {
|
|
||||||
return brandName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandName(String brandName) {
|
|
||||||
this.brandName = brandName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProductName() {
|
|
||||||
return productName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductName(String productName) {
|
|
||||||
this.productName = productName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLongDescription() {
|
|
||||||
return longDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLongDescription(String longDescription) {
|
|
||||||
this.longDescription = longDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getShortDescription() {
|
|
||||||
return shortDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setShortDescription(String shortDescription) {
|
|
||||||
this.shortDescription = shortDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDepartment() {
|
|
||||||
return department;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDepartment(String department) {
|
|
||||||
this.department = department;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCategory() {
|
|
||||||
return category;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCategory(String category) {
|
|
||||||
this.category = category;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSubcategory() {
|
|
||||||
return subcategory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSubcategory(String subcategory) {
|
|
||||||
this.subcategory = subcategory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getThumbUrl() {
|
|
||||||
return thumbUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setThumbUrl(String thumbUrl) {
|
|
||||||
this.thumbUrl = thumbUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getImageUrl() {
|
|
||||||
return imageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setImageUrl(String imageUrl) {
|
|
||||||
this.imageUrl = imageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBuyLink() {
|
|
||||||
return buyLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBuyLink(String buyLink) {
|
|
||||||
this.buyLink = buyLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getKeywords() {
|
|
||||||
return keywords;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setKeywords(String keywords) {
|
|
||||||
this.keywords = keywords;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getReviews() {
|
|
||||||
return reviews;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReviews(String reviews) {
|
|
||||||
this.reviews = reviews;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BigDecimal getRetailPrice() {
|
|
||||||
return retailPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRetailPrice(BigDecimal retailPrice) {
|
|
||||||
this.retailPrice = retailPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BigDecimal getSalePrice() {
|
|
||||||
return salePrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSalePrice(BigDecimal salePrice) {
|
|
||||||
this.salePrice = salePrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBrandPageLink() {
|
|
||||||
return brandPageLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandPageLink(String brandPageLink) {
|
|
||||||
this.brandPageLink = brandPageLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBrandLogoImage() {
|
|
||||||
return brandLogoImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandLogoImage(String brandLogoImage) {
|
|
||||||
this.brandLogoImage = brandLogoImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProductPageViewTracking() {
|
|
||||||
return productPageViewTracking;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductPageViewTracking(String productPageViewTracking) {
|
|
||||||
this.productPageViewTracking = productPageViewTracking;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getVariantsXml() {
|
|
||||||
return variantsXml;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVariantsXml(String variantsXml) {
|
|
||||||
this.variantsXml = variantsXml;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMediumImageUrl() {
|
|
||||||
return mediumImageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMediumImageUrl(String mediumImageUrl) {
|
|
||||||
this.mediumImageUrl = mediumImageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProductContentWidget() {
|
|
||||||
return productContentWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductContentWidget(String productContentWidget) {
|
|
||||||
this.productContentWidget = productContentWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGoogleCategorization() {
|
|
||||||
return googleCategorization;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGoogleCategorization(String googleCategorization) {
|
|
||||||
this.googleCategorization = googleCategorization;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemBasedCommission() {
|
|
||||||
return itemBasedCommission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemBasedCommission(String itemBasedCommission) {
|
|
||||||
this.itemBasedCommission = itemBasedCommission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UUID getUuid() {
|
|
||||||
return uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUuid(UUID uuid) {
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -2,6 +2,8 @@ package group.goforward.ballistic.model;
|
|||||||
|
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "affiliate_category_map")
|
@Table(name = "affiliate_category_map")
|
||||||
public class AffiliateCategoryMap {
|
public class AffiliateCategoryMap {
|
||||||
@@ -29,6 +31,15 @@ public class AffiliateCategoryMap {
|
|||||||
@Column(name = "notes")
|
@Column(name = "notes")
|
||||||
private String notes;
|
private String notes;
|
||||||
|
|
||||||
|
@Column(name = "created_at")
|
||||||
|
private OffsetDateTime createdAt;
|
||||||
|
|
||||||
|
@Column(name = "updated_at")
|
||||||
|
private OffsetDateTime updatedAt;
|
||||||
|
|
||||||
|
@Column(name = "deleted_at")
|
||||||
|
private OffsetDateTime deletedAt;
|
||||||
|
|
||||||
// --- getters / setters ---
|
// --- getters / setters ---
|
||||||
|
|
||||||
public Integer getId() {
|
public Integer getId() {
|
||||||
@@ -78,4 +89,28 @@ public class AffiliateCategoryMap {
|
|||||||
public void setNotes(String notes) {
|
public void setNotes(String notes) {
|
||||||
this.notes = notes;
|
this.notes = notes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getCreatedAt() {
|
||||||
|
return createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedAt(OffsetDateTime createdAt) {
|
||||||
|
this.createdAt = createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getUpdatedAt() {
|
||||||
|
return updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdatedAt(OffsetDateTime updatedAt) {
|
||||||
|
this.updatedAt = updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getDeletedAt() {
|
||||||
|
return deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeletedAt(OffsetDateTime deletedAt) {
|
||||||
|
this.deletedAt = deletedAt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.EmbeddedId;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "authenticator")
|
|
||||||
public class Authenticator {
|
|
||||||
@EmbeddedId
|
|
||||||
private AuthenticatorId id;
|
|
||||||
|
|
||||||
@Column(name = "\"providerAccountId\"", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String providerAccountId;
|
|
||||||
|
|
||||||
@Column(name = "\"credentialPublicKey\"", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String credentialPublicKey;
|
|
||||||
|
|
||||||
@Column(name = "counter", nullable = false)
|
|
||||||
private Integer counter;
|
|
||||||
|
|
||||||
@Column(name = "\"credentialDeviceType\"", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String credentialDeviceType;
|
|
||||||
|
|
||||||
@Column(name = "\"credentialBackedUp\"", nullable = false)
|
|
||||||
private Boolean credentialBackedUp = false;
|
|
||||||
|
|
||||||
@Column(name = "transports", length = Integer.MAX_VALUE)
|
|
||||||
private String transports;
|
|
||||||
|
|
||||||
public AuthenticatorId getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(AuthenticatorId id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProviderAccountId() {
|
|
||||||
return providerAccountId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProviderAccountId(String providerAccountId) {
|
|
||||||
this.providerAccountId = providerAccountId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCredentialPublicKey() {
|
|
||||||
return credentialPublicKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCredentialPublicKey(String credentialPublicKey) {
|
|
||||||
this.credentialPublicKey = credentialPublicKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getCounter() {
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCounter(Integer counter) {
|
|
||||||
this.counter = counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCredentialDeviceType() {
|
|
||||||
return credentialDeviceType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCredentialDeviceType(String credentialDeviceType) {
|
|
||||||
this.credentialDeviceType = credentialDeviceType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean getCredentialBackedUp() {
|
|
||||||
return credentialBackedUp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCredentialBackedUp(Boolean credentialBackedUp) {
|
|
||||||
this.credentialBackedUp = credentialBackedUp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTransports() {
|
|
||||||
return transports;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTransports(String transports) {
|
|
||||||
this.transports = transports;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Embeddable;
|
|
||||||
import org.hibernate.Hibernate;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
@Embeddable
|
|
||||||
public class AuthenticatorId implements java.io.Serializable {
|
|
||||||
private static final long serialVersionUID = -4147080603801184737L;
|
|
||||||
@Column(name = "\"credentialId\"", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String credentialId;
|
|
||||||
|
|
||||||
@Column(name = "\"userId\"", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String userId;
|
|
||||||
|
|
||||||
public String getCredentialId() {
|
|
||||||
return credentialId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCredentialId(String credentialId) {
|
|
||||||
this.credentialId = credentialId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserId() {
|
|
||||||
return userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUserId(String userId) {
|
|
||||||
this.userId = userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
|
|
||||||
AuthenticatorId entity = (AuthenticatorId) o;
|
|
||||||
return Objects.equals(this.credentialId, entity.credentialId) &&
|
|
||||||
Objects.equals(this.userId, entity.userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(credentialId, userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "bal_resellers")
|
|
||||||
public class BalReseller {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Column(name = "name", nullable = false, length = 100)
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@Column(name = "website_url")
|
|
||||||
private String websiteUrl;
|
|
||||||
|
|
||||||
@Column(name = "contact_email", length = 100)
|
|
||||||
private String contactEmail;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "updated_at", nullable = false)
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at", nullable = false)
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@Column(name = "deleted_at")
|
|
||||||
private Instant deletedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("gen_random_uuid()")
|
|
||||||
@Column(name = "uuid")
|
|
||||||
private UUID uuid;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getWebsiteUrl() {
|
|
||||||
return websiteUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setWebsiteUrl(String websiteUrl) {
|
|
||||||
this.websiteUrl = websiteUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContactEmail() {
|
|
||||||
return contactEmail;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setContactEmail(String contactEmail) {
|
|
||||||
this.contactEmail = contactEmail;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getDeletedAt() {
|
|
||||||
return deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeletedAt(Instant deletedAt) {
|
|
||||||
this.deletedAt = deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UUID getUuid() {
|
|
||||||
return uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUuid(UUID uuid) {
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,393 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "bb_products")
|
|
||||||
public class BbProduct {
|
|
||||||
@Id
|
|
||||||
@ColumnDefault("gen_random_uuid()")
|
|
||||||
@Column(name = "uuid", nullable = false)
|
|
||||||
private UUID id;
|
|
||||||
|
|
||||||
@Column(name = "\"UPC\"", length = 100)
|
|
||||||
private String upc;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "updated_at", nullable = false)
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at", nullable = false)
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@Column(name = "deleted_at")
|
|
||||||
private Instant deletedAt;
|
|
||||||
|
|
||||||
@Column(name = "\"SKU\"", length = 50)
|
|
||||||
private String sku;
|
|
||||||
|
|
||||||
@Column(name = "\"MANUFACTURER_ID\"", length = 50)
|
|
||||||
private String manufacturerId;
|
|
||||||
|
|
||||||
@Column(name = "\"BRAND_NAME\"", length = 50)
|
|
||||||
private String brandName;
|
|
||||||
|
|
||||||
@Column(name = "\"PRODUCT_NAME\"")
|
|
||||||
private String productName;
|
|
||||||
|
|
||||||
@Column(name = "\"LONG_DESCRIPTION\"", length = Integer.MAX_VALUE)
|
|
||||||
private String longDescription;
|
|
||||||
|
|
||||||
@Column(name = "\"SHORT_DESCRIPTION\"", length = 500)
|
|
||||||
private String shortDescription;
|
|
||||||
|
|
||||||
@Column(name = "\"DEPARTMENT\"", length = 100)
|
|
||||||
private String department;
|
|
||||||
|
|
||||||
@Column(name = "\"CATEGORY\"", length = 100)
|
|
||||||
private String category;
|
|
||||||
|
|
||||||
@Column(name = "\"SUBCATEGORY\"", length = 100)
|
|
||||||
private String subcategory;
|
|
||||||
|
|
||||||
@Column(name = "\"THUMB_URL\"", length = 500)
|
|
||||||
private String thumbUrl;
|
|
||||||
|
|
||||||
@Column(name = "\"IMAGE_URL\"", length = 500)
|
|
||||||
private String imageUrl;
|
|
||||||
|
|
||||||
@Column(name = "\"BUY_LINK\"", length = 500)
|
|
||||||
private String buyLink;
|
|
||||||
|
|
||||||
@Column(name = "\"KEYWORDS\"", length = 500)
|
|
||||||
private String keywords;
|
|
||||||
|
|
||||||
@Column(name = "\"REVIEWS\"", length = 500)
|
|
||||||
private String reviews;
|
|
||||||
|
|
||||||
@Column(name = "\"RETAIL_PRICE\"", length = 50)
|
|
||||||
private String retailPrice;
|
|
||||||
|
|
||||||
@Column(name = "\"SALE_PRICE\"", length = 50)
|
|
||||||
private String salePrice;
|
|
||||||
|
|
||||||
@Column(name = "\"BRAND_PAGE_LINK\"", length = 500)
|
|
||||||
private String brandPageLink;
|
|
||||||
|
|
||||||
@Column(name = "\"BRAND_LOGO_IMAGE\"", length = 500)
|
|
||||||
private String brandLogoImage;
|
|
||||||
|
|
||||||
@Column(name = "\"PRODUCT_PAGE_VIEW_TRACKING\"", length = 500)
|
|
||||||
private String productPageViewTracking;
|
|
||||||
|
|
||||||
@Column(name = "\"PARENT_GROUP_ID\"", length = 200)
|
|
||||||
private String parentGroupId;
|
|
||||||
|
|
||||||
@Column(name = "\"FINELINE\"", length = 200)
|
|
||||||
private String fineline;
|
|
||||||
|
|
||||||
@Column(name = "\"SUPERFINELINE\"", length = 200)
|
|
||||||
private String superfineline;
|
|
||||||
|
|
||||||
@Column(name = "\"MODELNUMBER\"", length = 100)
|
|
||||||
private String modelnumber;
|
|
||||||
|
|
||||||
@Column(name = "\"CALIBER\"", length = 200)
|
|
||||||
private String caliber;
|
|
||||||
|
|
||||||
@Column(name = "\"MEDIUM_IMAGE_URL\"", length = 500)
|
|
||||||
private String mediumImageUrl;
|
|
||||||
|
|
||||||
@Column(name = "\"PRODUCT_CONTENT_WIDGET\"", length = 500)
|
|
||||||
private String productContentWidget;
|
|
||||||
|
|
||||||
@Column(name = "\"GOOGLE_CATEGORIZATION\"", length = 500)
|
|
||||||
private String googleCategorization;
|
|
||||||
|
|
||||||
@Column(name = "\"ITEM_BASED_COMMISSION\"", length = 500)
|
|
||||||
private String itemBasedCommission;
|
|
||||||
|
|
||||||
@Column(name = "\"ITEM_BASED_COMMISSION RATE\"", length = 50)
|
|
||||||
private String itemBasedCommissionRate;
|
|
||||||
|
|
||||||
public UUID getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(UUID id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUpc() {
|
|
||||||
return upc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpc(String upc) {
|
|
||||||
this.upc = upc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getDeletedAt() {
|
|
||||||
return deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeletedAt(Instant deletedAt) {
|
|
||||||
this.deletedAt = deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSku() {
|
|
||||||
return sku;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSku(String sku) {
|
|
||||||
this.sku = sku;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getManufacturerId() {
|
|
||||||
return manufacturerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setManufacturerId(String manufacturerId) {
|
|
||||||
this.manufacturerId = manufacturerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBrandName() {
|
|
||||||
return brandName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandName(String brandName) {
|
|
||||||
this.brandName = brandName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProductName() {
|
|
||||||
return productName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductName(String productName) {
|
|
||||||
this.productName = productName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLongDescription() {
|
|
||||||
return longDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLongDescription(String longDescription) {
|
|
||||||
this.longDescription = longDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getShortDescription() {
|
|
||||||
return shortDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setShortDescription(String shortDescription) {
|
|
||||||
this.shortDescription = shortDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDepartment() {
|
|
||||||
return department;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDepartment(String department) {
|
|
||||||
this.department = department;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCategory() {
|
|
||||||
return category;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCategory(String category) {
|
|
||||||
this.category = category;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSubcategory() {
|
|
||||||
return subcategory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSubcategory(String subcategory) {
|
|
||||||
this.subcategory = subcategory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getThumbUrl() {
|
|
||||||
return thumbUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setThumbUrl(String thumbUrl) {
|
|
||||||
this.thumbUrl = thumbUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getImageUrl() {
|
|
||||||
return imageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setImageUrl(String imageUrl) {
|
|
||||||
this.imageUrl = imageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBuyLink() {
|
|
||||||
return buyLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBuyLink(String buyLink) {
|
|
||||||
this.buyLink = buyLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getKeywords() {
|
|
||||||
return keywords;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setKeywords(String keywords) {
|
|
||||||
this.keywords = keywords;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getReviews() {
|
|
||||||
return reviews;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReviews(String reviews) {
|
|
||||||
this.reviews = reviews;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRetailPrice() {
|
|
||||||
return retailPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRetailPrice(String retailPrice) {
|
|
||||||
this.retailPrice = retailPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSalePrice() {
|
|
||||||
return salePrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSalePrice(String salePrice) {
|
|
||||||
this.salePrice = salePrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBrandPageLink() {
|
|
||||||
return brandPageLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandPageLink(String brandPageLink) {
|
|
||||||
this.brandPageLink = brandPageLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBrandLogoImage() {
|
|
||||||
return brandLogoImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandLogoImage(String brandLogoImage) {
|
|
||||||
this.brandLogoImage = brandLogoImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProductPageViewTracking() {
|
|
||||||
return productPageViewTracking;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductPageViewTracking(String productPageViewTracking) {
|
|
||||||
this.productPageViewTracking = productPageViewTracking;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getParentGroupId() {
|
|
||||||
return parentGroupId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setParentGroupId(String parentGroupId) {
|
|
||||||
this.parentGroupId = parentGroupId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFineline() {
|
|
||||||
return fineline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFineline(String fineline) {
|
|
||||||
this.fineline = fineline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSuperfineline() {
|
|
||||||
return superfineline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSuperfineline(String superfineline) {
|
|
||||||
this.superfineline = superfineline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getModelnumber() {
|
|
||||||
return modelnumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setModelnumber(String modelnumber) {
|
|
||||||
this.modelnumber = modelnumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCaliber() {
|
|
||||||
return caliber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCaliber(String caliber) {
|
|
||||||
this.caliber = caliber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMediumImageUrl() {
|
|
||||||
return mediumImageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMediumImageUrl(String mediumImageUrl) {
|
|
||||||
this.mediumImageUrl = mediumImageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProductContentWidget() {
|
|
||||||
return productContentWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductContentWidget(String productContentWidget) {
|
|
||||||
this.productContentWidget = productContentWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGoogleCategorization() {
|
|
||||||
return googleCategorization;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGoogleCategorization(String googleCategorization) {
|
|
||||||
this.googleCategorization = googleCategorization;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemBasedCommission() {
|
|
||||||
return itemBasedCommission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemBasedCommission(String itemBasedCommission) {
|
|
||||||
this.itemBasedCommission = itemBasedCommission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemBasedCommissionRate() {
|
|
||||||
return itemBasedCommissionRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemBasedCommissionRate(String itemBasedCommissionRate) {
|
|
||||||
this.itemBasedCommissionRate = itemBasedCommissionRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
143
src/main/java/group/goforward/ballistic/model/BuildItem.java
Normal file
143
src/main/java/group/goforward/ballistic/model/BuildItem.java
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
package group.goforward.ballistic.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import org.hibernate.annotations.ColumnDefault;
|
||||||
|
import org.hibernate.annotations.OnDelete;
|
||||||
|
import org.hibernate.annotations.OnDeleteAction;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "build_items")
|
||||||
|
public class BuildItem {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
@Column(name = "id", nullable = false)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ColumnDefault("gen_random_uuid()")
|
||||||
|
@Column(name = "uuid", nullable = false)
|
||||||
|
private UUID uuid;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY, optional = false)
|
||||||
|
@OnDelete(action = OnDeleteAction.CASCADE)
|
||||||
|
@JoinColumn(name = "build_id", nullable = false)
|
||||||
|
private Build build;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY, optional = false)
|
||||||
|
@OnDelete(action = OnDeleteAction.CASCADE)
|
||||||
|
@JoinColumn(name = "product_id", nullable = false)
|
||||||
|
private Product product;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Column(name = "slot", nullable = false, length = Integer.MAX_VALUE)
|
||||||
|
private String slot;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ColumnDefault("0")
|
||||||
|
@Column(name = "\"position\"", nullable = false)
|
||||||
|
private Integer position;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ColumnDefault("1")
|
||||||
|
@Column(name = "quantity", nullable = false)
|
||||||
|
private Integer quantity;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ColumnDefault("now()")
|
||||||
|
@Column(name = "created_at", nullable = false)
|
||||||
|
private OffsetDateTime createdAt;
|
||||||
|
|
||||||
|
@ColumnDefault("CURRENT_TIMESTAMP")
|
||||||
|
@Column(name = "updated_at")
|
||||||
|
private OffsetDateTime updatedAt;
|
||||||
|
|
||||||
|
@Column(name = "deleted_at")
|
||||||
|
private OffsetDateTime deletedAt;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUuid(UUID uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Build getBuild() {
|
||||||
|
return build;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBuild(Build build) {
|
||||||
|
this.build = build;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Product getProduct() {
|
||||||
|
return product;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProduct(Product product) {
|
||||||
|
this.product = product;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSlot() {
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSlot(String slot) {
|
||||||
|
this.slot = slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPosition(Integer position) {
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getQuantity() {
|
||||||
|
return quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuantity(Integer quantity) {
|
||||||
|
this.quantity = quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getCreatedAt() {
|
||||||
|
return createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedAt(OffsetDateTime createdAt) {
|
||||||
|
this.createdAt = createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getUpdatedAt() {
|
||||||
|
return updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdatedAt(OffsetDateTime updatedAt) {
|
||||||
|
this.updatedAt = updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getDeletedAt() {
|
||||||
|
return deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeletedAt(OffsetDateTime deletedAt) {
|
||||||
|
this.deletedAt = deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "categories")
|
|
||||||
public class Category {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Column(name = "name", nullable = false, length = 100)
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@Column(name = "parent_category_id")
|
|
||||||
private Integer parentCategoryId;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "updated_at", nullable = false)
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at", nullable = false)
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@Column(name = "deleted_at")
|
|
||||||
private Instant deletedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("gen_random_uuid()")
|
|
||||||
@Column(name = "uuid")
|
|
||||||
private UUID uuid;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getParentCategoryId() {
|
|
||||||
return parentCategoryId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setParentCategoryId(Integer parentCategoryId) {
|
|
||||||
this.parentCategoryId = parentCategoryId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getDeletedAt() {
|
|
||||||
return deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeletedAt(Instant deletedAt) {
|
|
||||||
this.deletedAt = deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UUID getUuid() {
|
|
||||||
return uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUuid(UUID uuid) {
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "compartment")
|
|
||||||
public class Compartment {
|
|
||||||
@Id
|
|
||||||
@ColumnDefault("gen_random_uuid()")
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private UUID id;
|
|
||||||
|
|
||||||
@Column(name = "name", nullable = false, length = 100)
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@Column(name = "description", length = 300)
|
|
||||||
private String description;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "updated_at", nullable = false)
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at", nullable = false)
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@Column(name = "deleted_at")
|
|
||||||
private Instant deletedAt;
|
|
||||||
|
|
||||||
public UUID getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(UUID id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDescription() {
|
|
||||||
return description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDescription(String description) {
|
|
||||||
this.description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getDeletedAt() {
|
|
||||||
return deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeletedAt(Instant deletedAt) {
|
|
||||||
this.deletedAt = deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "email_verification_codes")
|
|
||||||
public class EmailVerificationCode {
|
|
||||||
@Id
|
|
||||||
@ColumnDefault("nextval('email_verification_codes_id_seq')")
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Column(name = "user_id", nullable = false, length = 21)
|
|
||||||
private String userId;
|
|
||||||
|
|
||||||
@Column(name = "email", nullable = false)
|
|
||||||
private String email;
|
|
||||||
|
|
||||||
@Column(name = "code", nullable = false, length = 8)
|
|
||||||
private String code;
|
|
||||||
|
|
||||||
@Column(name = "expires_at", nullable = false)
|
|
||||||
private OffsetDateTime expiresAt;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserId() {
|
|
||||||
return userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUserId(String userId) {
|
|
||||||
this.userId = userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getEmail() {
|
|
||||||
return email;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEmail(String email) {
|
|
||||||
this.email = email;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCode() {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCode(String code) {
|
|
||||||
this.code = code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OffsetDateTime getExpiresAt() {
|
|
||||||
return expiresAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExpiresAt(OffsetDateTime expiresAt) {
|
|
||||||
this.expiresAt = expiresAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,909 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "lipseycatalog")
|
|
||||||
public class Lipseycatalog {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Column(name = "itemno", nullable = false, length = 20)
|
|
||||||
private String itemno;
|
|
||||||
|
|
||||||
@Column(name = "description1", length = Integer.MAX_VALUE)
|
|
||||||
private String description1;
|
|
||||||
|
|
||||||
@Column(name = "description2", length = Integer.MAX_VALUE)
|
|
||||||
private String description2;
|
|
||||||
|
|
||||||
@Column(name = "upc", length = 20)
|
|
||||||
private String upc;
|
|
||||||
|
|
||||||
@Column(name = "manufacturermodelno", length = 30)
|
|
||||||
private String manufacturermodelno;
|
|
||||||
|
|
||||||
@Column(name = "msrp")
|
|
||||||
private Double msrp;
|
|
||||||
|
|
||||||
@Column(name = "model", length = Integer.MAX_VALUE)
|
|
||||||
private String model;
|
|
||||||
|
|
||||||
@Column(name = "calibergauge", length = Integer.MAX_VALUE)
|
|
||||||
private String calibergauge;
|
|
||||||
|
|
||||||
@Column(name = "manufacturer", length = Integer.MAX_VALUE)
|
|
||||||
private String manufacturer;
|
|
||||||
|
|
||||||
@Column(name = "type", length = Integer.MAX_VALUE)
|
|
||||||
private String type;
|
|
||||||
|
|
||||||
@Column(name = "action", length = Integer.MAX_VALUE)
|
|
||||||
private String action;
|
|
||||||
|
|
||||||
@Column(name = "barrellength", length = Integer.MAX_VALUE)
|
|
||||||
private String barrellength;
|
|
||||||
|
|
||||||
@Column(name = "capacity", length = Integer.MAX_VALUE)
|
|
||||||
private String capacity;
|
|
||||||
|
|
||||||
@Column(name = "finish", length = Integer.MAX_VALUE)
|
|
||||||
private String finish;
|
|
||||||
|
|
||||||
@Column(name = "overalllength", length = Integer.MAX_VALUE)
|
|
||||||
private String overalllength;
|
|
||||||
|
|
||||||
@Column(name = "receiver", length = Integer.MAX_VALUE)
|
|
||||||
private String receiver;
|
|
||||||
|
|
||||||
@Column(name = "safety", length = Integer.MAX_VALUE)
|
|
||||||
private String safety;
|
|
||||||
|
|
||||||
@Column(name = "sights", length = Integer.MAX_VALUE)
|
|
||||||
private String sights;
|
|
||||||
|
|
||||||
@Column(name = "stockframegrips", length = Integer.MAX_VALUE)
|
|
||||||
private String stockframegrips;
|
|
||||||
|
|
||||||
@Column(name = "magazine", length = Integer.MAX_VALUE)
|
|
||||||
private String magazine;
|
|
||||||
|
|
||||||
@Column(name = "weight", length = Integer.MAX_VALUE)
|
|
||||||
private String weight;
|
|
||||||
|
|
||||||
@Column(name = "imagename", length = Integer.MAX_VALUE)
|
|
||||||
private String imagename;
|
|
||||||
|
|
||||||
@Column(name = "chamber", length = Integer.MAX_VALUE)
|
|
||||||
private String chamber;
|
|
||||||
|
|
||||||
@Column(name = "drilledandtapped", length = Integer.MAX_VALUE)
|
|
||||||
private String drilledandtapped;
|
|
||||||
|
|
||||||
@Column(name = "rateoftwist", length = Integer.MAX_VALUE)
|
|
||||||
private String rateoftwist;
|
|
||||||
|
|
||||||
@Column(name = "itemtype", length = Integer.MAX_VALUE)
|
|
||||||
private String itemtype;
|
|
||||||
|
|
||||||
@Column(name = "additionalfeature1", length = Integer.MAX_VALUE)
|
|
||||||
private String additionalfeature1;
|
|
||||||
|
|
||||||
@Column(name = "additionalfeature2", length = Integer.MAX_VALUE)
|
|
||||||
private String additionalfeature2;
|
|
||||||
|
|
||||||
@Column(name = "additionalfeature3", length = Integer.MAX_VALUE)
|
|
||||||
private String additionalfeature3;
|
|
||||||
|
|
||||||
@Column(name = "shippingweight", length = Integer.MAX_VALUE)
|
|
||||||
private String shippingweight;
|
|
||||||
|
|
||||||
@Column(name = "boundbookmanufacturer", length = Integer.MAX_VALUE)
|
|
||||||
private String boundbookmanufacturer;
|
|
||||||
|
|
||||||
@Column(name = "boundbookmodel", length = Integer.MAX_VALUE)
|
|
||||||
private String boundbookmodel;
|
|
||||||
|
|
||||||
@Column(name = "boundbooktype", length = Integer.MAX_VALUE)
|
|
||||||
private String boundbooktype;
|
|
||||||
|
|
||||||
@Column(name = "nfathreadpattern", length = Integer.MAX_VALUE)
|
|
||||||
private String nfathreadpattern;
|
|
||||||
|
|
||||||
@Column(name = "nfaattachmentmethod", length = Integer.MAX_VALUE)
|
|
||||||
private String nfaattachmentmethod;
|
|
||||||
|
|
||||||
@Column(name = "nfabaffletype", length = Integer.MAX_VALUE)
|
|
||||||
private String nfabaffletype;
|
|
||||||
|
|
||||||
@Column(name = "silencercanbedisassembled", length = Integer.MAX_VALUE)
|
|
||||||
private String silencercanbedisassembled;
|
|
||||||
|
|
||||||
@Column(name = "silencerconstructionmaterial", length = Integer.MAX_VALUE)
|
|
||||||
private String silencerconstructionmaterial;
|
|
||||||
|
|
||||||
@Column(name = "nfadbreduction", length = Integer.MAX_VALUE)
|
|
||||||
private String nfadbreduction;
|
|
||||||
|
|
||||||
@Column(name = "silenceroutsidediameter", length = Integer.MAX_VALUE)
|
|
||||||
private String silenceroutsidediameter;
|
|
||||||
|
|
||||||
@Column(name = "\"nfaform3Caliber\"", length = Integer.MAX_VALUE)
|
|
||||||
private String nfaform3Caliber;
|
|
||||||
|
|
||||||
@Column(name = "opticmagnification", length = Integer.MAX_VALUE)
|
|
||||||
private String opticmagnification;
|
|
||||||
|
|
||||||
@Column(name = "maintubesize", length = Integer.MAX_VALUE)
|
|
||||||
private String maintubesize;
|
|
||||||
|
|
||||||
@Column(name = "adjustableobjective", length = Integer.MAX_VALUE)
|
|
||||||
private String adjustableobjective;
|
|
||||||
|
|
||||||
@Column(name = "objectivesize", length = Integer.MAX_VALUE)
|
|
||||||
private String objectivesize;
|
|
||||||
|
|
||||||
@Column(name = "opticadjustments", length = Integer.MAX_VALUE)
|
|
||||||
private String opticadjustments;
|
|
||||||
|
|
||||||
@Column(name = "illuminatedreticle", length = Integer.MAX_VALUE)
|
|
||||||
private String illuminatedreticle;
|
|
||||||
|
|
||||||
@Column(name = "reticle", length = Integer.MAX_VALUE)
|
|
||||||
private String reticle;
|
|
||||||
|
|
||||||
@Column(name = "exclusive", length = Integer.MAX_VALUE)
|
|
||||||
private String exclusive;
|
|
||||||
|
|
||||||
@ColumnDefault("NULL")
|
|
||||||
@Column(name = "quantity", length = 10)
|
|
||||||
private String quantity;
|
|
||||||
|
|
||||||
@Column(name = "allocated", length = Integer.MAX_VALUE)
|
|
||||||
private String allocated;
|
|
||||||
|
|
||||||
@Column(name = "onsale", length = Integer.MAX_VALUE)
|
|
||||||
private String onsale;
|
|
||||||
|
|
||||||
@Column(name = "price")
|
|
||||||
private Double price;
|
|
||||||
|
|
||||||
@Column(name = "currentprice")
|
|
||||||
private Double currentprice;
|
|
||||||
|
|
||||||
@Column(name = "retailmap")
|
|
||||||
private Double retailmap;
|
|
||||||
|
|
||||||
@Column(name = "fflrequired", length = Integer.MAX_VALUE)
|
|
||||||
private String fflrequired;
|
|
||||||
|
|
||||||
@Column(name = "sotrequired", length = Integer.MAX_VALUE)
|
|
||||||
private String sotrequired;
|
|
||||||
|
|
||||||
@Column(name = "exclusivetype", length = Integer.MAX_VALUE)
|
|
||||||
private String exclusivetype;
|
|
||||||
|
|
||||||
@Column(name = "scopecoverincluded", length = Integer.MAX_VALUE)
|
|
||||||
private String scopecoverincluded;
|
|
||||||
|
|
||||||
@Column(name = "special", length = Integer.MAX_VALUE)
|
|
||||||
private String special;
|
|
||||||
|
|
||||||
@Column(name = "sightstype", length = Integer.MAX_VALUE)
|
|
||||||
private String sightstype;
|
|
||||||
|
|
||||||
@Column(name = "\"case\"", length = Integer.MAX_VALUE)
|
|
||||||
private String caseField;
|
|
||||||
|
|
||||||
@Column(name = "choke", length = Integer.MAX_VALUE)
|
|
||||||
private String choke;
|
|
||||||
|
|
||||||
@Column(name = "dbreduction", length = Integer.MAX_VALUE)
|
|
||||||
private String dbreduction;
|
|
||||||
|
|
||||||
@Column(name = "family", length = Integer.MAX_VALUE)
|
|
||||||
private String family;
|
|
||||||
|
|
||||||
@Column(name = "finishtype", length = Integer.MAX_VALUE)
|
|
||||||
private String finishtype;
|
|
||||||
|
|
||||||
@Column(name = "frame", length = Integer.MAX_VALUE)
|
|
||||||
private String frame;
|
|
||||||
|
|
||||||
@Column(name = "griptype", length = 30)
|
|
||||||
private String griptype;
|
|
||||||
|
|
||||||
@Column(name = "handgunslidematerial", length = Integer.MAX_VALUE)
|
|
||||||
private String handgunslidematerial;
|
|
||||||
|
|
||||||
@Column(name = "countryoforigin", length = 4)
|
|
||||||
private String countryoforigin;
|
|
||||||
|
|
||||||
@Column(name = "itemlength", length = Integer.MAX_VALUE)
|
|
||||||
private String itemlength;
|
|
||||||
|
|
||||||
@Column(name = "itemwidth", length = Integer.MAX_VALUE)
|
|
||||||
private String itemwidth;
|
|
||||||
|
|
||||||
@Column(name = "itemheight", length = Integer.MAX_VALUE)
|
|
||||||
private String itemheight;
|
|
||||||
|
|
||||||
@Column(name = "packagelength")
|
|
||||||
private Double packagelength;
|
|
||||||
|
|
||||||
@Column(name = "packagewidth")
|
|
||||||
private Double packagewidth;
|
|
||||||
|
|
||||||
@Column(name = "packageheight")
|
|
||||||
private Double packageheight;
|
|
||||||
|
|
||||||
@Column(name = "itemgroup", length = 40)
|
|
||||||
private String itemgroup;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "updated_at", nullable = false)
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at", nullable = false)
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@Column(name = "deleted_at")
|
|
||||||
private Instant deletedAt;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemno() {
|
|
||||||
return itemno;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemno(String itemno) {
|
|
||||||
this.itemno = itemno;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDescription1() {
|
|
||||||
return description1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDescription1(String description1) {
|
|
||||||
this.description1 = description1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDescription2() {
|
|
||||||
return description2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDescription2(String description2) {
|
|
||||||
this.description2 = description2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUpc() {
|
|
||||||
return upc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpc(String upc) {
|
|
||||||
this.upc = upc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getManufacturermodelno() {
|
|
||||||
return manufacturermodelno;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setManufacturermodelno(String manufacturermodelno) {
|
|
||||||
this.manufacturermodelno = manufacturermodelno;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getMsrp() {
|
|
||||||
return msrp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMsrp(Double msrp) {
|
|
||||||
this.msrp = msrp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getModel() {
|
|
||||||
return model;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setModel(String model) {
|
|
||||||
this.model = model;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCalibergauge() {
|
|
||||||
return calibergauge;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCalibergauge(String calibergauge) {
|
|
||||||
this.calibergauge = calibergauge;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getManufacturer() {
|
|
||||||
return manufacturer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setManufacturer(String manufacturer) {
|
|
||||||
this.manufacturer = manufacturer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setType(String type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAction() {
|
|
||||||
return action;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAction(String action) {
|
|
||||||
this.action = action;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBarrellength() {
|
|
||||||
return barrellength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBarrellength(String barrellength) {
|
|
||||||
this.barrellength = barrellength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCapacity() {
|
|
||||||
return capacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCapacity(String capacity) {
|
|
||||||
this.capacity = capacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFinish() {
|
|
||||||
return finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFinish(String finish) {
|
|
||||||
this.finish = finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOveralllength() {
|
|
||||||
return overalllength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOveralllength(String overalllength) {
|
|
||||||
this.overalllength = overalllength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getReceiver() {
|
|
||||||
return receiver;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReceiver(String receiver) {
|
|
||||||
this.receiver = receiver;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSafety() {
|
|
||||||
return safety;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSafety(String safety) {
|
|
||||||
this.safety = safety;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSights() {
|
|
||||||
return sights;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSights(String sights) {
|
|
||||||
this.sights = sights;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStockframegrips() {
|
|
||||||
return stockframegrips;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStockframegrips(String stockframegrips) {
|
|
||||||
this.stockframegrips = stockframegrips;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMagazine() {
|
|
||||||
return magazine;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMagazine(String magazine) {
|
|
||||||
this.magazine = magazine;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getWeight() {
|
|
||||||
return weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setWeight(String weight) {
|
|
||||||
this.weight = weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getImagename() {
|
|
||||||
return imagename;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setImagename(String imagename) {
|
|
||||||
this.imagename = imagename;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getChamber() {
|
|
||||||
return chamber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setChamber(String chamber) {
|
|
||||||
this.chamber = chamber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDrilledandtapped() {
|
|
||||||
return drilledandtapped;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDrilledandtapped(String drilledandtapped) {
|
|
||||||
this.drilledandtapped = drilledandtapped;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRateoftwist() {
|
|
||||||
return rateoftwist;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRateoftwist(String rateoftwist) {
|
|
||||||
this.rateoftwist = rateoftwist;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemtype() {
|
|
||||||
return itemtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemtype(String itemtype) {
|
|
||||||
this.itemtype = itemtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAdditionalfeature1() {
|
|
||||||
return additionalfeature1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAdditionalfeature1(String additionalfeature1) {
|
|
||||||
this.additionalfeature1 = additionalfeature1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAdditionalfeature2() {
|
|
||||||
return additionalfeature2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAdditionalfeature2(String additionalfeature2) {
|
|
||||||
this.additionalfeature2 = additionalfeature2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAdditionalfeature3() {
|
|
||||||
return additionalfeature3;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAdditionalfeature3(String additionalfeature3) {
|
|
||||||
this.additionalfeature3 = additionalfeature3;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getShippingweight() {
|
|
||||||
return shippingweight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setShippingweight(String shippingweight) {
|
|
||||||
this.shippingweight = shippingweight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBoundbookmanufacturer() {
|
|
||||||
return boundbookmanufacturer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBoundbookmanufacturer(String boundbookmanufacturer) {
|
|
||||||
this.boundbookmanufacturer = boundbookmanufacturer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBoundbookmodel() {
|
|
||||||
return boundbookmodel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBoundbookmodel(String boundbookmodel) {
|
|
||||||
this.boundbookmodel = boundbookmodel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBoundbooktype() {
|
|
||||||
return boundbooktype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBoundbooktype(String boundbooktype) {
|
|
||||||
this.boundbooktype = boundbooktype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNfathreadpattern() {
|
|
||||||
return nfathreadpattern;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNfathreadpattern(String nfathreadpattern) {
|
|
||||||
this.nfathreadpattern = nfathreadpattern;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNfaattachmentmethod() {
|
|
||||||
return nfaattachmentmethod;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNfaattachmentmethod(String nfaattachmentmethod) {
|
|
||||||
this.nfaattachmentmethod = nfaattachmentmethod;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNfabaffletype() {
|
|
||||||
return nfabaffletype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNfabaffletype(String nfabaffletype) {
|
|
||||||
this.nfabaffletype = nfabaffletype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSilencercanbedisassembled() {
|
|
||||||
return silencercanbedisassembled;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSilencercanbedisassembled(String silencercanbedisassembled) {
|
|
||||||
this.silencercanbedisassembled = silencercanbedisassembled;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSilencerconstructionmaterial() {
|
|
||||||
return silencerconstructionmaterial;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSilencerconstructionmaterial(String silencerconstructionmaterial) {
|
|
||||||
this.silencerconstructionmaterial = silencerconstructionmaterial;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNfadbreduction() {
|
|
||||||
return nfadbreduction;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNfadbreduction(String nfadbreduction) {
|
|
||||||
this.nfadbreduction = nfadbreduction;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSilenceroutsidediameter() {
|
|
||||||
return silenceroutsidediameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSilenceroutsidediameter(String silenceroutsidediameter) {
|
|
||||||
this.silenceroutsidediameter = silenceroutsidediameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNfaform3Caliber() {
|
|
||||||
return nfaform3Caliber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNfaform3Caliber(String nfaform3Caliber) {
|
|
||||||
this.nfaform3Caliber = nfaform3Caliber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOpticmagnification() {
|
|
||||||
return opticmagnification;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOpticmagnification(String opticmagnification) {
|
|
||||||
this.opticmagnification = opticmagnification;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMaintubesize() {
|
|
||||||
return maintubesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMaintubesize(String maintubesize) {
|
|
||||||
this.maintubesize = maintubesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAdjustableobjective() {
|
|
||||||
return adjustableobjective;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAdjustableobjective(String adjustableobjective) {
|
|
||||||
this.adjustableobjective = adjustableobjective;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getObjectivesize() {
|
|
||||||
return objectivesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setObjectivesize(String objectivesize) {
|
|
||||||
this.objectivesize = objectivesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOpticadjustments() {
|
|
||||||
return opticadjustments;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOpticadjustments(String opticadjustments) {
|
|
||||||
this.opticadjustments = opticadjustments;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getIlluminatedreticle() {
|
|
||||||
return illuminatedreticle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIlluminatedreticle(String illuminatedreticle) {
|
|
||||||
this.illuminatedreticle = illuminatedreticle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getReticle() {
|
|
||||||
return reticle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReticle(String reticle) {
|
|
||||||
this.reticle = reticle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getExclusive() {
|
|
||||||
return exclusive;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExclusive(String exclusive) {
|
|
||||||
this.exclusive = exclusive;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getQuantity() {
|
|
||||||
return quantity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setQuantity(String quantity) {
|
|
||||||
this.quantity = quantity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAllocated() {
|
|
||||||
return allocated;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAllocated(String allocated) {
|
|
||||||
this.allocated = allocated;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOnsale() {
|
|
||||||
return onsale;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOnsale(String onsale) {
|
|
||||||
this.onsale = onsale;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getPrice() {
|
|
||||||
return price;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPrice(Double price) {
|
|
||||||
this.price = price;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getCurrentprice() {
|
|
||||||
return currentprice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCurrentprice(Double currentprice) {
|
|
||||||
this.currentprice = currentprice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getRetailmap() {
|
|
||||||
return retailmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRetailmap(Double retailmap) {
|
|
||||||
this.retailmap = retailmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFflrequired() {
|
|
||||||
return fflrequired;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFflrequired(String fflrequired) {
|
|
||||||
this.fflrequired = fflrequired;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSotrequired() {
|
|
||||||
return sotrequired;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSotrequired(String sotrequired) {
|
|
||||||
this.sotrequired = sotrequired;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getExclusivetype() {
|
|
||||||
return exclusivetype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExclusivetype(String exclusivetype) {
|
|
||||||
this.exclusivetype = exclusivetype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getScopecoverincluded() {
|
|
||||||
return scopecoverincluded;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setScopecoverincluded(String scopecoverincluded) {
|
|
||||||
this.scopecoverincluded = scopecoverincluded;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSpecial() {
|
|
||||||
return special;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSpecial(String special) {
|
|
||||||
this.special = special;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSightstype() {
|
|
||||||
return sightstype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSightstype(String sightstype) {
|
|
||||||
this.sightstype = sightstype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCaseField() {
|
|
||||||
return caseField;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCaseField(String caseField) {
|
|
||||||
this.caseField = caseField;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getChoke() {
|
|
||||||
return choke;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setChoke(String choke) {
|
|
||||||
this.choke = choke;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDbreduction() {
|
|
||||||
return dbreduction;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDbreduction(String dbreduction) {
|
|
||||||
this.dbreduction = dbreduction;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFamily() {
|
|
||||||
return family;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFamily(String family) {
|
|
||||||
this.family = family;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFinishtype() {
|
|
||||||
return finishtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFinishtype(String finishtype) {
|
|
||||||
this.finishtype = finishtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFrame() {
|
|
||||||
return frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFrame(String frame) {
|
|
||||||
this.frame = frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGriptype() {
|
|
||||||
return griptype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGriptype(String griptype) {
|
|
||||||
this.griptype = griptype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getHandgunslidematerial() {
|
|
||||||
return handgunslidematerial;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHandgunslidematerial(String handgunslidematerial) {
|
|
||||||
this.handgunslidematerial = handgunslidematerial;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCountryoforigin() {
|
|
||||||
return countryoforigin;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCountryoforigin(String countryoforigin) {
|
|
||||||
this.countryoforigin = countryoforigin;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemlength() {
|
|
||||||
return itemlength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemlength(String itemlength) {
|
|
||||||
this.itemlength = itemlength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemwidth() {
|
|
||||||
return itemwidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemwidth(String itemwidth) {
|
|
||||||
this.itemwidth = itemwidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemheight() {
|
|
||||||
return itemheight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemheight(String itemheight) {
|
|
||||||
this.itemheight = itemheight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getPackagelength() {
|
|
||||||
return packagelength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPackagelength(Double packagelength) {
|
|
||||||
this.packagelength = packagelength;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getPackagewidth() {
|
|
||||||
return packagewidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPackagewidth(Double packagewidth) {
|
|
||||||
this.packagewidth = packagewidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getPackageheight() {
|
|
||||||
return packageheight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPackageheight(Double packageheight) {
|
|
||||||
this.packageheight = packageheight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemgroup() {
|
|
||||||
return itemgroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemgroup(String itemgroup) {
|
|
||||||
this.itemgroup = itemgroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getDeletedAt() {
|
|
||||||
return deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeletedAt(Instant deletedAt) {
|
|
||||||
this.deletedAt = deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "manufacturer")
|
|
||||||
public class Manufacturer {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Column(name = "name", nullable = false, length = 100)
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "updated_at", nullable = false)
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at", nullable = false)
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@Column(name = "deleted_at")
|
|
||||||
private Instant deletedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("gen_random_uuid()")
|
|
||||||
@Column(name = "uuid")
|
|
||||||
private UUID uuid;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getDeletedAt() {
|
|
||||||
return deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeletedAt(Instant deletedAt) {
|
|
||||||
this.deletedAt = deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UUID getUuid() {
|
|
||||||
return uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUuid(UUID uuid) {
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
package group.goforward.ballistic.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import jakarta.validation.constraints.Size;
|
||||||
|
import org.hibernate.annotations.ColumnDefault;
|
||||||
|
import org.hibernate.annotations.OnDelete;
|
||||||
|
import org.hibernate.annotations.OnDeleteAction;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "merchant_category_map")
|
||||||
|
public class MerchantCategoryMap {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
@Column(name = "id", nullable = false)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY, optional = false)
|
||||||
|
@OnDelete(action = OnDeleteAction.CASCADE)
|
||||||
|
@JoinColumn(name = "merchant_id", nullable = false)
|
||||||
|
private Merchant merchant;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Column(name = "raw_category", nullable = false, length = Integer.MAX_VALUE)
|
||||||
|
private String rawCategory;
|
||||||
|
|
||||||
|
@Column(name = "canonical_part_role", length = Integer.MAX_VALUE)
|
||||||
|
private String canonicalPartRole;
|
||||||
|
|
||||||
|
@Column(name = "confidence", precision = 5, scale = 2)
|
||||||
|
private BigDecimal confidence;
|
||||||
|
|
||||||
|
@Column(name = "notes", length = Integer.MAX_VALUE)
|
||||||
|
private String notes;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ColumnDefault("now()")
|
||||||
|
@Column(name = "created_at", nullable = false)
|
||||||
|
private OffsetDateTime createdAt;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ColumnDefault("now()")
|
||||||
|
@Column(name = "updated_at", nullable = false)
|
||||||
|
private OffsetDateTime updatedAt;
|
||||||
|
|
||||||
|
@Size(max = 255)
|
||||||
|
@Column(name = "canonical_category")
|
||||||
|
private String canonicalCategory;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@ColumnDefault("true")
|
||||||
|
@Column(name = "enabled", nullable = false)
|
||||||
|
private Boolean enabled = false;
|
||||||
|
|
||||||
|
@Size(max = 100)
|
||||||
|
@Column(name = "platform", length = 100)
|
||||||
|
private String platform;
|
||||||
|
|
||||||
|
@Size(max = 100)
|
||||||
|
@Column(name = "part_role", length = 100)
|
||||||
|
private String partRole;
|
||||||
|
|
||||||
|
@Column(name = "deleted_at")
|
||||||
|
private OffsetDateTime deletedAt;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Merchant getMerchant() {
|
||||||
|
return merchant;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMerchant(Merchant merchant) {
|
||||||
|
this.merchant = merchant;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRawCategory() {
|
||||||
|
return rawCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRawCategory(String rawCategory) {
|
||||||
|
this.rawCategory = rawCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCanonicalPartRole() {
|
||||||
|
return canonicalPartRole;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCanonicalPartRole(String canonicalPartRole) {
|
||||||
|
this.canonicalPartRole = canonicalPartRole;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getConfidence() {
|
||||||
|
return confidence;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfidence(BigDecimal confidence) {
|
||||||
|
this.confidence = confidence;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNotes() {
|
||||||
|
return notes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNotes(String notes) {
|
||||||
|
this.notes = notes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getCreatedAt() {
|
||||||
|
return createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedAt(OffsetDateTime createdAt) {
|
||||||
|
this.createdAt = createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getUpdatedAt() {
|
||||||
|
return updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdatedAt(OffsetDateTime updatedAt) {
|
||||||
|
this.updatedAt = updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCanonicalCategory() {
|
||||||
|
return canonicalCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCanonicalCategory(String canonicalCategory) {
|
||||||
|
this.canonicalCategory = canonicalCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnabled(Boolean enabled) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPlatform() {
|
||||||
|
return platform;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlatform(String platform) {
|
||||||
|
this.platform = platform;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPartRole() {
|
||||||
|
return partRole;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPartRole(String partRole) {
|
||||||
|
this.partRole = partRole;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getDeletedAt() {
|
||||||
|
return deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeletedAt(OffsetDateTime deletedAt) {
|
||||||
|
this.deletedAt = deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,105 +1,105 @@
|
|||||||
package group.goforward.ballistic.model;
|
package group.goforward.ballistic.model;
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.ProductConfiguration;
|
import group.goforward.ballistic.model.ProductConfiguration;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(
|
@Table(
|
||||||
name = "merchant_category_mappings",
|
name = "merchant_category_mappings",
|
||||||
uniqueConstraints = @UniqueConstraint(
|
uniqueConstraints = @UniqueConstraint(
|
||||||
name = "uq_merchant_category",
|
name = "uq_merchant_category",
|
||||||
columnNames = { "merchant_id", "raw_category" }
|
columnNames = { "merchant_id", "raw_category" }
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
public class MerchantCategoryMapping {
|
public class MerchantCategoryMapping {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY) // SERIAL
|
@GeneratedValue(strategy = GenerationType.IDENTITY) // SERIAL
|
||||||
@Column(name = "id", nullable = false)
|
@Column(name = "id", nullable = false)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY, optional = false)
|
@ManyToOne(fetch = FetchType.LAZY, optional = false)
|
||||||
@JoinColumn(name = "merchant_id", nullable = false)
|
@JoinColumn(name = "merchant_id", nullable = false)
|
||||||
private Merchant merchant;
|
private Merchant merchant;
|
||||||
|
|
||||||
@Column(name = "raw_category", nullable = false, length = 512)
|
@Column(name = "raw_category", nullable = false, length = 512)
|
||||||
private String rawCategory;
|
private String rawCategory;
|
||||||
|
|
||||||
@Column(name = "mapped_part_role", length = 128)
|
@Column(name = "mapped_part_role", length = 128)
|
||||||
private String mappedPartRole; // e.g. "upper-receiver", "barrel"
|
private String mappedPartRole; // e.g. "upper-receiver", "barrel"
|
||||||
|
|
||||||
@Column(name = "mapped_configuration")
|
@Column(name = "mapped_configuration")
|
||||||
@Enumerated(EnumType.STRING)
|
@Enumerated(EnumType.STRING)
|
||||||
private ProductConfiguration mappedConfiguration;
|
private ProductConfiguration mappedConfiguration;
|
||||||
|
|
||||||
@Column(name = "created_at", nullable = false)
|
@Column(name = "created_at", nullable = false)
|
||||||
private OffsetDateTime createdAt = OffsetDateTime.now();
|
private OffsetDateTime createdAt = OffsetDateTime.now();
|
||||||
|
|
||||||
@Column(name = "updated_at", nullable = false)
|
@Column(name = "updated_at", nullable = false)
|
||||||
private OffsetDateTime updatedAt = OffsetDateTime.now();
|
private OffsetDateTime updatedAt = OffsetDateTime.now();
|
||||||
|
|
||||||
@PreUpdate
|
@PreUpdate
|
||||||
public void onUpdate() {
|
public void onUpdate() {
|
||||||
this.updatedAt = OffsetDateTime.now();
|
this.updatedAt = OffsetDateTime.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
// getters & setters
|
// getters & setters
|
||||||
|
|
||||||
public Integer getId() {
|
public Integer getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(Integer id) {
|
public void setId(Integer id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Merchant getMerchant() {
|
public Merchant getMerchant() {
|
||||||
return merchant;
|
return merchant;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMerchant(Merchant merchant) {
|
public void setMerchant(Merchant merchant) {
|
||||||
this.merchant = merchant;
|
this.merchant = merchant;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRawCategory() {
|
public String getRawCategory() {
|
||||||
return rawCategory;
|
return rawCategory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRawCategory(String rawCategory) {
|
public void setRawCategory(String rawCategory) {
|
||||||
this.rawCategory = rawCategory;
|
this.rawCategory = rawCategory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMappedPartRole() {
|
public String getMappedPartRole() {
|
||||||
return mappedPartRole;
|
return mappedPartRole;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMappedPartRole(String mappedPartRole) {
|
public void setMappedPartRole(String mappedPartRole) {
|
||||||
this.mappedPartRole = mappedPartRole;
|
this.mappedPartRole = mappedPartRole;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProductConfiguration getMappedConfiguration() {
|
public ProductConfiguration getMappedConfiguration() {
|
||||||
return mappedConfiguration;
|
return mappedConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMappedConfiguration(ProductConfiguration mappedConfiguration) {
|
public void setMappedConfiguration(ProductConfiguration mappedConfiguration) {
|
||||||
this.mappedConfiguration = mappedConfiguration;
|
this.mappedConfiguration = mappedConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OffsetDateTime getCreatedAt() {
|
public OffsetDateTime getCreatedAt() {
|
||||||
return createdAt;
|
return createdAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCreatedAt(OffsetDateTime createdAt) {
|
public void setCreatedAt(OffsetDateTime createdAt) {
|
||||||
this.createdAt = createdAt;
|
this.createdAt = createdAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OffsetDateTime getUpdatedAt() {
|
public OffsetDateTime getUpdatedAt() {
|
||||||
return updatedAt;
|
return updatedAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUpdatedAt(OffsetDateTime updatedAt) {
|
public void setUpdatedAt(OffsetDateTime updatedAt) {
|
||||||
this.updatedAt = updatedAt;
|
this.updatedAt = updatedAt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "password_reset_tokens")
|
|
||||||
public class PasswordResetToken {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false, length = 40)
|
|
||||||
private String id;
|
|
||||||
|
|
||||||
@Column(name = "user_id", nullable = false, length = 21)
|
|
||||||
private String userId;
|
|
||||||
|
|
||||||
@Column(name = "expires_at", nullable = false)
|
|
||||||
private OffsetDateTime expiresAt;
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserId() {
|
|
||||||
return userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUserId(String userId) {
|
|
||||||
this.userId = userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OffsetDateTime getExpiresAt() {
|
|
||||||
return expiresAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExpiresAt(OffsetDateTime expiresAt) {
|
|
||||||
this.expiresAt = expiresAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
84
src/main/java/group/goforward/ballistic/model/Platform.java
Normal file
84
src/main/java/group/goforward/ballistic/model/Platform.java
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package group.goforward.ballistic.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import org.hibernate.annotations.ColumnDefault;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "platforms")
|
||||||
|
public class Platform {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
@Column(name = "id", nullable = false)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Column(name = "key", nullable = false, length = Integer.MAX_VALUE)
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Column(name = "label", nullable = false, length = Integer.MAX_VALUE)
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
@ColumnDefault("CURRENT_TIMESTAMP")
|
||||||
|
@Column(name = "created_at")
|
||||||
|
private OffsetDateTime createdAt;
|
||||||
|
|
||||||
|
@ColumnDefault("CURRENT_TIMESTAMP")
|
||||||
|
@Column(name = "updated_at")
|
||||||
|
private OffsetDateTime updatedAt;
|
||||||
|
|
||||||
|
@Column(name = "deleted_at")
|
||||||
|
private OffsetDateTime deletedAt;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKey(String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLabel(String label) {
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getCreatedAt() {
|
||||||
|
return createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedAt(OffsetDateTime createdAt) {
|
||||||
|
this.createdAt = createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getUpdatedAt() {
|
||||||
|
return updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdatedAt(OffsetDateTime updatedAt) {
|
||||||
|
this.updatedAt = updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getDeletedAt() {
|
||||||
|
return deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeletedAt(OffsetDateTime deletedAt) {
|
||||||
|
this.deletedAt = deletedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "posts")
|
|
||||||
public class Post {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false, length = 15)
|
|
||||||
private String id;
|
|
||||||
|
|
||||||
@Column(name = "user_id", nullable = false)
|
|
||||||
private String userId;
|
|
||||||
|
|
||||||
@Column(name = "title", nullable = false)
|
|
||||||
private String title;
|
|
||||||
|
|
||||||
@Column(name = "excerpt", nullable = false)
|
|
||||||
private String excerpt;
|
|
||||||
|
|
||||||
@Column(name = "content", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String content;
|
|
||||||
|
|
||||||
@ColumnDefault("'draft'")
|
|
||||||
@Column(name = "status", nullable = false, length = 10)
|
|
||||||
private String status;
|
|
||||||
|
|
||||||
@Column(name = "tags")
|
|
||||||
private String tags;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at", nullable = false)
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@Column(name = "updated_at")
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserId() {
|
|
||||||
return userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUserId(String userId) {
|
|
||||||
this.userId = userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTitle() {
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTitle(String title) {
|
|
||||||
this.title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getExcerpt() {
|
|
||||||
return excerpt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExcerpt(String excerpt) {
|
|
||||||
this.excerpt = excerpt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContent() {
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setContent(String content) {
|
|
||||||
this.content = content;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStatus(String status) {
|
|
||||||
this.status = status;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTags() {
|
|
||||||
return tags;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTags(String tags) {
|
|
||||||
this.tags = tags;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -14,6 +14,25 @@ import group.goforward.ballistic.model.ProductConfiguration;
|
|||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "products")
|
@Table(name = "products")
|
||||||
|
@NamedQuery(name="Products.findByPlatformWithBrand", query= "" +
|
||||||
|
"SELECT p FROM Product p" +
|
||||||
|
" JOIN FETCH p.brand b" +
|
||||||
|
" WHERE p.platform = :platform" +
|
||||||
|
" AND p.deletedAt IS NULL")
|
||||||
|
|
||||||
|
@NamedQuery(name="Product.findByPlatformAndPartRoleInWithBrand", query= "" +
|
||||||
|
"SELECT p FROM Product p JOIN FETCH p.brand b" +
|
||||||
|
" WHERE p.platform = :platform" +
|
||||||
|
" AND p.partRole IN :roles" +
|
||||||
|
" AND p.deletedAt IS NULL")
|
||||||
|
|
||||||
|
@NamedQuery(name="Product.findProductsbyBrandByOffers", query="" +
|
||||||
|
" SELECT DISTINCT p FROM Product p" +
|
||||||
|
" LEFT JOIN FETCH p.brand b" +
|
||||||
|
" LEFT JOIN FETCH p.offers o" +
|
||||||
|
" WHERE p.platform = :platform" +
|
||||||
|
" AND p.deletedAt IS NULL")
|
||||||
|
|
||||||
public class Product {
|
public class Product {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
|
|||||||
@@ -1,93 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "product_categories")
|
|
||||||
public class ProductCategory {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Column(name = "name", nullable = false, length = 100)
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "parent_category_id")
|
|
||||||
private ProductCategory parentCategory;
|
|
||||||
|
|
||||||
@Column(name = "type", length = 50)
|
|
||||||
private String type;
|
|
||||||
|
|
||||||
@Column(name = "sort_order")
|
|
||||||
private Integer sortOrder;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at")
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "updated_at")
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProductCategory getParentCategory() {
|
|
||||||
return parentCategory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setParentCategory(ProductCategory parentCategory) {
|
|
||||||
this.parentCategory = parentCategory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setType(String type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getSortOrder() {
|
|
||||||
return sortOrder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSortOrder(Integer sortOrder) {
|
|
||||||
this.sortOrder = sortOrder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package group.goforward.ballistic.model;
|
package group.goforward.ballistic.model;
|
||||||
|
|
||||||
public enum ProductConfiguration {
|
public enum ProductConfiguration {
|
||||||
STRIPPED, // bare receiver / component
|
STRIPPED, // bare receiver / component
|
||||||
ASSEMBLED, // built up but not fully complete
|
ASSEMBLED, // built up but not fully complete
|
||||||
BARRELED, // upper + barrel + gas system, no BCG/CH
|
BARRELED, // upper + barrel + gas system, no BCG/CH
|
||||||
COMPLETE, // full assembly ready to run
|
COMPLETE, // full assembly ready to run
|
||||||
KIT, // collection of parts (LPK, trigger kits, etc.)
|
KIT, // collection of parts (LPK, trigger kits, etc.)
|
||||||
OTHER // fallback / unknown
|
OTHER // fallback / unknown
|
||||||
}
|
}
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "product_feeds")
|
|
||||||
public class ProductFeed {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Column(name = "reseller_id", nullable = false)
|
|
||||||
private Integer resellerId;
|
|
||||||
|
|
||||||
@Column(name = "feed_url", nullable = false)
|
|
||||||
private String feedUrl;
|
|
||||||
|
|
||||||
@Column(name = "last_update")
|
|
||||||
private Instant lastUpdate;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "updated_at", nullable = false)
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("now()")
|
|
||||||
@Column(name = "created_at", nullable = false)
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@Column(name = "deleted_at")
|
|
||||||
private Instant deletedAt;
|
|
||||||
|
|
||||||
@ColumnDefault("gen_random_uuid()")
|
|
||||||
@Column(name = "uuid")
|
|
||||||
private UUID uuid;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getResellerId() {
|
|
||||||
return resellerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setResellerId(Integer resellerId) {
|
|
||||||
this.resellerId = resellerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFeedUrl() {
|
|
||||||
return feedUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFeedUrl(String feedUrl) {
|
|
||||||
this.feedUrl = feedUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getLastUpdate() {
|
|
||||||
return lastUpdate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastUpdate(Instant lastUpdate) {
|
|
||||||
this.lastUpdate = lastUpdate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getDeletedAt() {
|
|
||||||
return deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeletedAt(Instant deletedAt) {
|
|
||||||
this.deletedAt = deletedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UUID getUuid() {
|
|
||||||
return uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUuid(UUID uuid) {
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,357 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "psa")
|
|
||||||
public class Psa {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Column(name = "\"SKU\"", length = 50)
|
|
||||||
private String sku;
|
|
||||||
|
|
||||||
@Column(name = "\"MANUFACTURER_ID\"", length = 50)
|
|
||||||
private String manufacturerId;
|
|
||||||
|
|
||||||
@Column(name = "\"BRAND_NAME\"", length = 50)
|
|
||||||
private String brandName;
|
|
||||||
|
|
||||||
@Column(name = "\"PRODUCT_NAME\"")
|
|
||||||
private String productName;
|
|
||||||
|
|
||||||
@Column(name = "\"LONG_DESCRIPTION\"", length = Integer.MAX_VALUE)
|
|
||||||
private String longDescription;
|
|
||||||
|
|
||||||
@Column(name = "\"SHORT_DESCRIPTION\"", length = 50)
|
|
||||||
private String shortDescription;
|
|
||||||
|
|
||||||
@Column(name = "\"DEPARTMENT\"", length = 50)
|
|
||||||
private String department;
|
|
||||||
|
|
||||||
@Column(name = "\"CATEGORY\"", length = 50)
|
|
||||||
private String category;
|
|
||||||
|
|
||||||
@Column(name = "\"SUBCATEGORY\"", length = 50)
|
|
||||||
private String subcategory;
|
|
||||||
|
|
||||||
@Column(name = "\"THUMB_URL\"", length = 50)
|
|
||||||
private String thumbUrl;
|
|
||||||
|
|
||||||
@Column(name = "\"IMAGE_URL\"", length = 50)
|
|
||||||
private String imageUrl;
|
|
||||||
|
|
||||||
@Column(name = "\"BUY_LINK\"", length = 128)
|
|
||||||
private String buyLink;
|
|
||||||
|
|
||||||
@Column(name = "\"KEYWORDS\"", length = 50)
|
|
||||||
private String keywords;
|
|
||||||
|
|
||||||
@Column(name = "\"REVIEWS\"", length = 50)
|
|
||||||
private String reviews;
|
|
||||||
|
|
||||||
@Column(name = "\"RETAIL_PRICE\"")
|
|
||||||
private Float retailPrice;
|
|
||||||
|
|
||||||
@Column(name = "\"SALE_PRICE\"")
|
|
||||||
private Float salePrice;
|
|
||||||
|
|
||||||
@Column(name = "\"BRAND_PAGE_LINK\"", length = 50)
|
|
||||||
private String brandPageLink;
|
|
||||||
|
|
||||||
/* @Column(name = "\"BRAND_LOGO_IMAGE\"", length = 50)
|
|
||||||
private String brandLogoImage;*/
|
|
||||||
|
|
||||||
@Column(name = "\"PRODUCT_PAGE_VIEW_TRACKING\"", length = 256)
|
|
||||||
private String productPageViewTracking;
|
|
||||||
|
|
||||||
@Column(name = "\"PARENT_GROUP_ID\"", length = 50)
|
|
||||||
private String parentGroupId;
|
|
||||||
|
|
||||||
@Column(name = "\"FINELINE\"", length = 50)
|
|
||||||
private String fineline;
|
|
||||||
|
|
||||||
@Column(name = "\"SUPERFINELINE\"", length = 200)
|
|
||||||
private String superfineline;
|
|
||||||
|
|
||||||
@Column(name = "\"MODELNUMBER\"", length = 50)
|
|
||||||
private String modelnumber;
|
|
||||||
|
|
||||||
@Column(name = "\"CALIBER\"", length = 200)
|
|
||||||
private String caliber;
|
|
||||||
|
|
||||||
@Column(name = "\"UPC\"", length = 100)
|
|
||||||
private String upc;
|
|
||||||
|
|
||||||
@Column(name = "\"MEDIUM_IMAGE_URL\"", length = 50)
|
|
||||||
private String mediumImageUrl;
|
|
||||||
|
|
||||||
@Column(name = "\"PRODUCT_CONTENT_WIDGET\"", length = 256)
|
|
||||||
private String productContentWidget;
|
|
||||||
|
|
||||||
@Column(name = "\"GOOGLE_CATEGORIZATION\"", length = 50)
|
|
||||||
private String googleCategorization;
|
|
||||||
|
|
||||||
@Column(name = "\"ITEM_BASED_COMMISSION\"", length = 50)
|
|
||||||
private String itemBasedCommission;
|
|
||||||
|
|
||||||
@ColumnDefault("gen_random_uuid()")
|
|
||||||
@Column(name = "uuid")
|
|
||||||
private String uuid;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSku() {
|
|
||||||
return sku;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSku(String sku) {
|
|
||||||
this.sku = sku;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getManufacturerId() {
|
|
||||||
return manufacturerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setManufacturerId(String manufacturerId) {
|
|
||||||
this.manufacturerId = manufacturerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBrandName() {
|
|
||||||
return brandName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandName(String brandName) {
|
|
||||||
this.brandName = brandName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProductName() {
|
|
||||||
return productName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductName(String productName) {
|
|
||||||
this.productName = productName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLongDescription() {
|
|
||||||
return longDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLongDescription(String longDescription) {
|
|
||||||
this.longDescription = longDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getShortDescription() {
|
|
||||||
return shortDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setShortDescription(String shortDescription) {
|
|
||||||
this.shortDescription = shortDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDepartment() {
|
|
||||||
return department;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDepartment(String department) {
|
|
||||||
this.department = department;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCategory() {
|
|
||||||
return category;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCategory(String category) {
|
|
||||||
this.category = category;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSubcategory() {
|
|
||||||
return subcategory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSubcategory(String subcategory) {
|
|
||||||
this.subcategory = subcategory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getThumbUrl() {
|
|
||||||
return thumbUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setThumbUrl(String thumbUrl) {
|
|
||||||
this.thumbUrl = thumbUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getImageUrl() {
|
|
||||||
return imageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setImageUrl(String imageUrl) {
|
|
||||||
this.imageUrl = imageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBuyLink() {
|
|
||||||
return buyLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBuyLink(String buyLink) {
|
|
||||||
this.buyLink = buyLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getKeywords() {
|
|
||||||
return keywords;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setKeywords(String keywords) {
|
|
||||||
this.keywords = keywords;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getReviews() {
|
|
||||||
return reviews;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReviews(String reviews) {
|
|
||||||
this.reviews = reviews;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Float getRetailPrice() {
|
|
||||||
return retailPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRetailPrice(Float retailPrice) {
|
|
||||||
this.retailPrice = retailPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Float getSalePrice() {
|
|
||||||
return salePrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSalePrice(Float salePrice) {
|
|
||||||
this.salePrice = salePrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBrandPageLink() {
|
|
||||||
return brandPageLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandPageLink(String brandPageLink) {
|
|
||||||
this.brandPageLink = brandPageLink;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
|
|
||||||
public String getBrandLogoImage() {
|
|
||||||
return brandLogoImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrandLogoImage(String brandLogoImage) {
|
|
||||||
this.brandLogoImage = brandLogoImage;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
public String getProductPageViewTracking() {
|
|
||||||
return productPageViewTracking;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductPageViewTracking(String productPageViewTracking) {
|
|
||||||
this.productPageViewTracking = productPageViewTracking;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getParentGroupId() {
|
|
||||||
return parentGroupId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setParentGroupId(String parentGroupId) {
|
|
||||||
this.parentGroupId = parentGroupId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFineline() {
|
|
||||||
return fineline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFineline(String fineline) {
|
|
||||||
this.fineline = fineline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSuperfineline() {
|
|
||||||
return superfineline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSuperfineline(String superfineline) {
|
|
||||||
this.superfineline = superfineline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getModelnumber() {
|
|
||||||
return modelnumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setModelnumber(String modelnumber) {
|
|
||||||
this.modelnumber = modelnumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCaliber() {
|
|
||||||
return caliber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCaliber(String caliber) {
|
|
||||||
this.caliber = caliber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUpc() {
|
|
||||||
return upc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpc(String upc) {
|
|
||||||
this.upc = upc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMediumImageUrl() {
|
|
||||||
return mediumImageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMediumImageUrl(String mediumImageUrl) {
|
|
||||||
this.mediumImageUrl = mediumImageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProductContentWidget() {
|
|
||||||
return productContentWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProductContentWidget(String productContentWidget) {
|
|
||||||
this.productContentWidget = productContentWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGoogleCategorization() {
|
|
||||||
return googleCategorization;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGoogleCategorization(String googleCategorization) {
|
|
||||||
this.googleCategorization = googleCategorization;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getItemBasedCommission() {
|
|
||||||
return itemBasedCommission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItemBasedCommission(String itemBasedCommission) {
|
|
||||||
this.itemBasedCommission = itemBasedCommission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUuid() {
|
|
||||||
return uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUuid(String uuid) {
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "psa_old")
|
|
||||||
public class PsaOld {
|
|
||||||
@Id
|
|
||||||
@Column(name = "\"SKU\"", length = 50)
|
|
||||||
private String sku;
|
|
||||||
|
|
||||||
public String getSku() {
|
|
||||||
return sku;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSku(String sku) {
|
|
||||||
this.sku = sku;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import org.hibernate.annotations.ColumnDefault;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.time.OffsetDateTime;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "sessions")
|
|
||||||
public class Session {
|
|
||||||
@Id
|
|
||||||
@Column(name = "id", nullable = false)
|
|
||||||
private String id;
|
|
||||||
|
|
||||||
@Column(name = "user_id", nullable = false, length = 21)
|
|
||||||
private String userId;
|
|
||||||
|
|
||||||
@Column(name = "expires_at", nullable = false)
|
|
||||||
private OffsetDateTime expiresAt;
|
|
||||||
|
|
||||||
@ColumnDefault("CURRENT_TIMESTAMP")
|
|
||||||
@Column(name = "created_at")
|
|
||||||
private Instant createdAt;
|
|
||||||
|
|
||||||
@ColumnDefault("CURRENT_TIMESTAMP")
|
|
||||||
@Column(name = "updated_at")
|
|
||||||
private Instant updatedAt;
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserId() {
|
|
||||||
return userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUserId(String userId) {
|
|
||||||
this.userId = userId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OffsetDateTime getExpiresAt() {
|
|
||||||
return expiresAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExpiresAt(OffsetDateTime expiresAt) {
|
|
||||||
this.expiresAt = expiresAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getCreatedAt() {
|
|
||||||
return createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreatedAt(Instant createdAt) {
|
|
||||||
this.createdAt = createdAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getUpdatedAt() {
|
|
||||||
return updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdatedAt(Instant updatedAt) {
|
|
||||||
this.updatedAt = updatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
package group.goforward.ballistic.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "\"verificationTokens\"")
|
|
||||||
public class VerificationToken {
|
|
||||||
@Id
|
|
||||||
@Column(name = "identifier", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String identifier;
|
|
||||||
|
|
||||||
@Column(name = "token", nullable = false, length = Integer.MAX_VALUE)
|
|
||||||
private String token;
|
|
||||||
|
|
||||||
@Column(name = "expires", nullable = false)
|
|
||||||
private Instant expires;
|
|
||||||
|
|
||||||
public String getIdentifier() {
|
|
||||||
return identifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIdentifier(String identifier) {
|
|
||||||
this.identifier = identifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getToken() {
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setToken(String token) {
|
|
||||||
this.token = token;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getExpires() {
|
|
||||||
return expires;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExpires(Instant expires) {
|
|
||||||
this.expires = expires;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Account;
|
import group.goforward.ballistic.model.Account;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface AccountRepository extends JpaRepository<Account, UUID> {
|
public interface AccountRepository extends JpaRepository<Account, UUID> {
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
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;
|
||||||
|
|
||||||
public interface BrandRepository extends JpaRepository<Brand, Integer> {
|
public interface BrandRepository extends JpaRepository<Brand, Integer> {
|
||||||
Optional<Brand> findByNameIgnoreCase(String name);
|
Optional<Brand> findByNameIgnoreCase(String name);
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.BuildsComponent;
|
import group.goforward.ballistic.model.BuildsComponent;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface BuildItemRepository extends JpaRepository<BuildsComponent, Integer> {
|
public interface BuildItemRepository extends JpaRepository<BuildsComponent, Integer> {
|
||||||
List<BuildsComponent> findByBuildId(Integer buildId);
|
List<BuildsComponent> findByBuildId(Integer buildId);
|
||||||
Optional<BuildsComponent> findByUuid(UUID uuid);
|
Optional<BuildsComponent> findByUuid(UUID uuid);
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Build;
|
import group.goforward.ballistic.model.Build;
|
||||||
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 BuildRepository extends JpaRepository<Build, Integer> {
|
public interface BuildRepository extends JpaRepository<Build, Integer> {
|
||||||
Optional<Build> findByUuid(UUID uuid);
|
Optional<Build> findByUuid(UUID uuid);
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.FeedImport;
|
import group.goforward.ballistic.model.FeedImport;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
public interface FeedImportRepository extends JpaRepository<FeedImport, Long> {
|
public interface FeedImportRepository extends JpaRepository<FeedImport, Long> {
|
||||||
}
|
}
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.MerchantCategoryMapping;
|
import group.goforward.ballistic.model.MerchantCategoryMapping;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
public interface MerchantCategoryMappingRepository
|
public interface MerchantCategoryMappingRepository
|
||||||
extends JpaRepository<MerchantCategoryMapping, Integer> {
|
extends JpaRepository<MerchantCategoryMapping, Integer> {
|
||||||
|
|
||||||
Optional<MerchantCategoryMapping> findByMerchantIdAndRawCategoryIgnoreCase(
|
Optional<MerchantCategoryMapping> findByMerchantIdAndRawCategoryIgnoreCase(
|
||||||
Integer merchantId,
|
Integer merchantId,
|
||||||
String rawCategory
|
String rawCategory
|
||||||
);
|
);
|
||||||
|
|
||||||
List<MerchantCategoryMapping> findByMerchantIdOrderByRawCategoryAsc(Integer merchantId);
|
List<MerchantCategoryMapping> findByMerchantIdOrderByRawCategoryAsc(Integer merchantId);
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Merchant;
|
import group.goforward.ballistic.model.Merchant;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface MerchantRepository extends JpaRepository<Merchant, Integer> {
|
public interface MerchantRepository extends JpaRepository<Merchant, Integer> {
|
||||||
|
|
||||||
Optional<Merchant> findByNameIgnoreCase(String name);
|
Optional<Merchant> findByNameIgnoreCase(String name);
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.PriceHistory;
|
import group.goforward.ballistic.model.PriceHistory;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
public interface PriceHistoryRepository extends JpaRepository<PriceHistory, Long> {
|
public interface PriceHistoryRepository extends JpaRepository<PriceHistory, Long> {
|
||||||
}
|
}
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.ProductOffer;
|
import group.goforward.ballistic.model.ProductOffer;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface ProductOfferRepository extends JpaRepository<ProductOffer, Integer> {
|
public interface ProductOfferRepository extends JpaRepository<ProductOffer, Integer> {
|
||||||
|
|
||||||
List<ProductOffer> findByProductId(Integer productId);
|
List<ProductOffer> findByProductId(Integer productId);
|
||||||
|
|
||||||
// Used by the /api/products/gunbuilder endpoint
|
// Used by the /api/products/gunbuilder endpoint
|
||||||
List<ProductOffer> findByProductIdIn(Collection<Integer> productIds);
|
List<ProductOffer> findByProductIdIn(Collection<Integer> productIds);
|
||||||
|
|
||||||
// Unique offer lookup for importer upsert
|
// Unique offer lookup for importer upsert
|
||||||
Optional<ProductOffer> findByMerchantIdAndAvantlinkProductId(
|
Optional<ProductOffer> findByMerchantIdAndAvantlinkProductId(
|
||||||
Integer merchantId,
|
Integer merchantId,
|
||||||
String avantlinkProductId
|
String avantlinkProductId
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -33,14 +33,17 @@ public interface ProductRepository extends JpaRepository<Product, Integer> {
|
|||||||
""")
|
""")
|
||||||
List<Product> findByPlatformWithBrand(@Param("platform") String platform);
|
List<Product> findByPlatformWithBrand(@Param("platform") String platform);
|
||||||
|
|
||||||
|
@Query(name="Products.findByPlatformWithBrand")
|
||||||
|
List<Product> findByPlatformWithBrandNQ(@Param("platform") String platform);
|
||||||
|
|
||||||
@Query("""
|
@Query("""
|
||||||
SELECT p
|
SELECT p
|
||||||
FROM Product p
|
FROM Product p
|
||||||
JOIN FETCH p.brand b
|
JOIN FETCH p.brand b
|
||||||
WHERE p.platform = :platform
|
WHERE p.platform = :platform
|
||||||
AND p.partRole IN :roles
|
AND p.partRole IN :roles
|
||||||
AND p.deletedAt IS NULL
|
AND p.deletedAt IS NULL
|
||||||
""")
|
""")
|
||||||
List<Product> findByPlatformAndPartRoleInWithBrand(
|
List<Product> findByPlatformAndPartRoleInWithBrand(
|
||||||
@Param("platform") String platform,
|
@Param("platform") String platform,
|
||||||
@Param("roles") List<String> roles
|
@Param("roles") List<String> roles
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
package group.goforward.ballistic.repos;
|
|
||||||
import group.goforward.ballistic.model.Psa;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public interface PsaRepository extends JpaRepository<Psa, UUID> {
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
/**
|
/**
|
||||||
* Provides the classes necessary for the Spring Repository for the ballistic -Builder application.
|
* Provides the classes necessary for the Spring Repository for the ballistic -Builder application.
|
||||||
* This package includes Repository for Spring-Boot application
|
* This package includes Repository for Spring-Boot application
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* <p>The main entry point for managing the inventory is the
|
* <p>The main entry point for managing the inventory is the
|
||||||
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
* @author Sean Strawsburg
|
* @author Sean Strawsburg
|
||||||
* @version 1.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
package group.goforward.ballistic.repos;
|
package group.goforward.ballistic.repos;
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package group.goforward.ballistic.services;
|
||||||
|
|
||||||
|
import group.goforward.ballistic.model.Brand;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface BrandService {
|
||||||
|
|
||||||
|
List<Brand> findAll();
|
||||||
|
|
||||||
|
Optional<Brand> findById(Integer id);
|
||||||
|
|
||||||
|
Brand save(Brand item);
|
||||||
|
void deleteById(Integer id);
|
||||||
|
}
|
||||||
@@ -1,96 +1,96 @@
|
|||||||
package group.goforward.ballistic.services;
|
package group.goforward.ballistic.services;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Merchant;
|
import group.goforward.ballistic.model.Merchant;
|
||||||
import group.goforward.ballistic.model.MerchantCategoryMapping;
|
import group.goforward.ballistic.model.MerchantCategoryMapping;
|
||||||
import group.goforward.ballistic.model.ProductConfiguration;
|
import group.goforward.ballistic.model.ProductConfiguration;
|
||||||
import group.goforward.ballistic.repos.MerchantCategoryMappingRepository;
|
import group.goforward.ballistic.repos.MerchantCategoryMappingRepository;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MerchantCategoryMappingService {
|
public class MerchantCategoryMappingService {
|
||||||
|
|
||||||
private final MerchantCategoryMappingRepository mappingRepository;
|
private final MerchantCategoryMappingRepository mappingRepository;
|
||||||
|
|
||||||
public MerchantCategoryMappingService(MerchantCategoryMappingRepository mappingRepository) {
|
public MerchantCategoryMappingService(MerchantCategoryMappingRepository mappingRepository) {
|
||||||
this.mappingRepository = mappingRepository;
|
this.mappingRepository = mappingRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<MerchantCategoryMapping> findByMerchant(Integer merchantId) {
|
public List<MerchantCategoryMapping> findByMerchant(Integer merchantId) {
|
||||||
return mappingRepository.findByMerchantIdOrderByRawCategoryAsc(merchantId);
|
return mappingRepository.findByMerchantIdOrderByRawCategoryAsc(merchantId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolve (or create) a mapping row for this merchant + raw category.
|
* Resolve (or create) a mapping row for this merchant + raw category.
|
||||||
* - If it exists, returns it (with whatever mappedPartRole / mappedConfiguration are set).
|
* - If it exists, returns it (with whatever mappedPartRole / mappedConfiguration are set).
|
||||||
* - If it doesn't exist, creates a placeholder row with null mappings and returns it.
|
* - If it doesn't exist, creates a placeholder row with null mappings and returns it.
|
||||||
*
|
*
|
||||||
* The importer can then:
|
* The importer can then:
|
||||||
* - skip rows where mappedPartRole is still null
|
* - skip rows where mappedPartRole is still null
|
||||||
* - use mappedConfiguration if present
|
* - use mappedConfiguration if present
|
||||||
*/
|
*/
|
||||||
@Transactional
|
@Transactional
|
||||||
public MerchantCategoryMapping resolveMapping(Merchant merchant, String rawCategory) {
|
public MerchantCategoryMapping resolveMapping(Merchant merchant, String rawCategory) {
|
||||||
if (rawCategory == null || rawCategory.isBlank()) {
|
if (rawCategory == null || rawCategory.isBlank()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
String trimmed = rawCategory.trim();
|
String trimmed = rawCategory.trim();
|
||||||
|
|
||||||
return mappingRepository
|
return mappingRepository
|
||||||
.findByMerchantIdAndRawCategoryIgnoreCase(merchant.getId(), trimmed)
|
.findByMerchantIdAndRawCategoryIgnoreCase(merchant.getId(), trimmed)
|
||||||
.orElseGet(() -> {
|
.orElseGet(() -> {
|
||||||
MerchantCategoryMapping mapping = new MerchantCategoryMapping();
|
MerchantCategoryMapping mapping = new MerchantCategoryMapping();
|
||||||
mapping.setMerchant(merchant);
|
mapping.setMerchant(merchant);
|
||||||
mapping.setRawCategory(trimmed);
|
mapping.setRawCategory(trimmed);
|
||||||
mapping.setMappedPartRole(null);
|
mapping.setMappedPartRole(null);
|
||||||
mapping.setMappedConfiguration(null);
|
mapping.setMappedConfiguration(null);
|
||||||
return mappingRepository.save(mapping);
|
return mappingRepository.save(mapping);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Upsert mapping (admin UI).
|
* Upsert mapping (admin UI).
|
||||||
*/
|
*/
|
||||||
@Transactional
|
@Transactional
|
||||||
public MerchantCategoryMapping upsertMapping(
|
public MerchantCategoryMapping upsertMapping(
|
||||||
Merchant merchant,
|
Merchant merchant,
|
||||||
String rawCategory,
|
String rawCategory,
|
||||||
String mappedPartRole,
|
String mappedPartRole,
|
||||||
ProductConfiguration mappedConfiguration
|
ProductConfiguration mappedConfiguration
|
||||||
) {
|
) {
|
||||||
String trimmed = rawCategory.trim();
|
String trimmed = rawCategory.trim();
|
||||||
|
|
||||||
MerchantCategoryMapping mapping = mappingRepository
|
MerchantCategoryMapping mapping = mappingRepository
|
||||||
.findByMerchantIdAndRawCategoryIgnoreCase(merchant.getId(), trimmed)
|
.findByMerchantIdAndRawCategoryIgnoreCase(merchant.getId(), trimmed)
|
||||||
.orElseGet(() -> {
|
.orElseGet(() -> {
|
||||||
MerchantCategoryMapping m = new MerchantCategoryMapping();
|
MerchantCategoryMapping m = new MerchantCategoryMapping();
|
||||||
m.setMerchant(merchant);
|
m.setMerchant(merchant);
|
||||||
m.setRawCategory(trimmed);
|
m.setRawCategory(trimmed);
|
||||||
return m;
|
return m;
|
||||||
});
|
});
|
||||||
|
|
||||||
mapping.setMappedPartRole(
|
mapping.setMappedPartRole(
|
||||||
(mappedPartRole == null || mappedPartRole.isBlank()) ? null : mappedPartRole.trim()
|
(mappedPartRole == null || mappedPartRole.isBlank()) ? null : mappedPartRole.trim()
|
||||||
);
|
);
|
||||||
|
|
||||||
mapping.setMappedConfiguration(mappedConfiguration);
|
mapping.setMappedConfiguration(mappedConfiguration);
|
||||||
|
|
||||||
return mappingRepository.save(mapping);
|
return mappingRepository.save(mapping);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Backwards-compatible overload for existing callers (e.g. controller)
|
* Backwards-compatible overload for existing callers (e.g. controller)
|
||||||
* that don’t care about productConfiguration yet.
|
* that don’t care about productConfiguration yet.
|
||||||
*/
|
*/
|
||||||
@Transactional
|
@Transactional
|
||||||
public MerchantCategoryMapping upsertMapping(
|
public MerchantCategoryMapping upsertMapping(
|
||||||
Merchant merchant,
|
Merchant merchant,
|
||||||
String rawCategory,
|
String rawCategory,
|
||||||
String mappedPartRole
|
String mappedPartRole
|
||||||
) {
|
) {
|
||||||
// Delegate to the new method with `null` configuration
|
// Delegate to the new method with `null` configuration
|
||||||
return upsertMapping(merchant, rawCategory, mappedPartRole, null);
|
return upsertMapping(merchant, rawCategory, mappedPartRole, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
package group.goforward.ballistic.services;
|
package group.goforward.ballistic.services;
|
||||||
|
|
||||||
public interface MerchantFeedImportService {
|
public interface MerchantFeedImportService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Full product + offer import for a given merchant.
|
* Full product + offer import for a given merchant.
|
||||||
*/
|
*/
|
||||||
void importMerchantFeed(Integer merchantId);
|
void importMerchantFeed(Integer merchantId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Offers-only sync (price / stock) for a given merchant.
|
* Offers-only sync (price / stock) for a given merchant.
|
||||||
*/
|
*/
|
||||||
void syncOffersOnly(Integer merchantId);
|
void syncOffersOnly(Integer merchantId);
|
||||||
}
|
}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package group.goforward.ballistic.services;
|
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Psa;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public interface PsaService {
|
|
||||||
List<Psa> findAll();
|
|
||||||
|
|
||||||
Optional<Psa> findById(UUID id);
|
|
||||||
|
|
||||||
Psa save(Psa psa);
|
|
||||||
|
|
||||||
void deleteById(UUID id);
|
|
||||||
}
|
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
package group.goforward.ballistic.services;
|
package group.goforward.ballistic.services;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.State;
|
import group.goforward.ballistic.model.State;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface StatesService {
|
public interface StatesService {
|
||||||
|
|
||||||
List<State> findAll();
|
List<State> findAll();
|
||||||
|
|
||||||
Optional<State> findById(Integer id);
|
Optional<State> findById(Integer id);
|
||||||
|
|
||||||
State save(State item);
|
State save(State item);
|
||||||
void deleteById(Integer id);
|
void deleteById(Integer id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
package group.goforward.ballistic.services;
|
package group.goforward.ballistic.services;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.User;
|
import group.goforward.ballistic.model.User;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface UsersService {
|
public interface UsersService {
|
||||||
|
|
||||||
List<User> findAll();
|
List<User> findAll();
|
||||||
|
|
||||||
Optional<User> findById(Integer id);
|
Optional<User> findById(Integer id);
|
||||||
|
|
||||||
User save(User item);
|
User save(User item);
|
||||||
void deleteById(Integer id);
|
void deleteById(Integer id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package group.goforward.ballistic.services.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import group.goforward.ballistic.model.Brand;
|
||||||
|
import group.goforward.ballistic.repos.BrandRepository;
|
||||||
|
import group.goforward.ballistic.services.BrandService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class BrandServiceImpl implements BrandService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BrandRepository repo;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Brand> findAll() {
|
||||||
|
return repo.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<Brand> findById(Integer id) {
|
||||||
|
return repo.findById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Brand save(Brand item) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteById(Integer id) {
|
||||||
|
deleteById(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,41 +0,0 @@
|
|||||||
package group.goforward.ballistic.services.impl;
|
|
||||||
import group.goforward.ballistic.model.Psa;
|
|
||||||
import group.goforward.ballistic.repos.PsaRepository;
|
|
||||||
import group.goforward.ballistic.services.PsaService;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class PsaServiceImpl implements PsaService {
|
|
||||||
|
|
||||||
private final PsaRepository psaRepository;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public PsaServiceImpl(PsaRepository psaRepository) {
|
|
||||||
this.psaRepository = psaRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Psa> findAll() {
|
|
||||||
return psaRepository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<Psa> findById(UUID id) {
|
|
||||||
return psaRepository.findById(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Psa save(Psa psa) {
|
|
||||||
return psaRepository.save(psa);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteById(UUID id) {
|
|
||||||
psaRepository.deleteById(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +1,38 @@
|
|||||||
package group.goforward.ballistic.services.impl;
|
package group.goforward.ballistic.services.impl;
|
||||||
|
|
||||||
|
|
||||||
import group.goforward.ballistic.model.State;
|
import group.goforward.ballistic.model.State;
|
||||||
import group.goforward.ballistic.repos.StateRepository;
|
import group.goforward.ballistic.repos.StateRepository;
|
||||||
import group.goforward.ballistic.services.StatesService;
|
import group.goforward.ballistic.services.StatesService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class StatesServiceImpl implements StatesService {
|
public class StatesServiceImpl implements StatesService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private StateRepository repo;
|
private StateRepository repo;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<State> findAll() {
|
public List<State> findAll() {
|
||||||
return repo.findAll();
|
return repo.findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<State> findById(Integer id) {
|
public Optional<State> findById(Integer id) {
|
||||||
return repo.findById(id);
|
return repo.findById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public State save(State item) {
|
public State save(State item) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteById(Integer id) {
|
public void deleteById(Integer id) {
|
||||||
deleteById(id);
|
deleteById(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +1,37 @@
|
|||||||
package group.goforward.ballistic.services.impl;
|
package group.goforward.ballistic.services.impl;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.User;
|
import group.goforward.ballistic.model.User;
|
||||||
import group.goforward.ballistic.repos.UserRepository;
|
import group.goforward.ballistic.repos.UserRepository;
|
||||||
import group.goforward.ballistic.services.UsersService;
|
import group.goforward.ballistic.services.UsersService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class UsersServiceImpl implements UsersService {
|
public class UsersServiceImpl implements UsersService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserRepository repo;
|
private UserRepository repo;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<User> findAll() {
|
public List<User> findAll() {
|
||||||
return repo.findAll();
|
return repo.findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<User> findById(Integer id) {
|
public Optional<User> findById(Integer id) {
|
||||||
return repo.findById(id);
|
return repo.findById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public User save(User item) {
|
public User save(User item) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteById(Integer id) {
|
public void deleteById(Integer id) {
|
||||||
deleteById(id);
|
deleteById(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
/**
|
/**
|
||||||
* Provides the classes necessary for the Spring Services implementations for the ballistic -Builder application.
|
* Provides the classes necessary for the Spring Services implementations for the ballistic -Builder application.
|
||||||
* This package includes Services implementations for Spring-Boot application
|
* This package includes Services implementations for Spring-Boot application
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* <p>The main entry point for managing the inventory is the
|
* <p>The main entry point for managing the inventory is the
|
||||||
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
* {@link group.goforward.ballistic.BallisticApplication} class.</p>
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
* @author Don Strawsburg
|
* @author Don Strawsburg
|
||||||
* @version 1.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
package group.goforward.ballistic.services.impl;
|
package group.goforward.ballistic.services.impl;
|
||||||
@@ -1,70 +1,70 @@
|
|||||||
// MerchantAdminDto.java
|
// MerchantAdminDto.java
|
||||||
package group.goforward.ballistic.web.dto;
|
package group.goforward.ballistic.web.dto;
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
public class MerchantAdminDto {
|
public class MerchantAdminDto {
|
||||||
private Integer id;
|
private Integer id;
|
||||||
private String name;
|
private String name;
|
||||||
private String feedUrl;
|
private String feedUrl;
|
||||||
private String offerFeedUrl;
|
private String offerFeedUrl;
|
||||||
private Boolean isActive;
|
private Boolean isActive;
|
||||||
private OffsetDateTime lastFullImportAt;
|
private OffsetDateTime lastFullImportAt;
|
||||||
private OffsetDateTime lastOfferSyncAt;
|
private OffsetDateTime lastOfferSyncAt;
|
||||||
|
|
||||||
public Integer getId() {
|
public Integer getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(Integer id) {
|
public void setId(Integer id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public void setName(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFeedUrl() {
|
public String getFeedUrl() {
|
||||||
return feedUrl;
|
return feedUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFeedUrl(String feedUrl) {
|
public void setFeedUrl(String feedUrl) {
|
||||||
this.feedUrl = feedUrl;
|
this.feedUrl = feedUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getOfferFeedUrl() {
|
public String getOfferFeedUrl() {
|
||||||
return offerFeedUrl;
|
return offerFeedUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setOfferFeedUrl(String offerFeedUrl) {
|
public void setOfferFeedUrl(String offerFeedUrl) {
|
||||||
this.offerFeedUrl = offerFeedUrl;
|
this.offerFeedUrl = offerFeedUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean getIsActive() {
|
public Boolean getIsActive() {
|
||||||
return isActive;
|
return isActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIsActive(Boolean isActive) {
|
public void setIsActive(Boolean isActive) {
|
||||||
this.isActive = isActive;
|
this.isActive = isActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OffsetDateTime getLastFullImportAt() {
|
public OffsetDateTime getLastFullImportAt() {
|
||||||
return lastFullImportAt;
|
return lastFullImportAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLastFullImportAt(OffsetDateTime lastFullImportAt) {
|
public void setLastFullImportAt(OffsetDateTime lastFullImportAt) {
|
||||||
this.lastFullImportAt = lastFullImportAt;
|
this.lastFullImportAt = lastFullImportAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OffsetDateTime getLastOfferSyncAt() {
|
public OffsetDateTime getLastOfferSyncAt() {
|
||||||
return lastOfferSyncAt;
|
return lastOfferSyncAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLastOfferSyncAt(OffsetDateTime lastOfferSyncAt) {
|
public void setLastOfferSyncAt(OffsetDateTime lastOfferSyncAt) {
|
||||||
this.lastOfferSyncAt = lastOfferSyncAt;
|
this.lastOfferSyncAt = lastOfferSyncAt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,50 +1,50 @@
|
|||||||
package group.goforward.ballistic.web.dto;
|
package group.goforward.ballistic.web.dto;
|
||||||
|
|
||||||
public class MerchantCategoryMappingDto {
|
public class MerchantCategoryMappingDto {
|
||||||
|
|
||||||
private Integer id;
|
private Integer id;
|
||||||
private Integer merchantId;
|
private Integer merchantId;
|
||||||
private String merchantName;
|
private String merchantName;
|
||||||
private String rawCategory;
|
private String rawCategory;
|
||||||
private String mappedPartRole;
|
private String mappedPartRole;
|
||||||
|
|
||||||
public Integer getId() {
|
public Integer getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(Integer id) {
|
public void setId(Integer id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getMerchantId() {
|
public Integer getMerchantId() {
|
||||||
return merchantId;
|
return merchantId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMerchantId(Integer merchantId) {
|
public void setMerchantId(Integer merchantId) {
|
||||||
this.merchantId = merchantId;
|
this.merchantId = merchantId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMerchantName() {
|
public String getMerchantName() {
|
||||||
return merchantName;
|
return merchantName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMerchantName(String merchantName) {
|
public void setMerchantName(String merchantName) {
|
||||||
this.merchantName = merchantName;
|
this.merchantName = merchantName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRawCategory() {
|
public String getRawCategory() {
|
||||||
return rawCategory;
|
return rawCategory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRawCategory(String rawCategory) {
|
public void setRawCategory(String rawCategory) {
|
||||||
this.rawCategory = rawCategory;
|
this.rawCategory = rawCategory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMappedPartRole() {
|
public String getMappedPartRole() {
|
||||||
return mappedPartRole;
|
return mappedPartRole;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMappedPartRole(String mappedPartRole) {
|
public void setMappedPartRole(String mappedPartRole) {
|
||||||
this.mappedPartRole = mappedPartRole;
|
this.mappedPartRole = mappedPartRole;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,70 +1,70 @@
|
|||||||
package group.goforward.ballistic.web.dto;
|
package group.goforward.ballistic.web.dto;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
public class ProductOfferDto {
|
public class ProductOfferDto {
|
||||||
private String id;
|
private String id;
|
||||||
private String merchantName;
|
private String merchantName;
|
||||||
private BigDecimal price;
|
private BigDecimal price;
|
||||||
private BigDecimal originalPrice;
|
private BigDecimal originalPrice;
|
||||||
private boolean inStock;
|
private boolean inStock;
|
||||||
private String buyUrl;
|
private String buyUrl;
|
||||||
private OffsetDateTime lastUpdated;
|
private OffsetDateTime lastUpdated;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMerchantName() {
|
public String getMerchantName() {
|
||||||
return merchantName;
|
return merchantName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMerchantName(String merchantName) {
|
public void setMerchantName(String merchantName) {
|
||||||
this.merchantName = merchantName;
|
this.merchantName = merchantName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigDecimal getPrice() {
|
public BigDecimal getPrice() {
|
||||||
return price;
|
return price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPrice(BigDecimal price) {
|
public void setPrice(BigDecimal price) {
|
||||||
this.price = price;
|
this.price = price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigDecimal getOriginalPrice() {
|
public BigDecimal getOriginalPrice() {
|
||||||
return originalPrice;
|
return originalPrice;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setOriginalPrice(BigDecimal originalPrice) {
|
public void setOriginalPrice(BigDecimal originalPrice) {
|
||||||
this.originalPrice = originalPrice;
|
this.originalPrice = originalPrice;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInStock() {
|
public boolean isInStock() {
|
||||||
return inStock;
|
return inStock;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setInStock(boolean inStock) {
|
public void setInStock(boolean inStock) {
|
||||||
this.inStock = inStock;
|
this.inStock = inStock;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBuyUrl() {
|
public String getBuyUrl() {
|
||||||
return buyUrl;
|
return buyUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBuyUrl(String buyUrl) {
|
public void setBuyUrl(String buyUrl) {
|
||||||
this.buyUrl = buyUrl;
|
this.buyUrl = buyUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OffsetDateTime getLastUpdated() {
|
public OffsetDateTime getLastUpdated() {
|
||||||
return lastUpdated;
|
return lastUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLastUpdated(OffsetDateTime lastUpdated) {
|
public void setLastUpdated(OffsetDateTime lastUpdated) {
|
||||||
this.lastUpdated = lastUpdated;
|
this.lastUpdated = lastUpdated;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,79 +1,79 @@
|
|||||||
package group.goforward.ballistic.web.dto;
|
package group.goforward.ballistic.web.dto;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public class ProductSummaryDto {
|
public class ProductSummaryDto {
|
||||||
|
|
||||||
private String id; // product UUID as string
|
private String id; // product UUID as string
|
||||||
private String name;
|
private String name;
|
||||||
private String brand;
|
private String brand;
|
||||||
private String platform;
|
private String platform;
|
||||||
private String partRole;
|
private String partRole;
|
||||||
private String categoryKey;
|
private String categoryKey;
|
||||||
private BigDecimal price;
|
private BigDecimal price;
|
||||||
private String buyUrl;
|
private String buyUrl;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public void setName(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBrand() {
|
public String getBrand() {
|
||||||
return brand;
|
return brand;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBrand(String brand) {
|
public void setBrand(String brand) {
|
||||||
this.brand = brand;
|
this.brand = brand;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPlatform() {
|
public String getPlatform() {
|
||||||
return platform;
|
return platform;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPlatform(String platform) {
|
public void setPlatform(String platform) {
|
||||||
this.platform = platform;
|
this.platform = platform;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPartRole() {
|
public String getPartRole() {
|
||||||
return partRole;
|
return partRole;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPartRole(String partRole) {
|
public void setPartRole(String partRole) {
|
||||||
this.partRole = partRole;
|
this.partRole = partRole;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCategoryKey() {
|
public String getCategoryKey() {
|
||||||
return categoryKey;
|
return categoryKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCategoryKey(String categoryKey) {
|
public void setCategoryKey(String categoryKey) {
|
||||||
this.categoryKey = categoryKey;
|
this.categoryKey = categoryKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigDecimal getPrice() {
|
public BigDecimal getPrice() {
|
||||||
return price;
|
return price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPrice(BigDecimal price) {
|
public void setPrice(BigDecimal price) {
|
||||||
this.price = price;
|
this.price = price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBuyUrl() {
|
public String getBuyUrl() {
|
||||||
return buyUrl;
|
return buyUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBuyUrl(String buyUrl) {
|
public void setBuyUrl(String buyUrl) {
|
||||||
this.buyUrl = buyUrl;
|
this.buyUrl = buyUrl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,32 +1,32 @@
|
|||||||
package group.goforward.ballistic.web.dto;
|
package group.goforward.ballistic.web.dto;
|
||||||
|
|
||||||
public class UpsertMerchantCategoryMappingRequest {
|
public class UpsertMerchantCategoryMappingRequest {
|
||||||
|
|
||||||
private Integer merchantId;
|
private Integer merchantId;
|
||||||
private String rawCategory;
|
private String rawCategory;
|
||||||
private String mappedPartRole; // can be null to "unmap"
|
private String mappedPartRole; // can be null to "unmap"
|
||||||
|
|
||||||
public Integer getMerchantId() {
|
public Integer getMerchantId() {
|
||||||
return merchantId;
|
return merchantId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMerchantId(Integer merchantId) {
|
public void setMerchantId(Integer merchantId) {
|
||||||
this.merchantId = merchantId;
|
this.merchantId = merchantId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRawCategory() {
|
public String getRawCategory() {
|
||||||
return rawCategory;
|
return rawCategory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRawCategory(String rawCategory) {
|
public void setRawCategory(String rawCategory) {
|
||||||
this.rawCategory = rawCategory;
|
this.rawCategory = rawCategory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMappedPartRole() {
|
public String getMappedPartRole() {
|
||||||
return mappedPartRole;
|
return mappedPartRole;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMappedPartRole(String mappedPartRole) {
|
public void setMappedPartRole(String mappedPartRole) {
|
||||||
this.mappedPartRole = mappedPartRole;
|
this.mappedPartRole = mappedPartRole;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,30 +1,30 @@
|
|||||||
package group.goforward.ballistic.web.mapper;
|
package group.goforward.ballistic.web.mapper;
|
||||||
|
|
||||||
import group.goforward.ballistic.model.Product;
|
import group.goforward.ballistic.model.Product;
|
||||||
import group.goforward.ballistic.web.dto.ProductSummaryDto;
|
import group.goforward.ballistic.web.dto.ProductSummaryDto;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public class ProductMapper {
|
public class ProductMapper {
|
||||||
|
|
||||||
public static ProductSummaryDto toSummary(Product product, BigDecimal price, String buyUrl) {
|
public static ProductSummaryDto toSummary(Product product, BigDecimal price, String buyUrl) {
|
||||||
ProductSummaryDto dto = new ProductSummaryDto();
|
ProductSummaryDto dto = new ProductSummaryDto();
|
||||||
|
|
||||||
// Product ID -> String
|
// Product ID -> String
|
||||||
dto.setId(String.valueOf(product.getId()));
|
dto.setId(String.valueOf(product.getId()));
|
||||||
|
|
||||||
dto.setName(product.getName());
|
dto.setName(product.getName());
|
||||||
dto.setBrand(product.getBrand() != null ? product.getBrand().getName() : null);
|
dto.setBrand(product.getBrand() != null ? product.getBrand().getName() : null);
|
||||||
dto.setPlatform(product.getPlatform());
|
dto.setPlatform(product.getPlatform());
|
||||||
dto.setPartRole(product.getPartRole());
|
dto.setPartRole(product.getPartRole());
|
||||||
|
|
||||||
// Use rawCategoryKey from the Product entity
|
// Use rawCategoryKey from the Product entity
|
||||||
dto.setCategoryKey(product.getRawCategoryKey());
|
dto.setCategoryKey(product.getRawCategoryKey());
|
||||||
|
|
||||||
// Price + buy URL from offers
|
// Price + buy URL from offers
|
||||||
dto.setPrice(price);
|
dto.setPrice(price);
|
||||||
dto.setBuyUrl(buyUrl);
|
dto.setBuyUrl(buyUrl);
|
||||||
|
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
5
update.sql
Normal file
5
update.sql
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
ALTER TABLE accounts
|
||||||
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
||||||
|
|
||||||
Reference in New Issue
Block a user