diff --git a/src/app/Products/barrels/page.tsx b/src/app/Products/barrels/page.tsx
index d92a806..5ff2fcb 100644
--- a/src/app/Products/barrels/page.tsx
+++ b/src/app/Products/barrels/page.tsx
@@ -3,6 +3,7 @@ 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";
+import SortTable from "@src/components/SortTable";
export default async function BarrelsPage() {
const data = await getProductType('Barrels');
@@ -11,7 +12,7 @@ export default async function BarrelsPage() {
);
diff --git a/src/app/Products/handguards/page.tsx b/src/app/Products/handguards/page.tsx
index 70997e3..b79fcfb 100644
--- a/src/app/Products/handguards/page.tsx
+++ b/src/app/Products/handguards/page.tsx
@@ -2,6 +2,7 @@ import { getARHandGuards } from "@queries/PSA";
import styles from '../styles.module.css';
import PageHero from "@src/components/PageHero";
import ProductTable from "@src/components/ProductTable";
+import SortTable from "@src/components/SortTable";
export default async function HamdGuardsPage() {
const data = await getARHandGuards();
@@ -10,7 +11,7 @@ export default async function HamdGuardsPage() {
);
diff --git a/src/app/Products/magazines/page.tsx b/src/app/Products/magazines/page.tsx
new file mode 100644
index 0000000..000d99e
--- /dev/null
+++ b/src/app/Products/magazines/page.tsx
@@ -0,0 +1,19 @@
+import { getMags } 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";
+import SortTable from "@src/components/SortTable";
+
+export default async function MagsPage() {
+ const data = await getMags();
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/Products/muzzle-devices/page.tsx b/src/app/Products/muzzle-devices/page.tsx
index f139420..8242c01 100644
--- a/src/app/Products/muzzle-devices/page.tsx
+++ b/src/app/Products/muzzle-devices/page.tsx
@@ -3,6 +3,7 @@ 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";
+import SortTable from "@src/components/SortTable";
export default async function MuzzleDevices() {
const data = await getMuzzleDevices();
@@ -11,7 +12,7 @@ export default async function MuzzleDevices() {
);
diff --git a/src/app/Products/parts/page.tsx b/src/app/Products/parts/page.tsx
index a04ab0a..fdc97bb 100644
--- a/src/app/Products/parts/page.tsx
+++ b/src/app/Products/parts/page.tsx
@@ -2,13 +2,14 @@ import { getARParts } from "@queries/PSA";
import partTypes from 'src/data/parts_cats.json';
import styles from '../styles.module.css';
import ProductTable from "@src/components/ProductTable";
+import SortTable from "@src/components/SortTable";
export default async function PartsPage() {
const data = await getARParts();
return (
);
}
\ No newline at end of file
diff --git a/src/app/Products/stocks/page.tsx b/src/app/Products/stocks/page.tsx
index 5070f31..74cc082 100644
--- a/src/app/Products/stocks/page.tsx
+++ b/src/app/Products/stocks/page.tsx
@@ -4,6 +4,7 @@ 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";
+import SortTable from "@src/components/SortTable";
export default async function StocksPage() {
const psa = await getStocks();
@@ -12,7 +13,7 @@ export default async function StocksPage() {
);
diff --git a/src/app/Products/triggers/page.tsx b/src/app/Products/triggers/page.tsx
index 7230ead..e91921f 100644
--- a/src/app/Products/triggers/page.tsx
+++ b/src/app/Products/triggers/page.tsx
@@ -4,6 +4,7 @@ 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";
+import SortTable from "@src/components/SortTable";
export default async function TriggersPage() {
const psa = await getARTriggers();
@@ -12,7 +13,7 @@ export default async function TriggersPage() {
);
diff --git a/src/components/PopNav/page.tsx b/src/components/PopNav/page.tsx
index 86aac54..ad2a66d 100644
--- a/src/components/PopNav/page.tsx
+++ b/src/components/PopNav/page.tsx
@@ -50,6 +50,7 @@ const navigation = {
items: [
{ name: "Lower Receivers", href: "/Products/lowers" },
{ name: "Grips", href: "/Products/grips" },
+ { name: "Magazines", href: "/Products/magazines" },
{ name: "Stocks", href: "/Products/stocks" },
{ name: "Triggers", href: "/Products/triggers" },
{ name: "Parts", href: "/Products/parts" },
diff --git a/src/db/queries/PSA/index.ts b/src/db/queries/PSA/index.ts
index dbce09e..b17a0ee 100644
--- a/src/db/queries/PSA/index.ts
+++ b/src/db/queries/PSA/index.ts
@@ -142,4 +142,14 @@ export async function getARParts(page = 1) {
.limit(limit)
.where(and(like(psa.fineline, "%Trigger%"), like(psa.category, "Ar Parts")))
.offset(offset);
+}
+export async function getMags(page = 1) {
+ const limit = 40;
+ const offset = (page - 1) * limit;
+
+ return await db.select()
+ .from(psa)
+ .limit(limit)
+ .where(and(like(psa.fineline, "%Magazine%"), like(psa.category, "Ar Parts")))
+ .offset(offset);
}
\ No newline at end of file
diff --git a/src/db/schema/User.ts b/src/db/schema/User.ts
new file mode 100644
index 0000000..68093eb
--- /dev/null
+++ b/src/db/schema/User.ts
@@ -0,0 +1,27 @@
+import { pgTable, integer, varchar, text, decimal, uuid, real, bigserial, date, timestamp, boolean, unique, check } from "drizzle-orm/pg-core";
+import { sql } from "drizzle-orm";
+import { timestamps } from "./helpers/columns.helpers";
+
+export const users = pgTable("users", {
+ id: bigserial({ mode: "bigint" }).primaryKey().notNull(),
+ username: varchar({ length: 50 }).notNull(),
+ email: varchar({ length: 255 }).notNull(),
+ passwordHash: varchar("password_hash", { length: 255 }).notNull(),
+ firstName: varchar("first_name", { length: 50 }),
+ lastName: varchar("last_name", { length: 50 }),
+ profilePicture: varchar("profile_picture", { length: 255 }),
+ dateOfBirth: date("date_of_birth"),
+ phoneNumber: varchar("phone_number", { length: 20 }),
+ createdAt: timestamp("created_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
+ updatedAt: timestamp("updated_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
+ isAdmin: boolean("is_admin").default(false),
+ lastLogin: timestamp("last_login", { mode: 'string' }),
+ emailVerified: boolean("email_verified").default(false),
+ buildPrivacySetting: text("build_privacy_setting").default('public'),
+}, (table) => {
+ return {
+ usersUsernameKey: unique("users_username_key").on(table.username),
+ usersEmailKey: unique("users_email_key").on(table.email),
+ usersBuildPrivacySettingCheck: check("users_build_privacy_setting_check", sql`build_privacy_setting = ANY (ARRAY['private'::text, 'public'::text])`),
+ }
+});
\ No newline at end of file