From 96fc6a1b1609293f43b61689bc3dac087d323a4e Mon Sep 17 00:00:00 2001 From: Don Strawsburg Date: Mon, 16 Dec 2024 17:28:57 -0500 Subject: [PATCH] pushing it broke --- package-lock.json | 250 +++++++++++++++++++++++++--- package.json | 4 +- src/app/auth.ts | 18 ++ src/app/signin/page.tsx | 2 +- src/db/schema/Accounts.ts | 26 +++ src/db/schema/AeroPrecision.ts | 29 ++++ src/db/schema/Authenticators.ts | 22 +++ src/db/schema/Sessions.ts | 10 ++ src/db/schema/User.ts | 12 +- src/db/schema/UserActivity.ts | 3 +- src/db/schema/VerificationTokens.ts | 16 ++ src/drizzle/relations.ts | 16 +- src/drizzle/schema.ts | 8 +- 13 files changed, 380 insertions(+), 36 deletions(-) create mode 100644 src/app/auth.ts create mode 100644 src/db/schema/Accounts.ts create mode 100644 src/db/schema/AeroPrecision.ts create mode 100644 src/db/schema/Authenticators.ts create mode 100644 src/db/schema/Sessions.ts create mode 100644 src/db/schema/VerificationTokens.ts diff --git a/package-lock.json b/package-lock.json index 79a0de7..62146c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,6 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "dotenv": "^16.4.7", - "drizzle-orm": "^0.36.4", "fontsource-roboto": "^4.0.0", "framer-motion": "^11.11.17", "lucide-react": "^0.460.0", @@ -38,6 +37,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { + "@auth/drizzle-adapter": "^1.7.4", "@types/bun": "^1.1.13", "@types/node": "^20.17.6", "@types/pg": "^8.11.10", @@ -45,8 +45,10 @@ "@types/react-dom": "^18", "autoprefixer": "^10.4.20", "drizzle-kit": "^0.28.1", + "drizzle-orm": "^0.38.2", "eslint": "^8", "eslint-config-next": "15.0.3", + "next-auth": "^5.0.0-beta.25", "postcss": "^8", "tailwindcss": "^3.4.15", "tsx": "^4.19.2", @@ -64,6 +66,99 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@auth/core": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.37.2.tgz", + "integrity": "sha512-kUvzyvkcd6h1vpeMAojK2y7+PAV5H+0Cc9+ZlKYDFhDY31AlvsB+GW5vNO4qE3Y07KeQgvNO9U0QUx/fN62kBw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@panva/hkdf": "^1.2.1", + "@types/cookie": "0.6.0", + "cookie": "0.7.1", + "jose": "^5.9.3", + "oauth4webapi": "^3.0.0", + "preact": "10.11.3", + "preact-render-to-string": "5.2.3" + }, + "peerDependencies": { + "@simplewebauthn/browser": "^9.0.1", + "@simplewebauthn/server": "^9.0.2", + "nodemailer": "^6.8.0" + }, + "peerDependenciesMeta": { + "@simplewebauthn/browser": { + "optional": true + }, + "@simplewebauthn/server": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/@auth/core/node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/@auth/drizzle-adapter": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@auth/drizzle-adapter/-/drizzle-adapter-1.7.4.tgz", + "integrity": "sha512-OPZQakWWm5Hbx6okVMbtgI08WBliz/dCbFUXiPg9TThpp3Wh7MME/ubg4fW1oOp8P0gul6MkFvMVO733sVtd2w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@auth/core": "0.37.4" + } + }, + "node_modules/@auth/drizzle-adapter/node_modules/@auth/core": { + "version": "0.37.4", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.37.4.tgz", + "integrity": "sha512-HOXJwXWXQRhbBDHlMU0K/6FT1v+wjtzdKhsNg0ZN7/gne6XPsIrjZ4daMcFnbq0Z/vsAbYBinQhhua0d77v7qw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@panva/hkdf": "^1.2.1", + "jose": "^5.9.6", + "oauth4webapi": "^3.1.1", + "preact": "10.24.3", + "preact-render-to-string": "6.5.11" + }, + "peerDependencies": { + "@simplewebauthn/browser": "^9.0.1", + "@simplewebauthn/server": "^9.0.2", + "nodemailer": "^6.8.0" + }, + "peerDependenciesMeta": { + "@simplewebauthn/browser": { + "optional": true + }, + "@simplewebauthn/server": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/@auth/drizzle-adapter/node_modules/preact-render-to-string": { + "version": "6.5.11", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz", + "integrity": "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "preact": ">=10" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -2544,6 +2639,16 @@ "node": ">=12.4.0" } }, + "node_modules/@panva/hkdf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz", + "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2566,6 +2671,7 @@ "version": "5.22.0", "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "dev": true, "hasInstallScript": true, "optional": true, "peer": true, @@ -2585,6 +2691,7 @@ "version": "5.22.0", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "dev": true, "optional": true, "peer": true }, @@ -2592,6 +2699,7 @@ "version": "5.22.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "dev": true, "hasInstallScript": true, "optional": true, "peer": true, @@ -2606,6 +2714,7 @@ "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "dev": true, "optional": true, "peer": true }, @@ -2613,6 +2722,7 @@ "version": "5.22.0", "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "dev": true, "optional": true, "peer": true, "dependencies": { @@ -2625,6 +2735,7 @@ "version": "5.22.0", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "dev": true, "optional": true, "peer": true, "dependencies": { @@ -2814,6 +2925,13 @@ "bun-types": "1.1.34" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2824,7 +2942,7 @@ "version": "20.17.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", - "devOptional": true, + "dev": true, "dependencies": { "undici-types": "~6.19.2" } @@ -2838,7 +2956,7 @@ "version": "8.11.10", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.10.tgz", "integrity": "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -2850,7 +2968,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", - "devOptional": true, + "dev": true, "dependencies": { "pg-int8": "1.0.1", "pg-numeric": "1.0.2", @@ -2868,7 +2986,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", - "devOptional": true, + "dev": true, "engines": { "node": ">=12" } @@ -2877,7 +2995,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", - "devOptional": true, + "dev": true, "dependencies": { "obuf": "~1.1.2" }, @@ -2889,7 +3007,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=12" } @@ -2898,7 +3016,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=12" } @@ -2938,7 +3056,7 @@ "version": "8.5.13", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", - "devOptional": true, + "dev": true, "dependencies": { "@types/node": "*" } @@ -3604,7 +3722,7 @@ "version": "1.1.34", "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.34.tgz", "integrity": "sha512-br5QygTEL/TwB4uQOb96Ky22j4Gq2WxWH/8Oqv20fk5HagwKXo/akB+LiYgSfzexCt6kkcUaVm+bKiPl71xPvw==", - "devOptional": true, + "dev": true, "dependencies": { "@types/node": "~20.12.8", "@types/ws": "~8.5.10" @@ -3614,7 +3732,7 @@ "version": "20.12.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz", "integrity": "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==", - "devOptional": true, + "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -3623,7 +3741,7 @@ "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "devOptional": true + "dev": true }, "node_modules/busboy": { "version": "1.6.0", @@ -3833,6 +3951,16 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -4481,12 +4609,14 @@ } }, "node_modules/drizzle-orm": { - "version": "0.36.4", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.36.4.tgz", - "integrity": "sha512-1OZY3PXD7BR00Gl61UUOFihslDldfH4NFRH2MbP54Yxi0G/PKn4HfO65JYZ7c16DeP3SpM3Aw+VXVG9j6CRSXA==", + "version": "0.38.2", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.38.2.tgz", + "integrity": "sha512-eCE3yPRAskLo1WpM9OHpFaM70tBEDsWhwR/0M3CKyztAXKR9Qs3asZlcJOEliIcUSg8GuwrlY0dmYDgmm6y5GQ==", + "dev": true, + "license": "Apache-2.0", "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=3", + "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", @@ -6293,6 +6423,16 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "5.9.6", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", + "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6692,6 +6832,34 @@ } } }, + "node_modules/next-auth": { + "version": "5.0.0-beta.25", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-5.0.0-beta.25.tgz", + "integrity": "sha512-2dJJw1sHQl2qxCrRk+KTQbeH+izFbGFPuJj5eGgBZFYyiYYtvlrBeUw1E/OJJxTRjuxbSYGnCTkUIRsIIW0bog==", + "dev": true, + "license": "ISC", + "dependencies": { + "@auth/core": "0.37.2" + }, + "peerDependencies": { + "@simplewebauthn/browser": "^9.0.1", + "@simplewebauthn/server": "^9.0.2", + "next": "^14.0.0-0 || ^15.0.0-0", + "nodemailer": "^6.6.5", + "react": "^18.2.0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@simplewebauthn/browser": { + "optional": true + }, + "@simplewebauthn/server": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, "node_modules/next-themes": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.3.tgz", @@ -6752,6 +6920,16 @@ "node": ">=0.10.0" } }, + "node_modules/oauth4webapi": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.1.4.tgz", + "integrity": "sha512-eVfN3nZNbok2s/ROifO0UAc5G8nRoLSbrcKJ09OqmucgnhXEfdIQOR4gq1eJH1rN3gV7rNw62bDEgftsgFtBEg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6874,7 +7052,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "devOptional": true + "dev": true }, "node_modules/once": { "version": "1.4.0", @@ -7068,7 +7246,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=4" } @@ -7336,7 +7514,31 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", - "devOptional": true + "dev": true + }, + "node_modules/preact": { + "version": "10.24.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", + "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -7347,10 +7549,18 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", + "dev": true, + "license": "MIT" + }, "node_modules/prisma": { "version": "5.22.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "dev": true, "hasInstallScript": true, "optional": true, "peer": true, @@ -8473,7 +8683,7 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "devOptional": true + "dev": true }, "node_modules/update-browserslist-db": { "version": "1.1.1", diff --git a/package.json b/package.json index 6de5330..03a9656 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "dotenv": "^16.4.7", - "drizzle-orm": "^0.36.4", "fontsource-roboto": "^4.0.0", "framer-motion": "^11.11.17", "lucide-react": "^0.460.0", @@ -39,6 +38,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { + "@auth/drizzle-adapter": "^1.7.4", "@types/bun": "^1.1.13", "@types/node": "^20.17.6", "@types/pg": "^8.11.10", @@ -46,8 +46,10 @@ "@types/react-dom": "^18", "autoprefixer": "^10.4.20", "drizzle-kit": "^0.28.1", + "drizzle-orm": "^0.38.2", "eslint": "^8", "eslint-config-next": "15.0.3", + "next-auth": "^5.0.0-beta.25", "postcss": "^8", "tailwindcss": "^3.4.15", "tsx": "^4.19.2", diff --git a/src/app/auth.ts b/src/app/auth.ts new file mode 100644 index 0000000..65b84df --- /dev/null +++ b/src/app/auth.ts @@ -0,0 +1,18 @@ +import NextAuth from "next-auth" +import Google from "next-auth/providers/google" +import { DrizzleAdapter } from "@auth/drizzle-adapter" +import { db } from "../db"; +import { users } from "@schemas/User" +import { accounts } from "@schemas/Accounts"; +import { sessions } from "@schemas/Sessions"; +import { verificationTokens } from "@schemas/VerificationTokens"; + +export const { handlers, auth } = NextAuth({ + adapter: DrizzleAdapter(db, { + usersTable: users, + accountsTable: accounts, + sessionsTable: sessions, + verificationTokensTable: verificationTokens, + }), + providers: [] +}) \ No newline at end of file diff --git a/src/app/signin/page.tsx b/src/app/signin/page.tsx index 39af355..824332f 100644 --- a/src/app/signin/page.tsx +++ b/src/app/signin/page.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useState } from 'react'; import { useRouter } from 'next/navigation'; -import constants from '@src/lib/constants'; +import constants from '@lib/constants'; import Link from 'next/link'; export default function SignInPage() { diff --git a/src/db/schema/Accounts.ts b/src/db/schema/Accounts.ts new file mode 100644 index 0000000..183412b --- /dev/null +++ b/src/db/schema/Accounts.ts @@ -0,0 +1,26 @@ +import { users } from "@schemas/User"; +import { integer, pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import type { AdapterAccountType } from "next-auth/adapters" +export const accounts = pgTable( + "account", + { + userId: text("userId") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + type: text("type").$type().notNull(), + provider: text("provider").notNull(), + providerAccountId: text("providerAccountId").notNull(), + refresh_token: text("refresh_token"), + access_token: text("access_token"), + expires_at: integer("expires_at"), + token_type: text("token_type"), + scope: text("scope"), + id_token: text("id_token"), + session_state: text("session_state"), + }, + (account) => ({ + compoundKey: primaryKey({ + columns: [account.provider, account.providerAccountId], + }), + }) + ) \ No newline at end of file diff --git a/src/db/schema/AeroPrecision.ts b/src/db/schema/AeroPrecision.ts new file mode 100644 index 0000000..f216491 --- /dev/null +++ b/src/db/schema/AeroPrecision.ts @@ -0,0 +1,29 @@ +import { numeric, pgTable, text, uuid } from "drizzle-orm/pg-core"; + +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(), +}); diff --git a/src/db/schema/Authenticators.ts b/src/db/schema/Authenticators.ts new file mode 100644 index 0000000..03b4cce --- /dev/null +++ b/src/db/schema/Authenticators.ts @@ -0,0 +1,22 @@ +import { boolean, integer, pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { users } from '@schemas/User' +export const authenticators = pgTable( + "authenticator", + { + credentialID: text("credentialID").notNull().unique(), + userId: text("userId") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + providerAccountId: text("providerAccountId").notNull(), + credentialPublicKey: text("credentialPublicKey").notNull(), + counter: integer("counter").notNull(), + credentialDeviceType: text("credentialDeviceType").notNull(), + credentialBackedUp: boolean("credentialBackedUp").notNull(), + transports: text("transports"), + }, + (authenticator) => ({ + compositePK: primaryKey({ + columns: [authenticator.userId, authenticator.credentialID], + }), + }) + ) \ No newline at end of file diff --git a/src/db/schema/Sessions.ts b/src/db/schema/Sessions.ts new file mode 100644 index 0000000..2cd04e2 --- /dev/null +++ b/src/db/schema/Sessions.ts @@ -0,0 +1,10 @@ +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import {User} from '@schemas/User'; +export const sessions = pgTable("session", { + sessionToken: text("sessionToken").primaryKey(), + userId: text("userId") + .notNull() + .references(() => User.id, { onDelete: "cascade" }), + expires: timestamp("expires", { mode: "date" }).notNull(), + }) + \ No newline at end of file diff --git a/src/db/schema/User.ts b/src/db/schema/User.ts index 825eafb..4bbee53 100644 --- a/src/db/schema/User.ts +++ b/src/db/schema/User.ts @@ -24,4 +24,14 @@ export const User = pgTable("users", { 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 +}); + +export const users = pgTable("user", { + id: text("id") + .primaryKey() + .$defaultFn(() => crypto.randomUUID()), + name: text("name"), + email: text("email").unique(), + emailVerified: timestamp("emailVerified", { mode: "date" }), + image: text("image"), + }) \ No newline at end of file diff --git a/src/db/schema/UserActivity.ts b/src/db/schema/UserActivity.ts index 41bf2e6..4e9347b 100644 --- a/src/db/schema/UserActivity.ts +++ b/src/db/schema/UserActivity.ts @@ -1,8 +1,9 @@ import { bigint, bigserial, foreignKey, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import { sql } from "drizzle-orm"; import { users } from "./User"; export const userActivityLog = pgTable("user_activity_log", { - id: bigserial({ mode: "bigint" }).primaryKey().notNull(), + id: bigint({ mode: "bigint" }).primaryKey().generatedAlwaysAsIdentity({ name: "user_activity_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }).notNull(), // You can use { mode: "bigint" } if numbers are exceeding js number limitations userId: bigint("user_id", { mode: "number" }).notNull(), activity: text().notNull(), diff --git a/src/db/schema/VerificationTokens.ts b/src/db/schema/VerificationTokens.ts new file mode 100644 index 0000000..36217ad --- /dev/null +++ b/src/db/schema/VerificationTokens.ts @@ -0,0 +1,16 @@ +import { pgTable, primaryKey, text, timestamp } from "drizzle-orm/pg-core"; + +export const verificationTokens = pgTable( + "verificationToken", + { + identifier: text("identifier").notNull(), + token: text("token").notNull(), + expires: timestamp("expires", { mode: "date" }).notNull(), + }, + (verificationToken) => ({ + compositePk: primaryKey({ + columns: [verificationToken.identifier, verificationToken.token], + }), + }) + ) + \ No newline at end of file diff --git a/src/drizzle/relations.ts b/src/drizzle/relations.ts index fffbdec..5b87bf1 100644 --- a/src/drizzle/relations.ts +++ b/src/drizzle/relations.ts @@ -1,29 +1,29 @@ import { relations } from "drizzle-orm/relations"; -import { users, userBuilds, userFavorites, userActivityLog } from "./schema"; +import { usersKeep, userBuilds, userFavorites, userActivityLog } from "./schema"; export const userBuildsRelations = relations(userBuilds, ({one}) => ({ - user: one(users, { + usersKeep: one(usersKeep, { fields: [userBuilds.userId], - references: [users.id] + references: [usersKeep.id] }), })); -export const usersRelations = relations(users, ({many}) => ({ +export const usersKeepRelations = relations(usersKeep, ({many}) => ({ userBuilds: many(userBuilds), userFavorites: many(userFavorites), userActivityLogs: many(userActivityLog), })); export const userFavoritesRelations = relations(userFavorites, ({one}) => ({ - user: one(users, { + usersKeep: one(usersKeep, { fields: [userFavorites.userId], - references: [users.id] + references: [usersKeep.id] }), })); export const userActivityLogRelations = relations(userActivityLog, ({one}) => ({ - user: one(users, { + usersKeep: one(usersKeep, { fields: [userActivityLog.userId], - references: [users.id] + references: [usersKeep.id] }), })); \ No newline at end of file diff --git a/src/drizzle/schema.ts b/src/drizzle/schema.ts index 70a39e9..dc56401 100644 --- a/src/drizzle/schema.ts +++ b/src/drizzle/schema.ts @@ -54,7 +54,7 @@ export const userBuilds = pgTable("user_builds", { return { userBuildsUserIdFkey: foreignKey({ columns: [table.userId], - foreignColumns: [users.id], + foreignColumns: [usersKeep.id], name: "user_builds_user_id_fkey" }).onDelete("cascade"), } @@ -71,7 +71,7 @@ export const userFavorites = pgTable("user_favorites", { return { userFavoritesUserIdFkey: foreignKey({ columns: [table.userId], - foreignColumns: [users.id], + foreignColumns: [usersKeep.id], name: "user_favorites_user_id_fkey" }).onDelete("cascade"), } @@ -113,7 +113,7 @@ export const userActivityLog = pgTable("user_activity_log", { return { userActivityLogUserIdFkey: foreignKey({ columns: [table.userId], - foreignColumns: [users.id], + foreignColumns: [usersKeep.id], name: "user_activity_log_user_id_fkey" }).onDelete("cascade"), } @@ -285,7 +285,7 @@ export const psa = pgTable("psa", { uuid: uuid().defaultRandom(), }); -export const users = pgTable("users", { +export const usersKeep = pgTable("users_keep", { id: bigserial({ mode: "bigint" }).primaryKey().notNull(), username: varchar({ length: 50 }).notNull(), email: varchar({ length: 255 }).notNull(),