From a6d63707bfddcfef46a227eb5d1704699bc9ed14 Mon Sep 17 00:00:00 2001 From: knhn1004 <49494541+knhn1004@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:59:32 -0700 Subject: [PATCH] drizzle schema --- .env.example | 1 + db-scripts/createdb.sql | 6 +- server/bun.lockb | Bin 47630 -> 79386 bytes server/drizzle.config.ts | 19 + server/package-lock.json | 1272 ++++++++++++++++++++++++++++- server/package.json | 8 +- server/src/db/db.ts | 11 + server/src/db/schema.ts | 223 +++++ server/src/router/v1/v1.router.ts | 18 +- 9 files changed, 1549 insertions(+), 9 deletions(-) create mode 100644 server/drizzle.config.ts create mode 100644 server/src/db/db.ts create mode 100644 server/src/db/schema.ts diff --git a/.env.example b/.env.example index e625429..7825835 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,6 @@ POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_DB=acm_website +POSTGRES_HOST=db PORT=5001 diff --git a/db-scripts/createdb.sql b/db-scripts/createdb.sql index 7a73c90..c000138 100644 --- a/db-scripts/createdb.sql +++ b/db-scripts/createdb.sql @@ -54,7 +54,8 @@ create table if not exists equipment_rental_type( id serial, created_at timestamp not null default CURRENT_TIMESTAMP, name text not null, - price money not null, +-- price money not null, + price numeric(10,2) not null, description text, PRIMARY KEY(id) ); @@ -72,7 +73,8 @@ create table if not exists equipment_rentals( user_id text, date_borrowed date not null default current_date, return_date date not null, - price money not null, +-- price money not null, + price numeric(10,2) not null, condition equipment_condition_enum not null default 'ready', PRIMARY KEY(user_id, item_id), FOREIGN KEY(item_id) REFERENCES equipment_item(id) on update cascade, diff --git a/server/bun.lockb b/server/bun.lockb index c8da91b4eb2569261fbdeee41c0d6549bbbbee92..6412c61bc4328be6cbb2fa771c1d97c6c9b9e7ed 100755 GIT binary patch delta 29104 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 RGHYL3(tNQMiP*pC{{TUBDPRBq delta 8743 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 diff --git a/server/drizzle.config.ts b/server/drizzle.config.ts new file mode 100644 index 0000000..435885d --- /dev/null +++ b/server/drizzle.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from 'drizzle-kit'; +import * as dotenv from 'dotenv'; + +dotenv.config(); + +export default defineConfig({ + dialect: 'postgresql', + schema: './src/db/schema.ts', + out: './drizzle', + dbCredentials: { + host: process.env.POSTGRES_HOST || 'localhost', + port: Number(process.env.POSTGRES_PORT) || 5432, + user: process.env.POSTGRES_USER || 'postgres', + password: process.env.POSTGRES_PASSWORD || 'postgres', + database: process.env.POSTGRES_DB || 'acm_website', + ssl: 'allow', + }, + verbose: true, +}); diff --git a/server/package-lock.json b/server/package-lock.json index cdf164b..ea8041d 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -6,17 +6,806 @@ "": { "name": "acm-website-server", "dependencies": { - "hono": "^4.6.3" + "drizzle-orm": "^0.33.0", + "hono": "^4.6.3", + "pg": "^8.13.0" }, "devDependencies": { "@types/bun": "^1.1.10", + "@types/pg": "^8.11.10", "@typescript-eslint/eslint-plugin": "^8.7.0", "@typescript-eslint/parser": "^8.7.0", + "dotenv": "^16.4.5", + "drizzle-kit": "^0.24.2", "eslint": "^9.11.1", + "eslint-plugin-drizzle": "0.2.3", "typescript": "5.5.3", "typescript-eslint": "^8.7.0" } }, + "node_modules/@drizzle-team/brocli": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.1.tgz", + "integrity": "sha512-AHy0vjc+n/4w/8Mif+w86qpppHuF3AyXbcWW+R/W7GNA3F5/p2nuhlkCJaTXSLZheB4l1rtHzOfr9A7NwoR/Zg==", + "dev": true + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "dev": true, + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "dev": true, + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "dev": true, @@ -196,15 +985,26 @@ }, "node_modules/@types/node": { "version": "20.12.14", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@types/pg": { + "version": "8.11.10", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.10.tgz", + "integrity": "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==", + "devOptional": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, "node_modules/@types/ws": { "version": "8.5.12", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -503,9 +1303,15 @@ "node": ">=8" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "node_modules/bun-types": { "version": "1.1.29", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/node": "~20.12.8", @@ -590,6 +1396,203 @@ "dev": true, "license": "MIT" }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/drizzle-kit": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.24.2.tgz", + "integrity": "sha512-nXOaTSFiuIaTMhS8WJC2d4EBeIcN9OSt2A2cyFbQYBAZbi7lRsVGJNqDpEwPqYfJz38yxbY/UtbvBBahBfnExQ==", + "dev": true, + "dependencies": { + "@drizzle-team/brocli": "^0.10.1", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.19.7", + "esbuild-register": "^3.5.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-orm": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.33.0.tgz", + "integrity": "sha512-SHy72R2Rdkz0LEq0PSG/IdvnT3nGiWuRk+2tXZQ90GVq/XQhpCzu/EFT3V2rox+w8MlkBQxifF8pCStNYnERfA==", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=3", + "@electric-sql/pglite": ">=0.1.1", + "@libsql/client": "*", + "@neondatabase/serverless": ">=0.1", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/react": ">=18", + "@types/sql.js": "*", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=13.2.0", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "react": ">=18", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "react": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -662,6 +1665,15 @@ } } }, + "node_modules/eslint-plugin-drizzle": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-drizzle/-/eslint-plugin-drizzle-0.2.3.tgz", + "integrity": "sha512-BO+ymHo33IUNoJlC0rbd7HP9EwwpW4VIp49R/tWQF/d2E1K2kgTf0tCXT0v9MSiBr6gGR1LtPwMLapTKEWSg9A==", + "dev": true, + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, "node_modules/eslint-scope": { "version": "8.0.2", "dev": true, @@ -857,6 +1869,18 @@ "dev": true, "license": "ISC" }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "dev": true, @@ -1064,6 +2088,12 @@ "dev": true, "license": "MIT" }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "devOptional": true + }, "node_modules/optionator": { "version": "0.9.4", "dev": true, @@ -1135,6 +2165,149 @@ "node": ">=8" } }, + "node_modules/pg": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.0.tgz", + "integrity": "sha512-34wkUTh3SxTClfoHB3pQ7bIMvw9dpFU1audQQeZG837fmHfHpr14n/AELVDoOYVDW2h5RDWU78tFjkD+erSBsw==", + "dependencies": { + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-numeric": { + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-pool": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + }, + "node_modules/pg-types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", + "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", + "devOptional": true, + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.1.0", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pg/node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picomatch": { "version": "2.3.1", "dev": true, @@ -1146,6 +2319,51 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/postgres-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "devOptional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-bytea": { + "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, + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "devOptional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "devOptional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-range": { + "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 + }, "node_modules/prelude-ls": { "version": "1.2.1", "dev": true, @@ -1189,6 +2407,15 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.0.4", "dev": true, @@ -1250,6 +2477,33 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "dev": true, @@ -1357,7 +2611,7 @@ }, "node_modules/undici-types": { "version": "5.26.5", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/uri-js": { @@ -1390,6 +2644,14 @@ "node": ">=0.10.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "dev": true, diff --git a/server/package.json b/server/package.json index d159b16..dc8751a 100644 --- a/server/package.json +++ b/server/package.json @@ -11,13 +11,19 @@ "docs:serve": "bunx live-server ./docs" }, "dependencies": { - "hono": "^4.6.3" + "drizzle-orm": "^0.33.0", + "hono": "^4.6.3", + "pg": "^8.13.0" }, "devDependencies": { "@types/bun": "^1.1.10", + "@types/pg": "^8.11.10", "@typescript-eslint/eslint-plugin": "^8.7.0", "@typescript-eslint/parser": "^8.7.0", + "dotenv": "^16.4.5", + "drizzle-kit": "^0.24.2", "eslint": "^9.11.1", + "eslint-plugin-drizzle": "0.2.3", "typescript": "5.5.3", "typescript-eslint": "^8.7.0" } diff --git a/server/src/db/db.ts b/server/src/db/db.ts new file mode 100644 index 0000000..f753d89 --- /dev/null +++ b/server/src/db/db.ts @@ -0,0 +1,11 @@ +import { drizzle } from 'drizzle-orm/node-postgres'; +import { Pool } from 'pg'; + +const pool = new Pool({ + user: process.env.POSTGRES_USER || 'postgres', + host: process.env.POSTGRES_HOST || 'db', + database: process.env.POSTGRES_DB || 'acm_website', + password: process.env.POSTGRES_PASSWORD || 'postgres', +}); + +export const db = drizzle(pool); diff --git a/server/src/db/schema.ts b/server/src/db/schema.ts new file mode 100644 index 0000000..a886a87 --- /dev/null +++ b/server/src/db/schema.ts @@ -0,0 +1,223 @@ +import { text, timestamp, date, integer, bigint, pgEnum, pgTable, serial, time, numeric } from 'drizzle-orm/pg-core'; + +// Enums +export const eventsEnum = pgEnum('events_enum', ['workshop', 'seminar', 'hackathon', 'conference', 'meetup', 'test', 'other']); +export const csFieldsEnum = pgEnum('cs_fields_enum', ['web development', 'machine learning', 'cloud computing', 'artificial intelligence']); +export const targetAudienceEnum = pgEnum('target_audience_enum', ['students']); +export const equipmentConditionEnum = pgEnum('equipment_condition_enum', ['ready', 'broken', 'in maintenance']); +export const membershipTermEnum = pgEnum('membership_term_enum', ['semester', 'annual']); +export const membershipRequestStatusEnum = pgEnum('membership_request_status_enum', ['pending', 'approved', 'declined']); +export const industryEnum = pgEnum('industry_enum', ['investment banking', 'aerospace', 'healthcare']); +export const officerPositionEnum = pgEnum('officer_position_enum', ['president', 'vice president', 'dev team officer', 'treasurer', 'social media manager']); + +// Tables +export const majors = pgTable('majors', { + name: text('name').primaryKey(), +}); + +export const users = pgTable('users', { + id: text('id').primaryKey(), + createdAt: timestamp('created_at').notNull(), + name: text('name').notNull(), + email: text('email').notNull(), + major: text('major').notNull().references(() => majors.name), + gradDate: date('grad_date').notNull(), + interests: csFieldsEnum('interests').array().notNull().default([]), + profilePic: text('profile_pic'), +}); + +export const session = pgTable('session', { + id: text('id').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + createdAt: timestamp('created_at').notNull(), + activeExpires: bigint('active_expires', { mode: 'number' }).notNull(), + idleExpires: bigint('idle_expires', { mode: 'number' }).notNull(), +}); + +export const userKey = pgTable('user_key', { + id: text('id').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + hashedPassword: text('hashed_password'), +}); + +export const equipmentRentalType = pgTable('equipment_rental_type', { + id: serial('id').primaryKey(), + createdAt: timestamp('created_at').notNull().defaultNow(), + name: text('name').notNull(), + price: numeric('price', { precision: 10, scale: 2 }).notNull(), + description: text('description'), +}); + +export const equipmentItem = pgTable('equipment_item', { + id: serial('id').primaryKey(), + createdAt: timestamp('created_at').notNull().defaultNow(), + equipmentType: integer('equipment_type').notNull().references(() => equipmentRentalType.id, { onUpdate: 'cascade' }), +}); + +export const equipmentRentals = pgTable('equipment_rentals', { + itemId: integer('item_id').notNull().references(() => equipmentItem.id, { onUpdate: 'cascade' }), + userId: text('user_id').references(() => users.id, { onUpdate: 'cascade', onDelete: 'set null' }), + dateBorrowed: date('date_borrowed').notNull().defaultNow(), + returnDate: date('return_date').notNull(), + price: numeric('price', { precision: 10, scale: 2 }).notNull(), + condition: equipmentConditionEnum('condition').notNull().default('ready'), +}, (table) => ({ + primaryKey: [table.userId, table.itemId], +})); + +export const blacklist = pgTable('blacklist', { + userId: text('user_id').primaryKey().references(() => users.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + reason: text('reason').notNull(), + dateBlacklisted: timestamp('date_blacklisted').notNull().defaultNow(), +}); + +export const urls = pgTable('urls', { + id: serial('id').primaryKey(), + originalUrl: text('original_url').notNull(), + shortUrl: text('short_url').notNull(), +}); + +export const events = pgTable('events', { + id: serial('id').primaryKey(), + createdAt: timestamp('created_at').notNull().defaultNow(), + name: text('name').notNull(), + location: text('location').notNull(), + startDate: date('start_date').notNull(), + endDate: date('end_date').notNull(), + description: text('description').notNull(), + urls: text('urls').array().notNull().default([]), + eventType: eventsEnum('event_type').notNull(), + eventCapacity: integer('event_capacity'), + image: text('image').notNull(), + startTime: time('start_time').notNull(), + endTime: time('end_time').notNull(), + tags: csFieldsEnum('tags').array().notNull().default([]), + targetAudience: targetAudienceEnum('target_audience'), + shortenedEventUrl: integer('shortened_event_url').references(() => urls.id, { onUpdate: 'cascade' }), +}); + +export const files = pgTable('files', { + key: text('key').primaryKey(), + name: text('name').notNull(), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const eventsFiles = pgTable('events_files', { + eventId: integer('event_id').notNull().references(() => events.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + fileKey: text('file_key').notNull().references(() => files.key, { onUpdate: 'cascade', onDelete: 'cascade' }), +}, (table) => ({ + primaryKey: [table.eventId, table.fileKey], +})); + +export const bookmarkedEvents = pgTable('bookmarked_events', { + userId: text('user_id').notNull().references(() => users.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + eventId: integer('event_id').notNull().references(() => events.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + bookmarkedDate: timestamp('bookmarked_date').notNull().defaultNow(), +}, (table) => ({ + primaryKey: [table.userId, table.eventId], +})); + +export const subscribedEvents = pgTable('subscribed_events', { + userId: text('user_id').notNull().references(() => users.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + eventId: integer('event_id').notNull().references(() => events.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + subscribedDate: timestamp('subscribed_date').notNull().defaultNow(), +}, (table) => ({ + primaryKey: [table.userId, table.eventId], +})); + +export const companies = pgTable('companies', { + id: serial('id').primaryKey(), + name: text('name').notNull(), + location: text('location'), + description: text('description').notNull(), + industryId: industryEnum('industry_id').notNull(), + logo: text('logo').references(() => files.key, { onUpdate: 'cascade' }), +}); + +export const eventCompanies = pgTable('event_companies', { + eventId: integer('event_id').notNull().references(() => events.id, { onDelete: 'cascade' }), + companyId: integer('company_id').notNull().references(() => companies.id, { onDelete: 'cascade' }), +}, (table) => ({ + primaryKey: [table.eventId, table.companyId], +})); + +export const subscribedCompanies = pgTable('subscribed_companies', { + userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), + companyId: integer('company_id').notNull().references(() => companies.id, { onDelete: 'cascade' }), + subscribedDate: timestamp('subscribed_date').notNull().defaultNow(), +}, (table) => ({ + primaryKey: [table.userId, table.companyId], +})); + +export const projects = pgTable('projects', { + id: serial('id').primaryKey(), + name: text('name').notNull(), + description: text('description').notNull(), + githubLink: text('github_link'), +}); + +export const projectsFiles = pgTable('projects_files', { + projectId: integer('project_id').notNull().references(() => projects.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + fileKey: text('file_key').notNull().references(() => files.key, { onUpdate: 'cascade', onDelete: 'cascade' }), +}, (table) => ({ + primaryKey: [table.projectId, table.fileKey], +})); + +export const interestedInProjects = pgTable('interested_in_projects', { + userId: text('user_id').notNull().references(() => users.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + projectId: integer('project_id').notNull().references(() => projects.id, { onUpdate: 'cascade', onDelete: 'cascade' }), +}, (table) => ({ + primaryKey: [table.userId, table.projectId], +})); + +export const officers = pgTable('officers', { + id: serial('id').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onUpdate: 'cascade', onDelete: 'cascade' }), + position: officerPositionEnum('position').notNull(), + linkedin: text('linkedin'), + photo: text('photo').references(() => files.key, { onUpdate: 'cascade' }), +}); + +// Types +export type User = typeof users.$inferSelect; +export type NewUser = typeof users.$inferInsert; +export type Project = typeof projects.$inferSelect; +export type NewProject = typeof projects.$inferInsert; +export type EquipmentRentalType = typeof equipmentRentalType.$inferSelect; +export type NewEquipmentRentalType = typeof equipmentRentalType.$inferInsert; +export type EquipmentItem = typeof equipmentItem.$inferSelect; +export type NewEquipmentItem = typeof equipmentItem.$inferInsert; +export type EquipmentRental = typeof equipmentRentals.$inferSelect; +export type NewEquipmentRental = typeof equipmentRentals.$inferInsert; +export type Blacklist = typeof blacklist.$inferSelect; +export type NewBlacklist = typeof blacklist.$inferInsert; +export type Url = typeof urls.$inferSelect; +export type NewUrl = typeof urls.$inferInsert; +export type Event = typeof events.$inferSelect; +export type NewEvent = typeof events.$inferInsert; +export type File = typeof files.$inferSelect; +export type NewFile = typeof files.$inferInsert; +export type EventFile = typeof eventsFiles.$inferSelect; +export type NewEventFile = typeof eventsFiles.$inferInsert; +export type BookmarkedEvent = typeof bookmarkedEvents.$inferSelect; +export type NewBookmarkedEvent = typeof bookmarkedEvents.$inferInsert; +export type SubscribedEvent = typeof subscribedEvents.$inferSelect; +export type NewSubscribedEvent = typeof subscribedEvents.$inferInsert; +export type Company = typeof companies.$inferSelect; +export type NewCompany = typeof companies.$inferInsert; +export type EventCompany = typeof eventCompanies.$inferSelect; +export type NewEventCompany = typeof eventCompanies.$inferInsert; +export type SubscribedCompany = typeof subscribedCompanies.$inferSelect; +export type NewSubscribedCompany = typeof subscribedCompanies.$inferInsert; +export type ProjectFile = typeof projectsFiles.$inferSelect; +export type NewProjectFile = typeof projectsFiles.$inferInsert; +export type InterestedInProject = typeof interestedInProjects.$inferSelect; +export type NewInterestedInProject = typeof interestedInProjects.$inferInsert; +export type Officer = typeof officers.$inferSelect; +export type NewOfficer = typeof officers.$inferInsert; +export type Major = typeof majors.$inferSelect; +export type NewMajor = typeof majors.$inferInsert; +export type Session = typeof session.$inferSelect; +export type NewSession = typeof session.$inferInsert; +export type UserKey = typeof userKey.$inferSelect; +export type NewUserKey = typeof userKey.$inferInsert; diff --git a/server/src/router/v1/v1.router.ts b/server/src/router/v1/v1.router.ts index 3b2d2b8..669ea19 100644 --- a/server/src/router/v1/v1.router.ts +++ b/server/src/router/v1/v1.router.ts @@ -1,8 +1,24 @@ import { Hono } from 'hono'; +import { db } from '../../db/db'; +import { users, projects } from '../../db/schema'; +import type { User, Project } from '../../db/schema'; const v1App = new Hono(); // Users -v1App.get('/users', c => c.json({})); +v1App.get('/users', async c => { + const foundUsers: User[] = await db.select().from(users); + return c.json({ + users: foundUsers, + }); +}); + +// Projects +v1App.get('/projects', async c => { + const foundProjects: Project[] = await db.select().from(projects); + return c.json({ + projects: foundProjects, + }); +}); export default v1App;