diff --git a/.env.example b/.env.example index 14d5bda..af3e33d 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,2 @@ -MONGO_URL="" -PUBLIC_SUPABASE_URL="" -PUBLIC_SUPABASE_ANON_KEY="" \ No newline at end of file +PUBLIC_SUPABASE_URL="your-supabase-project-url" +PUBLIC_SUPABASE_ANON_KEY="your-supabase-anon-key" \ No newline at end of file diff --git a/README.md b/README.md index 3a7f147..67952d8 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ You can preview the production build with `npm run preview`. The app is hosted on [Netlify](https://www.netlify.com/) at [pokedex.jcreek.co.uk](https://pokedex.jcreek.co.uk/). -The Pokédex data is stored in a [MongoDB](https://www.mongodb.com/) database hosted on [MongoDB Cloud](https://cloud.mongodb.com/). +The Pokédex data is stored in a [Supabase](https://supabase.com/) database. User authentication is handled by [Supabase Auth](https://supabase.com/auth). diff --git a/package-lock.json b/package-lock.json index 65adac6..ada4cc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "dependencies": { "@supabase/ssr": "^0.1.0", "@supabase/supabase-js": "^2.42.0", - "mongoose": "^8.0.3", "nanoid": "^5.0.4" }, "devDependencies": { @@ -2661,14 +2660,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", - "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3406,19 +3397,6 @@ "dev": true, "peer": true }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" - }, - "node_modules/@types/whatwg-url": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", - "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -4207,14 +4185,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bson": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.6.0.tgz", - "integrity": "sha512-BVINv2SgcMjL4oYbBuCQTpE3/VKOSxrOA8Cj/wQP7izSzlBGVomdm+TcUd0Pzy0ytLSSDweCKQ6X3f5veM5LQA==", - "engines": { - "node": ">=16.20.1" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -4697,6 +4667,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -6698,14 +6669,6 @@ "node": ">=0.10.0" } }, - "node_modules/kareem": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.0.tgz", - "integrity": "sha512-B9wwgyKKKZkxYZXQzefvb/Ykh9eHixxR+ttTP2c/Pq8NvHi1iYIAImf3nj/DXkPcnenjGEffhPWXnCFRIbNAhw==", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -6877,11 +6840,6 @@ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7006,105 +6964,6 @@ "ufo": "^1.3.2" } }, - "node_modules/mongodb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", - "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.4.0", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", - "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^13.0.0" - } - }, - "node_modules/mongoose": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.0.tgz", - "integrity": "sha512-Y5QNnuA38CEin8hnA+q//nUVztIi4Xklu9xlmbkd1KdWHnIlemSwf5IL/evcI+e2zplL4g5Y6PMkO+nPSAnIdA==", - "dependencies": { - "bson": "^6.5.0", - "kareem": "2.6.0", - "mongodb": "6.5.0", - "mpath": "0.9.0", - "mquery": "5.0.0", - "ms": "2.1.3", - "sift": "16.0.1" - }, - "engines": { - "node": ">=16.20.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mongoose/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", - "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -7126,7 +6985,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/mz": { "version": "2.7.0", @@ -7903,6 +7763,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -8464,11 +8325,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sift": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" - }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -8659,14 +8515,6 @@ "dev": true, "peer": true }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "dependencies": { - "memory-pager": "^1.0.2" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -9453,17 +9301,6 @@ "node": ">=6" } }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -10365,26 +10202,6 @@ } } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 77633d9..4a5c677 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,6 @@ "dependencies": { "@supabase/ssr": "^0.1.0", "@supabase/supabase-js": "^2.42.0", - "mongoose": "^8.0.3", "nanoid": "^5.0.4" }, "engines": { diff --git a/src/lib/models/PokedexMetadata.ts b/src/lib/models/PokedexMetadata.ts deleted file mode 100644 index 8b5960c..0000000 --- a/src/lib/models/PokedexMetadata.ts +++ /dev/null @@ -1,14 +0,0 @@ -import mongoose, { Schema, Document } from 'mongoose'; - -export interface PokedexMetadata extends Document { - lastModified: Date; -} - -const pokedexMetadataSchema = new Schema({ - lastModified: { - type: Date, - default: Date.now - } -}); - -export default mongoose.model('PokedexMetadata', pokedexMetadataSchema); diff --git a/src/lib/models/RegionGameMapping.ts b/src/lib/models/RegionGameMapping.ts index 55a42ff..2bebeed 100644 --- a/src/lib/models/RegionGameMapping.ts +++ b/src/lib/models/RegionGameMapping.ts @@ -1,13 +1,13 @@ -import mongoose, { Schema, Document } from 'mongoose'; - -export interface RegionGameMapping extends Document { +// Supabase-based RegionGameMapping interface +export interface RegionGameMapping { + id?: number; region: string; - games: string[]; + game: string; // Note: Different from MongoDB version which had 'games' array } -const regionGameMappingSchema = new Schema({ - region: String, - games: Array -}); - -export default mongoose.model('RegionGameMapping', regionGameMappingSchema); +// Database record type for Supabase +export interface RegionGameMappingDB { + id: number; + region: string; + game: string; +} diff --git a/src/lib/models/User.ts b/src/lib/models/User.ts deleted file mode 100644 index 08dedca..0000000 --- a/src/lib/models/User.ts +++ /dev/null @@ -1,13 +0,0 @@ -import mongoose, { Schema, Document } from 'mongoose'; - -export interface User extends Document { - username: string; - // Add other user-related fields as needed -} - -const userSchema = new Schema({ - username: String - // Add other user-related fields as needed -}); - -export default mongoose.model('User', userSchema); diff --git a/src/lib/models/UserCatchEntry.ts b/src/lib/models/UserCatchEntry.ts deleted file mode 100644 index aa0e41e..0000000 --- a/src/lib/models/UserCatchEntry.ts +++ /dev/null @@ -1,19 +0,0 @@ -import mongoose, { Schema, Document } from 'mongoose'; - -export interface UserCatchEntry extends Document { - userId: mongoose.Types.ObjectId; // Reference to the user - pokedexEntryId: mongoose.Types.ObjectId; // Reference to the pokedex entry - haveToEvolve: boolean; - caught: boolean; - inHome: boolean; -} - -const userCatchEntrySchema = new Schema({ - userId: { type: mongoose.Types.ObjectId, ref: 'User' }, - pokedexEntryId: { type: mongoose.Types.ObjectId, ref: 'PokedexEntry' }, - haveToEvolve: Boolean, - caught: Boolean, - inHome: Boolean -}); - -export default mongoose.model('UserCatchEntry', userCatchEntrySchema); diff --git a/src/lib/utils/db.ts b/src/lib/utils/db.ts deleted file mode 100644 index 6da47bd..0000000 --- a/src/lib/utils/db.ts +++ /dev/null @@ -1,48 +0,0 @@ -import mongoose from 'mongoose'; -import { getEnv } from '$lib/utils/env'; -const env = getEnv(); - -/* - 0 - disconnected - 1 - connected - 2 - connecting - 3 - disconnecting - 4 - uninitialized -*/ -let mongoConnectionState = 0; - -export const dbConnect = async () => { - if (mongoConnectionState === 1) { - console.log('Connection already established'); - return; - } - - if (mongoose.connections.length > 0) { - mongoConnectionState = mongoose.connections[0].readyState; - if (mongoConnectionState === 1) { - console.log('Using existing connection'); - return; - } - } - - try { - await mongoose.connect(env.MONGO_URL, { - serverApi: { version: '1', strict: true, deprecationErrors: true } - }); - await mongoose.connection.db.admin().command({ ping: 1 }); - console.log('Pinged your deployment. You successfully connected to MongoDB!'); - mongoConnectionState = 1; - } catch (error) { - console.error('Error connecting to MongoDB:', error); - mongoConnectionState = 0; - } -}; - -export const dbDisconnect = async () => { - if (process.env.NODE_ENV === 'development') return; - if (mongoConnectionState === 0) return; - - await mongoose.disconnect(); - mongoConnectionState = 0; - console.log('disconnected from mongodb'); -}; diff --git a/src/lib/utils/env.ts b/src/lib/utils/env.ts index f8509e4..b207381 100644 --- a/src/lib/utils/env.ts +++ b/src/lib/utils/env.ts @@ -1,7 +1,3 @@ export function getEnv() { - return process.env.hasOwnProperty('MONGO_URL') - ? process.env - : { - MONGO_URL: import.meta.env.VITE_MONGO_URL - }; + return process.env; } diff --git a/src/routes/api/pokedex-metadata/+server.ts b/src/routes/api/pokedex-metadata/+server.ts deleted file mode 100644 index bcc4a26..0000000 --- a/src/routes/api/pokedex-metadata/+server.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { json } from '@sveltejs/kit'; -import { dbConnect, dbDisconnect } from '$lib/utils/db'; -import PokedexMetadataModel from '$lib/models/PokedexMetadata'; - -export const GET = async () => { - await dbConnect(); - - const metadata = await PokedexMetadataModel.findOne(); - await dbDisconnect(); - - if (metadata) { - return json({ lastModified: metadata.lastModified }); - } else { - return json({ message: 'Metadata not found' }, { status: 404 }); - } -}; diff --git a/src/routes/api/seed/+server.ts b/src/routes/api/seed/+server.ts deleted file mode 100644 index d00b210..0000000 --- a/src/routes/api/seed/+server.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { json } from '@sveltejs/kit'; -import { dbConnect, dbDisconnect } from '$lib/utils/db'; -import PokedexEntryModel from '$lib/models/PokedexEntry'; -import PokedexEntryRepository from '$lib/repositories/PokedexEntryRepository'; -import RegionGameMapping from '$lib/models/RegionGameMapping'; -import RegionGameMappingRepository from '$lib/repositories/RegionGameMappingRepository'; -import PokedexMetadataModel from '$lib/models/PokedexMetadata'; -import dex from '$lib/helpers/pokedex.json'; -import RegionGameMappingJson from '$lib/helpers/region-game-mapping.json'; - -// Function to update the lastModified field in the metadata collection -const updateLastModified = async () => { - const metadata = await PokedexMetadataModel.findOne(); - if (metadata) { - metadata.lastModified = new Date(); - await metadata.save(); - } else { - await PokedexMetadataModel.create({ lastModified: new Date() }); - } -}; - -// Seed Pokedex data -export const GET = async () => { - // Immediately return if not in development to prevent seeding extra data - return; - - await dbConnect() - .then(async () => { - // Create pokedex entries - const repo = new PokedexEntryRepository(); - - dex.forEach(async (pokemon: PokedexEntryModel) => { - await repo.create(pokemon); - console.log(`Seeded ${pokemon.pokedexNumber} ${pokemon.pokemon} ${pokemon.form}`); - }); - - // Create region-game mappings - const regionGameMappingRepository = new RegionGameMappingRepository(); - await regionGameMappingRepository.create(RegionGameMappingJson as RegionGameMapping[]); - - // Update the lastModified field after seeding - await updateLastModified(); - }) - .finally(() => dbDisconnect()); - - return json({ - message: 'seeded' - }); -};