diff --git a/next.config.ts b/next.config.ts index 57d5b3c..9d99d6d 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,11 +1,16 @@ import type { NextConfig } from "next"; -const nextConfig: NextConfig = { - /* config options here */ - - /* module.exports = { + module.exports = { + images: { remotePatterns: [ + { + protocol: 'https', + hostname: 'assets.example.com', + port: '', + pathname: '/**', + search: '', + }, { protocol: 'https', hostname: 'images.unsplash.com', @@ -17,10 +22,14 @@ const nextConfig: NextConfig = { hostname: 'tailwindui.com', port: '', pathname: '/plus/img/logos/**', + }, + { + protocol: 'http', + hostname: 'i1.avlws.com', + port: '', + pathname: '/**', } ], - }, - },*/ -}; + } + }; -export default nextConfig; diff --git a/src/app/Products/barrels/page.tsx b/src/app/Products/barrels/page.tsx index 626d57d..d92a806 100644 --- a/src/app/Products/barrels/page.tsx +++ b/src/app/Products/barrels/page.tsx @@ -1,18 +1,17 @@ -import { getPSA, getLowerBuildKits, getProductType } from "@queries/PSA"; -import { psa } from '@db/schema/Psa'; +import { getProductType } from "@queries/PSA"; import partTypes from 'src/data/parts_cats.json'; import styles from '../styles.module.css'; import PageHero from "@src/components/PageHero"; import ProductTable from "@src/components/ProductTable"; export default async function BarrelsPage() { - const psa = await getProductType('Barrels'); + const data = await getProductType('Barrels'); return (
- +
); diff --git a/src/app/Products/grips/page.tsx b/src/app/Products/grips/page.tsx index 061f32e..3fe6c72 100644 --- a/src/app/Products/grips/page.tsx +++ b/src/app/Products/grips/page.tsx @@ -1,43 +1,17 @@ -import { getPSA, getLowerBuildKits, getGrips } from "@queries/PSA"; -import { psa } from '@db/schema/Psa'; +import { getGrips } from "@queries/PSA"; import partTypes from 'src/data/parts_cats.json'; import styles from '../styles.module.css'; import PageHero from "@src/components/PageHero"; import ProductTable from "@src/components/ProductTable"; export default async function GripsPage() { - const psa = await getGrips(); + const data = await getGrips(); return (
- - - - - - - - - - - - - {psa.map((psa) => ( - - - - - - - - ))} - -
ComponentManufacturerModel #Retail PriceSale Price
{psa.category}{psa.brandName}{psa.modelnumber}{psa.retailPrice} - ${Number(psa.salePrice).toFixed(2)} - -
+
); diff --git a/src/app/Products/handguards/page.tsx b/src/app/Products/handguards/page.tsx index a0b4b7e..70997e3 100644 --- a/src/app/Products/handguards/page.tsx +++ b/src/app/Products/handguards/page.tsx @@ -1,18 +1,16 @@ -import { getPSA, getLowerBuildKits, getARHandGuards } from "@queries/PSA"; -import { psa } from '@db/schema/Psa'; -import partTypes from 'src/data/parts_cats.json'; +import { getARHandGuards } from "@queries/PSA"; import styles from '../styles.module.css'; import PageHero from "@src/components/PageHero"; import ProductTable from "@src/components/ProductTable"; export default async function HamdGuardsPage() { - const psa = await getARHandGuards(); + const data = await getARHandGuards(); return (
- +
); diff --git a/src/app/Products/lowers/page.tsx b/src/app/Products/lowers/page.tsx index 64ac7cd..2a11b03 100644 --- a/src/app/Products/lowers/page.tsx +++ b/src/app/Products/lowers/page.tsx @@ -4,47 +4,16 @@ import { psa } from "@db/schema/Psa"; import styles from "../styles.module.css"; import PageHero from "@components/PageHero"; import Link from "next/link"; +import ProductTable from "@src/components/ProductTable"; export default async function LowerReceiverPage() { - const psa = await getProductType(partTypes["AR COMPLETE LOWERS"]); + const data = await getProductType(partTypes["AR COMPLETE LOWERS"]); return (
- +
- - - - - - - - - - - - - {psa.map((psa) => ( - - - - - - - - ))} - -
ComponentManufacturerModel #PriceSale Price
{psa.category}{psa.brandName}{psa.modelnumber}{psa.retailPrice} - ${Number(psa.salePrice).toFixed(2)} - {/* I dont think this is exactly correct but works for now? */} - - - -
+
); diff --git a/src/app/Products/muzzle-devices/page.tsx b/src/app/Products/muzzle-devices/page.tsx index 7b1700d..f139420 100644 --- a/src/app/Products/muzzle-devices/page.tsx +++ b/src/app/Products/muzzle-devices/page.tsx @@ -1,18 +1,17 @@ import { getMuzzleDevices } from "@queries/PSA"; -import { psa } from '@db/schema/Psa'; import partTypes from 'src/data/parts_cats.json'; import styles from '../styles.module.css'; import PageHero from "@src/components/PageHero"; import ProductTable from "@src/components/ProductTable"; export default async function MuzzleDevices() { - const psa = await getMuzzleDevices(); + const data = await getMuzzleDevices(); return (
- +
); diff --git a/src/app/Products/parts/page.tsx b/src/app/Products/parts/page.tsx index 64cc0eb..a04ab0a 100644 --- a/src/app/Products/parts/page.tsx +++ b/src/app/Products/parts/page.tsx @@ -1,36 +1,14 @@ -import { getPSA, getLowerBuildKits, getProductType} from "@queries/PSA"; -import { psa } from '@db/schema/Psa'; +import { getARParts } from "@queries/PSA"; import partTypes from 'src/data/parts_cats.json'; -import styles from '../styles.module.css'; +import styles from '../styles.module.css'; +import ProductTable from "@src/components/ProductTable"; export default async function PartsPage() { - const psa = await getProductType(partTypes["AR PARTS"]); + const data = await getARParts(); return (
- - - - - - - - - - - {psa.map((psa) => ( - - - - - - - ))} - -
ComponentManufacturerModel #Price
{psa.category}{psa.brandName}{psa.modelnumber} - ${Number(psa.salePrice).toFixed(2)} - -
+
); } \ No newline at end of file diff --git a/src/components/ProductTable/index.tsx b/src/components/ProductTable/index.tsx index b71c469..23d18de 100644 --- a/src/components/ProductTable/index.tsx +++ b/src/components/ProductTable/index.tsx @@ -1,32 +1,43 @@ - -export default async function ProductTable(props:any) { +import { psa } from "@db/schema/Psa"; +import Image from "next/image"; +import Link from "next/link"; +export default async function ProductTable(props: any) { return ( - - - - - - - - - - - - - {props.data.map((item:any) => ( - - - - - - - - ))} - -
ComponentManufacturerModel #Retail PriceSale Price
{item.category}{item.brandName}{item.modelnumber}{item.retailPrice} - ${Number(item.salePrice).toFixed(2)} - -
+ + + + + + + + + + + + + + {props.data.map((item: any) => ( + + + + + + + + + ))} + +
ComponentManufacturerModel #Retail PriceSale Price
+ + A image of the product + + {item.brandName}{item.modelnumber}{item.retailPrice} + ${Number(item.salePrice).toFixed(2)} + + + + +
); } \ No newline at end of file diff --git a/src/db/schema/Psa.ts b/src/db/schema/Psa.ts index 3640ebb..6a4303e 100644 --- a/src/db/schema/Psa.ts +++ b/src/db/schema/Psa.ts @@ -1,5 +1,5 @@ -import { pgTable, integer, varchar, text, decimal, real } from "drizzle-orm/pg-core"; +import { pgTable, integer, varchar, text, decimal, uuid, real } from "drizzle-orm/pg-core"; import { sql } from "drizzle-orm"; import { timestamps } from "./helpers/columns.helpers"; @@ -33,4 +33,6 @@ export const psa = pgTable("psa", { productContentWidget: varchar("PRODUCT_CONTENT_WIDGET", { length: 256 }), googleCategorization: varchar("GOOGLE_CATEGORIZATION", { length: 50 }), itemBasedCommission: varchar("ITEM_BASED_COMMISSION", { length: 50 }), -}); \ No newline at end of file + uuid: uuid().defaultRandom(), +}); +export default psa; \ No newline at end of file diff --git a/src/drizzle/schema.ts b/src/drizzle/schema.ts index 01a3773..411daad 100644 --- a/src/drizzle/schema.ts +++ b/src/drizzle/schema.ts @@ -1,4 +1,4 @@ -import { pgTable, integer, varchar, text, numeric, timestamp, uuid, unique, real, index, doublePrecision } from "drizzle-orm/pg-core" +import { pgTable, integer, varchar, text, numeric, timestamp, uuid, unique, index, real, doublePrecision, pgView } from "drizzle-orm/pg-core" import { sql } from "drizzle-orm" @@ -67,38 +67,6 @@ export const manufacturer = pgTable("manufacturer", { } }); -export const psa = pgTable("psa", { - sku: varchar("SKU", { length: 50 }), - manufacturerId: varchar("MANUFACTURER_ID", { length: 50 }), - brandName: varchar("BRAND_NAME", { length: 50 }), - productName: varchar("PRODUCT_NAME", { length: 255 }), - longDescription: text("LONG_DESCRIPTION"), - shortDescription: varchar("SHORT_DESCRIPTION", { length: 50 }), - department: varchar("DEPARTMENT", { length: 50 }), - category: varchar("CATEGORY", { length: 50 }), - subcategory: varchar("SUBCATEGORY", { length: 50 }), - thumbUrl: varchar("THUMB_URL", { length: 50 }), - imageUrl: varchar("IMAGE_URL", { length: 50 }), - buyLink: varchar("BUY_LINK", { length: 128 }), - keywords: varchar("KEYWORDS", { length: 50 }), - reviews: varchar("REVIEWS", { length: 50 }), - retailPrice: real("RETAIL_PRICE"), - salePrice: real("SALE_PRICE"), - brandPageLink: varchar("BRAND_PAGE_LINK", { length: 50 }), - brandLogoImage: varchar("BRAND_LOGO_IMAGE", { length: 50 }), - productPageViewTracking: varchar("PRODUCT_PAGE_VIEW_TRACKING", { length: 256 }), - parentGroupId: varchar("PARENT_GROUP_ID", { length: 50 }), - fineline: varchar("FINELINE", { length: 50 }), - superfineline: varchar("SUPERFINELINE", { length: 200 }), - modelnumber: varchar("MODELNUMBER", { length: 50 }), - caliber: varchar("CALIBER", { length: 200 }), - upc: varchar("UPC", { length: 100 }), - mediumImageUrl: varchar("MEDIUM_IMAGE_URL", { length: 50 }), - productContentWidget: varchar("PRODUCT_CONTENT_WIDGET", { length: 256 }), - googleCategorization: varchar("GOOGLE_CATEGORIZATION", { length: 50 }), - itemBasedCommission: varchar("ITEM_BASED_COMMISSION", { length: 50 }), -}); - export const states = pgTable("states", { id: integer().primaryKey().generatedByDefaultAsIdentity({ name: "states_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }), state: varchar({ length: 50 }), @@ -118,6 +86,34 @@ export const componentType = pgTable("component_type", { } }); +export const aeroPrecision = pgTable("aero_precision", { + sku: text().primaryKey().notNull(), + manufacturerId: text("manufacturer_id"), + brandName: text("brand_name"), + productName: text("product_name"), + longDescription: text("long_description"), + shortDescription: text("short_description"), + department: text(), + category: text(), + subcategory: text(), + thumbUrl: text("thumb_url"), + imageUrl: text("image_url"), + buyLink: text("buy_link"), + keywords: text(), + reviews: text(), + retailPrice: numeric("retail_price"), + salePrice: numeric("sale_price"), + brandPageLink: text("brand_page_link"), + brandLogoImage: text("brand_logo_image"), + productPageViewTracking: text("product_page_view_tracking"), + variantsXml: text("variants_xml"), + mediumImageUrl: text("medium_image_url"), + productContentWidget: text("product_content_widget"), + googleCategorization: text("google_categorization"), + itemBasedCommission: text("item_based_commission"), + uuid: uuid().defaultRandom(), +}); + export const compartment = pgTable("compartment", { id: uuid().defaultRandom().primaryKey().notNull(), name: varchar({ length: 100 }).notNull(), @@ -163,6 +159,80 @@ export const balAccounts = pgTable("bal_accounts", { } }); +export const brownells = pgTable("brownells", { + sku: text(), + manufacturerId: text("manufacturer_id"), + brandName: text("brand_name"), + productName: text("product_name"), + longDescription: text("long_description"), + shortDescription: text("short_description"), + department: text(), + category: text(), + subcategory: text(), + thumbUrl: text("thumb_url"), + imageUrl: text("image_url"), + buyLink: text("buy_link"), + keywords: text(), + reviews: text(), + retailPrice: numeric("retail_price"), + salePrice: numeric("sale_price"), + brandPageLink: text("brand_page_link"), + brandLogoImage: text("brand_logo_image"), + productPageViewTracking: text("product_page_view_tracking"), + parentGroupId: text("parent_group_id"), + color: text(), + size: text(), + pattern: text(), + material: text(), + ageGroup: text("age_group"), + gender: text(), + upc: text(), + availability: text(), + googleProductCategory: text("google_product_category"), + mediumImageUrl: text("medium_image_url"), + variantsXml: text("variants_xml"), + gtin: text(), + keyWords: text("key_words"), + productContentWidget: text("product_content_widget"), + googleCategorization: text("google_categorization"), + itemBasedCommission: text("item_based_commission"), + itemBasedCommissionRate: text("item_based_commission_rate"), + itemBasedCommissionRule: text("item_based_commission_rule"), +}); + +export const psa = pgTable("psa", { + sku: varchar("SKU", { length: 50 }), + manufacturerId: varchar("MANUFACTURER_ID", { length: 50 }), + brandName: varchar("BRAND_NAME", { length: 50 }), + productName: varchar("PRODUCT_NAME", { length: 255 }), + longDescription: text("LONG_DESCRIPTION"), + shortDescription: varchar("SHORT_DESCRIPTION", { length: 50 }), + department: varchar("DEPARTMENT", { length: 50 }), + category: varchar("CATEGORY", { length: 50 }), + subcategory: varchar("SUBCATEGORY", { length: 50 }), + thumbUrl: varchar("THUMB_URL", { length: 50 }), + imageUrl: varchar("IMAGE_URL", { length: 50 }), + buyLink: varchar("BUY_LINK", { length: 128 }), + keywords: varchar("KEYWORDS", { length: 50 }), + reviews: varchar("REVIEWS", { length: 50 }), + retailPrice: real("RETAIL_PRICE"), + salePrice: real("SALE_PRICE"), + brandPageLink: varchar("BRAND_PAGE_LINK", { length: 50 }), + brandLogoImage: varchar("BRAND_LOGO_IMAGE", { length: 50 }), + productPageViewTracking: varchar("PRODUCT_PAGE_VIEW_TRACKING", { length: 256 }), + parentGroupId: varchar("PARENT_GROUP_ID", { length: 50 }), + fineline: varchar("FINELINE", { length: 50 }), + superfineline: varchar("SUPERFINELINE", { length: 200 }), + modelnumber: varchar("MODELNUMBER", { length: 50 }), + caliber: varchar("CALIBER", { length: 200 }), + upc: varchar("UPC", { length: 100 }), + mediumImageUrl: varchar("MEDIUM_IMAGE_URL", { length: 50 }), + productContentWidget: varchar("PRODUCT_CONTENT_WIDGET", { length: 256 }), + googleCategorization: varchar("GOOGLE_CATEGORIZATION", { length: 50 }), + itemBasedCommission: varchar("ITEM_BASED_COMMISSION", { length: 50 }), + uuid: uuid().defaultRandom(), +}); + export const lipseycatalog = pgTable("lipseycatalog", { id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "lipseycatalog_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }), itemno: varchar({ length: 20 }).notNull(), @@ -275,3 +345,7 @@ export const balResellers = pgTable("bal_resellers", { balResellersUuidUnique: unique("bal_resellers_uuid_unique").on(table.uuid), } }); +export const vwProducts = pgView("vw_products", { aeroSku: text("aero_sku"), + aeroCategory: text("aero_category"), + aeroProductName: text("aero_product_name"), +}).as(sql`SELECT aero.sku AS aero_sku, aero.category AS aero_category, aero.product_name AS aero_product_name FROM aero_precision aero WHERE aero.department = 'Stripped Lowers'::text UNION ALL SELECT psa."SKU" AS aero_sku, psa."CATEGORY" AS aero_category, psa."PRODUCT_NAME" AS aero_product_name FROM psa psa WHERE psa."FINELINE"::text = 'AR Complete Lowers'::text`); \ No newline at end of file