add mongodb; store refresh token
This commit is contained in:
		
							parent
							
								
									090a585a92
								
							
						
					
					
						commit
						933e6a85b2
					
				| @ -1,8 +1,7 @@ | |||||||
| import spotifyApi from "spotify-api.js"; |  | ||||||
| const { Client, Player } = spotifyApi; |  | ||||||
| import { store } from "../store.mjs"; | import { store } from "../store.mjs"; | ||||||
| import { randomString } from "../lib/randomString.js"; | import { randomString } from "../lib/randomString.mjs"; | ||||||
| import axios from "axios"; | import { UserStore } from "../db/schemas.mjs"; | ||||||
|  | import { createLocalUser, findUserBySpotifyId } from "../lib/helpers.mjs"; | ||||||
| 
 | 
 | ||||||
| export const applyAuthRoutes = (router) => { | export const applyAuthRoutes = (router) => { | ||||||
| 
 | 
 | ||||||
| @ -14,44 +13,36 @@ export const applyAuthRoutes = (router) => { | |||||||
|     } |     } | ||||||
|     const { code, state } = req.body; |     const { code, state } = req.body; | ||||||
|     try { |     try { | ||||||
|       const params = new URLSearchParams(); |       const newUser = await createLocalUser({ code }); | ||||||
|       params.append('grant_type', 'authorization_code'); |       const user = await findUserBySpotifyId({ userId: newUser.client.user.id }); | ||||||
|       params.append('code', code); |  | ||||||
|       params.append('redirect_uri', store.redirectURL); |  | ||||||
| 
 | 
 | ||||||
|       const config = { |  | ||||||
|         headers: { |  | ||||||
|           'Authorization': 'Basic ' + (new Buffer(store.clientID + ':' + store.clientSecret).toString('base64')), |  | ||||||
|           'Content-Type': 'application/x-www-form-urlencoded', |  | ||||||
|         } |  | ||||||
|       }; |  | ||||||
| 
 |  | ||||||
|       const tokens = (await axios.post('https://accounts.spotify.com/api/token', params, config))?.data; |  | ||||||
| 
 |  | ||||||
|       const newClient = await Client.create({ |  | ||||||
|         refreshToken: true, |  | ||||||
|         retryOnRateLimit: true, |  | ||||||
|         token: { |  | ||||||
|           clientID: store.clientID, |  | ||||||
|           clientSecret: store.clientSecret, |  | ||||||
|           redirectURL: store.redirectURL, |  | ||||||
|           refreshToken: tokens.refresh_token, |  | ||||||
|         }, |  | ||||||
|       }); |  | ||||||
|       const player = new Player(newClient); |  | ||||||
|       const accessToken = randomString(64); |  | ||||||
|       const user = store.users.find(({ client }) => client.user.id === newClient.user.id); |  | ||||||
|       if (user) { |       if (user) { | ||||||
|         user.client = newClient; |         user.client = newUser.client; | ||||||
|         user.player = player; |         user.player = newUser.client; | ||||||
|         user.accessToken = accessToken; |  | ||||||
|       } else { |       } else { | ||||||
|         store.users.push({ client: newClient, player, accessToken, listeners: [], role: 'none' }); |         store.users.push(newUser); | ||||||
|       } |       } | ||||||
|  | 
 | ||||||
|  |       const accessToken = randomString(64); | ||||||
|  | 
 | ||||||
|  |       const userStore = await UserStore.findOneAndUpdate( | ||||||
|  |         { 'spotify.userId': newUser.client.user.id }, | ||||||
|  |         { | ||||||
|  |           accessToken, | ||||||
|  |           role: 'none', | ||||||
|  |           spotify: { | ||||||
|  |             refreshToken: newUser.client.refreshMeta.refreshToken, | ||||||
|  |             userId: newUser.client.user.id, | ||||||
|  |             local: true, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |         { upsert: true }, | ||||||
|  |       ); | ||||||
|  | 
 | ||||||
|       res.status(200); |       res.status(200); | ||||||
|       res.send({ message: 'authorized', accessToken }); |       res.send({ message: 'authorized', accessToken }); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|       console.log(e.message); |       console.log(e); | ||||||
|       res.status(500); |       res.status(500); | ||||||
|       res.send({ message: 'unauthorized' }); |       res.send({ message: 'unauthorized' }); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| import { store } from "../store.mjs"; | import { store } from "../store.mjs"; | ||||||
|  | import { UserStore } from "../db/schemas.mjs"; | ||||||
| 
 | 
 | ||||||
| export const applyUserRoutes = (router) => { | export const applyUserRoutes = (router) => { | ||||||
| 
 | 
 | ||||||
| @ -42,7 +43,7 @@ export const applyUserRoutes = (router) => { | |||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   router.get('/user/currentlyPlaying', async (req, res) => { |   router.get('/user/currentlyPlaying', async (req, res) => { | ||||||
|     const currentlyPlaying = await res.locals.user.player?.getCurrentlyPlaying('track'); |     const currentlyPlaying = await (await res.locals.user.spotify.local)?.player?.getCurrentlyPlaying('track'); | ||||||
|     res.status(200); |     res.status(200); | ||||||
|     res.send({ currentlyPlaying }); |     res.send({ currentlyPlaying }); | ||||||
|   }); |   }); | ||||||
| @ -83,14 +84,20 @@ export const applyUserRoutesPublic = (router) => { | |||||||
|       res.send({ message: 'userId is missing' }); |       res.send({ message: 'userId is missing' }); | ||||||
|     } |     } | ||||||
|     const { userId } = req.params; |     const { userId } = req.params; | ||||||
|     const host = store.users.find(({ client }) => client.user.id === userId); |     const hostDB = await UserStore.findOne().bySpotifyId(userId); | ||||||
|     if (!host?.player) { |     if (!hostDB) { | ||||||
|       res.status(400); |       res.status(400); | ||||||
|       res.send({ message: 'user is not registered' }); |       res.send({ message: 'user is not registered' }); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|  |     const host = await hostDB?.spotify?.local; | ||||||
|  |     if (!host.player) { | ||||||
|  |       res.status(500); | ||||||
|  |       res.send({ message: 'user is outdated' }); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|     try { |     try { | ||||||
|       const currentlyPlaying = await host?.player?.getCurrentlyPlaying('track'); |       const currentlyPlaying = await host.player.getCurrentlyPlaying('track'); | ||||||
|       res.status(200); |       res.status(200); | ||||||
|       res.send({ |       res.send({ | ||||||
|         currentlyPlaying, |         currentlyPlaying, | ||||||
|  | |||||||
							
								
								
									
										33
									
								
								backend/db/schemas.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								backend/db/schemas.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | import mongoose, { model } from "mongoose"; | ||||||
|  | const { Schema } = mongoose; | ||||||
|  | import { findUserBySpotifyId } from "../lib/helpers.mjs"; | ||||||
|  | 
 | ||||||
|  | const userSchema = new Schema({ | ||||||
|  |   accessToken: String, | ||||||
|  |   role: String, | ||||||
|  |   spotify: { | ||||||
|  |     refreshToken: String, | ||||||
|  |     userId: String, | ||||||
|  |     local: { | ||||||
|  |       type: Boolean, | ||||||
|  |       async get(local) { | ||||||
|  |         if (!local) return false; | ||||||
|  |         return await findUserBySpotifyId({ | ||||||
|  |           userId: this.spotify.userId, | ||||||
|  |           refreshToken: this.spotify.refreshToken, | ||||||
|  |         }, { create: true }); | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }, { | ||||||
|  |   query: { | ||||||
|  |     bySpotifyId(id) { | ||||||
|  |       return this.where({ 'spotify.userId': id }); | ||||||
|  |     }, | ||||||
|  |     byAccessToken(accessToken) { | ||||||
|  |       return this.where({ accessToken }); | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | export const UserStore = model('User', userSchema); | ||||||
| @ -3,6 +3,8 @@ import { auth } from "./middlewares/auth.mjs"; | |||||||
| 
 | 
 | ||||||
| import { applyAuthRoutes } from "./api/auth.mjs"; | import { applyAuthRoutes } from "./api/auth.mjs"; | ||||||
| import { applyApiRoutes, applyPublicRoutes } from "./api/index.mjs"; | import { applyApiRoutes, applyPublicRoutes } from "./api/index.mjs"; | ||||||
|  | import mongoose from "mongoose"; | ||||||
|  | import { store } from "./store.mjs"; | ||||||
| 
 | 
 | ||||||
| // express server
 | // express server
 | ||||||
| const port = 3000; | const port = 3000; | ||||||
| @ -28,5 +30,8 @@ applyApiRoutes(router); | |||||||
| 
 | 
 | ||||||
| applyPublicRoutes(publicRouter); | applyPublicRoutes(publicRouter); | ||||||
| 
 | 
 | ||||||
|  | await mongoose.connect(store.mongodbConnstring); | ||||||
|  | console.log('mongodb connected'); | ||||||
|  | 
 | ||||||
| app.listen(port); | app.listen(port); | ||||||
| console.log('ready'); | console.log('express started'); | ||||||
|  | |||||||
							
								
								
									
										37
									
								
								backend/lib/helpers.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								backend/lib/helpers.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | import { Client, Player } from "spotify-api.js"; | ||||||
|  | import { store } from "../store.mjs"; | ||||||
|  | import { UserStore } from "../db/schemas.mjs"; | ||||||
|  | 
 | ||||||
|  | export const createLocalUser = async ({ refreshToken = undefined, code = undefined }) => { | ||||||
|  |   const client = await Client.create({ | ||||||
|  |     refreshToken: true, | ||||||
|  |     retryOnRateLimit: true, | ||||||
|  |     token: { | ||||||
|  |       clientID: store.clientID, | ||||||
|  |       clientSecret: store.clientSecret, | ||||||
|  |       redirectURL: store.redirectURL, | ||||||
|  |       refreshToken, | ||||||
|  |       code, | ||||||
|  |     }, | ||||||
|  |     async onRefresh() { | ||||||
|  |       await UserStore.findOneAndUpdate( | ||||||
|  |         { 'spotify.userId': client.user.id }, | ||||||
|  |         { spotify: { refreshToken: client.refreshMeta.refreshToken } } | ||||||
|  |       ); | ||||||
|  |     }, | ||||||
|  |   }); | ||||||
|  |   const player = new Player(client); | ||||||
|  |   return { client, player }; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export const findUserBySpotifyId = async ( | ||||||
|  |   { userId, refreshToken }, | ||||||
|  |   { create = false } = {}, | ||||||
|  | ) => { | ||||||
|  |   const user = store.users.find(user => user.client.user.id === userId); | ||||||
|  |   if (user) return user; | ||||||
|  |   if (!create) return null; | ||||||
|  |   const newUser = await createLocalUser({ refreshToken }); | ||||||
|  |   store.users.push(newUser); | ||||||
|  |   return newUser; | ||||||
|  | } | ||||||
| @ -1,11 +1,14 @@ | |||||||
| import { store } from "../store.mjs"; | import { UserStore } from "../db/schemas.mjs"; | ||||||
|  | 
 | ||||||
|  | export const auth = async (req, res, next) => { | ||||||
| 
 | 
 | ||||||
| export const auth = (req, res, next) => { |  | ||||||
|   const accessToken = req.headers['access-token']; |   const accessToken = req.headers['access-token']; | ||||||
|   res.locals.user = store.users.find(user => user.accessToken === accessToken); |   res.locals.user = await UserStore.findOne().byAccessToken(accessToken); | ||||||
|   if (!res.locals.user) { |   if (!res.locals.user) { | ||||||
|     res.status(401); |     res.status(401); | ||||||
|     res.send({ message: 'unauthorized' }); |     res.send({ message: 'unauthorized' }); | ||||||
|  |     return; | ||||||
|   } |   } | ||||||
|   else next(); |   console.log('middleware', res.locals.user, await res.locals.user.spotify.local); | ||||||
|  |   next(); | ||||||
| }; | }; | ||||||
|  | |||||||
							
								
								
									
										496
									
								
								backend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										496
									
								
								backend/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -11,9 +11,29 @@ | |||||||
|         "axios": "^0.27.2", |         "axios": "^0.27.2", | ||||||
|         "dotenv": "^16.0.3", |         "dotenv": "^16.0.3", | ||||||
|         "express": "^4.18.1", |         "express": "^4.18.1", | ||||||
|  |         "mongoose": "^6.6.3", | ||||||
|         "spotify-api.js": "^9.2.3" |         "spotify-api.js": "^9.2.3" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@types/node": { | ||||||
|  |       "version": "18.7.23", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", | ||||||
|  |       "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==" | ||||||
|  |     }, | ||||||
|  |     "node_modules/@types/webidl-conversions": { | ||||||
|  |       "version": "7.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", | ||||||
|  |       "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" | ||||||
|  |     }, | ||||||
|  |     "node_modules/@types/whatwg-url": { | ||||||
|  |       "version": "8.2.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", | ||||||
|  |       "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@types/node": "*", | ||||||
|  |         "@types/webidl-conversions": "*" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/accepts": { |     "node_modules/accepts": { | ||||||
|       "version": "1.3.8", |       "version": "1.3.8", | ||||||
|       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", |       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", | ||||||
| @ -45,6 +65,25 @@ | |||||||
|         "form-data": "^4.0.0" |         "form-data": "^4.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/base64-js": { | ||||||
|  |       "version": "1.5.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | ||||||
|  |       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", | ||||||
|  |       "funding": [ | ||||||
|  |         { | ||||||
|  |           "type": "github", | ||||||
|  |           "url": "https://github.com/sponsors/feross" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "patreon", | ||||||
|  |           "url": "https://www.patreon.com/feross" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "consulting", | ||||||
|  |           "url": "https://feross.org/support" | ||||||
|  |         } | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|     "node_modules/body-parser": { |     "node_modules/body-parser": { | ||||||
|       "version": "1.20.0", |       "version": "1.20.0", | ||||||
|       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", |       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", | ||||||
| @ -68,6 +107,40 @@ | |||||||
|         "npm": "1.2.8000 || >= 1.4.16" |         "npm": "1.2.8000 || >= 1.4.16" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/bson": { | ||||||
|  |       "version": "4.7.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", | ||||||
|  |       "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "buffer": "^5.6.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=6.9.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/buffer": { | ||||||
|  |       "version": "5.7.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", | ||||||
|  |       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", | ||||||
|  |       "funding": [ | ||||||
|  |         { | ||||||
|  |           "type": "github", | ||||||
|  |           "url": "https://github.com/sponsors/feross" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "patreon", | ||||||
|  |           "url": "https://www.patreon.com/feross" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "consulting", | ||||||
|  |           "url": "https://feross.org/support" | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|  |       "dependencies": { | ||||||
|  |         "base64-js": "^1.3.1", | ||||||
|  |         "ieee754": "^1.1.13" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/bytes": { |     "node_modules/bytes": { | ||||||
|       "version": "3.1.2", |       "version": "3.1.2", | ||||||
|       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", |       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", | ||||||
| @ -147,6 +220,14 @@ | |||||||
|         "node": ">=0.4.0" |         "node": ">=0.4.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/denque": { | ||||||
|  |       "version": "2.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", | ||||||
|  |       "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=0.10" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/depd": { |     "node_modules/depd": { | ||||||
|       "version": "2.0.0", |       "version": "2.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", | ||||||
| @ -370,11 +451,35 @@ | |||||||
|         "node": ">=0.10.0" |         "node": ">=0.10.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/ieee754": { | ||||||
|  |       "version": "1.2.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", | ||||||
|  |       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", | ||||||
|  |       "funding": [ | ||||||
|  |         { | ||||||
|  |           "type": "github", | ||||||
|  |           "url": "https://github.com/sponsors/feross" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "patreon", | ||||||
|  |           "url": "https://www.patreon.com/feross" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "consulting", | ||||||
|  |           "url": "https://feross.org/support" | ||||||
|  |         } | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|     "node_modules/inherits": { |     "node_modules/inherits": { | ||||||
|       "version": "2.0.4", |       "version": "2.0.4", | ||||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", |       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" |       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/ip": { | ||||||
|  |       "version": "2.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", | ||||||
|  |       "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" | ||||||
|  |     }, | ||||||
|     "node_modules/ipaddr.js": { |     "node_modules/ipaddr.js": { | ||||||
|       "version": "1.9.1", |       "version": "1.9.1", | ||||||
|       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", |       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", | ||||||
| @ -383,6 +488,11 @@ | |||||||
|         "node": ">= 0.10" |         "node": ">= 0.10" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/kareem": { | ||||||
|  |       "version": "2.4.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", | ||||||
|  |       "integrity": "sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==" | ||||||
|  |     }, | ||||||
|     "node_modules/media-typer": { |     "node_modules/media-typer": { | ||||||
|       "version": "0.3.0", |       "version": "0.3.0", | ||||||
|       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", |       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | ||||||
| @ -391,6 +501,12 @@ | |||||||
|         "node": ">= 0.6" |         "node": ">= 0.6" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "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==", | ||||||
|  |       "optional": true | ||||||
|  |     }, | ||||||
|     "node_modules/merge-descriptors": { |     "node_modules/merge-descriptors": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", | ||||||
| @ -434,6 +550,98 @@ | |||||||
|         "node": ">= 0.6" |         "node": ">= 0.6" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/mongodb": { | ||||||
|  |       "version": "4.9.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", | ||||||
|  |       "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "bson": "^4.7.0", | ||||||
|  |         "denque": "^2.1.0", | ||||||
|  |         "mongodb-connection-string-url": "^2.5.3", | ||||||
|  |         "socks": "^2.7.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12.9.0" | ||||||
|  |       }, | ||||||
|  |       "optionalDependencies": { | ||||||
|  |         "saslprep": "^1.0.3" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/mongodb-connection-string-url": { | ||||||
|  |       "version": "2.5.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", | ||||||
|  |       "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@types/whatwg-url": "^8.2.1", | ||||||
|  |         "whatwg-url": "^11.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/mongoose": { | ||||||
|  |       "version": "6.6.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.6.3.tgz", | ||||||
|  |       "integrity": "sha512-2Ye018PNBBXJd717qhfjBGo7k8HQb/pKziO9d5wY14iZSUI7hxqL7bwNDg+poeBwnlhBYLncZkips15Blfgxbw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "bson": "^4.6.5", | ||||||
|  |         "kareem": "2.4.1", | ||||||
|  |         "mongodb": "4.9.1", | ||||||
|  |         "mpath": "0.9.0", | ||||||
|  |         "mquery": "4.0.3", | ||||||
|  |         "ms": "2.1.3", | ||||||
|  |         "sift": "16.0.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12.0.0" | ||||||
|  |       }, | ||||||
|  |       "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": "4.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", | ||||||
|  |       "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "debug": "4.x" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/mquery/node_modules/debug": { | ||||||
|  |       "version": "4.3.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", | ||||||
|  |       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "ms": "2.1.2" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=6.0" | ||||||
|  |       }, | ||||||
|  |       "peerDependenciesMeta": { | ||||||
|  |         "supports-color": { | ||||||
|  |           "optional": true | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/mquery/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==" | ||||||
|  |     }, | ||||||
|     "node_modules/ms": { |     "node_modules/ms": { | ||||||
|       "version": "2.0.0", |       "version": "2.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||||||
| @ -491,6 +699,14 @@ | |||||||
|         "node": ">= 0.10" |         "node": ">= 0.10" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/punycode": { | ||||||
|  |       "version": "2.1.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||||
|  |       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=6" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/qs": { |     "node_modules/qs": { | ||||||
|       "version": "6.10.3", |       "version": "6.10.3", | ||||||
|       "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", |       "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", | ||||||
| @ -551,6 +767,18 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | ||||||
|       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" |       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/saslprep": { | ||||||
|  |       "version": "1.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", | ||||||
|  |       "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", | ||||||
|  |       "optional": true, | ||||||
|  |       "dependencies": { | ||||||
|  |         "sparse-bitfield": "^3.0.3" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=6" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/send": { |     "node_modules/send": { | ||||||
|       "version": "0.18.0", |       "version": "0.18.0", | ||||||
|       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", |       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", | ||||||
| @ -611,6 +839,42 @@ | |||||||
|         "url": "https://github.com/sponsors/ljharb" |         "url": "https://github.com/sponsors/ljharb" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/sift": { | ||||||
|  |       "version": "16.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", | ||||||
|  |       "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" | ||||||
|  |     }, | ||||||
|  |     "node_modules/smart-buffer": { | ||||||
|  |       "version": "4.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", | ||||||
|  |       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 6.0.0", | ||||||
|  |         "npm": ">= 3.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/socks": { | ||||||
|  |       "version": "2.7.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", | ||||||
|  |       "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "ip": "^2.0.0", | ||||||
|  |         "smart-buffer": "^4.2.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 10.13.0", | ||||||
|  |         "npm": ">= 3.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "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==", | ||||||
|  |       "optional": true, | ||||||
|  |       "dependencies": { | ||||||
|  |         "memory-pager": "^1.0.2" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/spotify-api.js": { |     "node_modules/spotify-api.js": { | ||||||
|       "version": "9.2.3", |       "version": "9.2.3", | ||||||
|       "resolved": "https://registry.npmjs.org/spotify-api.js/-/spotify-api.js-9.2.3.tgz", |       "resolved": "https://registry.npmjs.org/spotify-api.js/-/spotify-api.js-9.2.3.tgz", | ||||||
| @ -641,6 +905,17 @@ | |||||||
|         "node": ">=0.6" |         "node": ">=0.6" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/tr46": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "punycode": "^2.1.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/type-is": { |     "node_modules/type-is": { | ||||||
|       "version": "1.6.18", |       "version": "1.6.18", | ||||||
|       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", |       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", | ||||||
| @ -676,9 +951,48 @@ | |||||||
|       "engines": { |       "engines": { | ||||||
|         "node": ">= 0.8" |         "node": ">= 0.8" | ||||||
|       } |       } | ||||||
|  |     }, | ||||||
|  |     "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": "11.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", | ||||||
|  |       "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "tr46": "^3.0.0", | ||||||
|  |         "webidl-conversions": "^7.0.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|  |     "@types/node": { | ||||||
|  |       "version": "18.7.23", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", | ||||||
|  |       "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==" | ||||||
|  |     }, | ||||||
|  |     "@types/webidl-conversions": { | ||||||
|  |       "version": "7.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", | ||||||
|  |       "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" | ||||||
|  |     }, | ||||||
|  |     "@types/whatwg-url": { | ||||||
|  |       "version": "8.2.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", | ||||||
|  |       "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", | ||||||
|  |       "requires": { | ||||||
|  |         "@types/node": "*", | ||||||
|  |         "@types/webidl-conversions": "*" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "accepts": { |     "accepts": { | ||||||
|       "version": "1.3.8", |       "version": "1.3.8", | ||||||
|       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", |       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", | ||||||
| @ -707,6 +1021,11 @@ | |||||||
|         "form-data": "^4.0.0" |         "form-data": "^4.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "base64-js": { | ||||||
|  |       "version": "1.5.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | ||||||
|  |       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" | ||||||
|  |     }, | ||||||
|     "body-parser": { |     "body-parser": { | ||||||
|       "version": "1.20.0", |       "version": "1.20.0", | ||||||
|       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", |       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", | ||||||
| @ -726,6 +1045,23 @@ | |||||||
|         "unpipe": "1.0.0" |         "unpipe": "1.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "bson": { | ||||||
|  |       "version": "4.7.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", | ||||||
|  |       "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", | ||||||
|  |       "requires": { | ||||||
|  |         "buffer": "^5.6.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "buffer": { | ||||||
|  |       "version": "5.7.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", | ||||||
|  |       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "base64-js": "^1.3.1", | ||||||
|  |         "ieee754": "^1.1.13" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "bytes": { |     "bytes": { | ||||||
|       "version": "3.1.2", |       "version": "3.1.2", | ||||||
|       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", |       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", | ||||||
| @ -784,6 +1120,11 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", |       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | ||||||
|       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" |       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" | ||||||
|     }, |     }, | ||||||
|  |     "denque": { | ||||||
|  |       "version": "2.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", | ||||||
|  |       "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" | ||||||
|  |     }, | ||||||
|     "depd": { |     "depd": { | ||||||
|       "version": "2.0.0", |       "version": "2.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", | ||||||
| @ -944,21 +1285,42 @@ | |||||||
|         "safer-buffer": ">= 2.1.2 < 3" |         "safer-buffer": ">= 2.1.2 < 3" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "ieee754": { | ||||||
|  |       "version": "1.2.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", | ||||||
|  |       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" | ||||||
|  |     }, | ||||||
|     "inherits": { |     "inherits": { | ||||||
|       "version": "2.0.4", |       "version": "2.0.4", | ||||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", |       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" |       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | ||||||
|     }, |     }, | ||||||
|  |     "ip": { | ||||||
|  |       "version": "2.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", | ||||||
|  |       "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" | ||||||
|  |     }, | ||||||
|     "ipaddr.js": { |     "ipaddr.js": { | ||||||
|       "version": "1.9.1", |       "version": "1.9.1", | ||||||
|       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", |       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", | ||||||
|       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" |       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" | ||||||
|     }, |     }, | ||||||
|  |     "kareem": { | ||||||
|  |       "version": "2.4.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", | ||||||
|  |       "integrity": "sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==" | ||||||
|  |     }, | ||||||
|     "media-typer": { |     "media-typer": { | ||||||
|       "version": "0.3.0", |       "version": "0.3.0", | ||||||
|       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", |       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | ||||||
|       "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" |       "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" | ||||||
|     }, |     }, | ||||||
|  |     "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==", | ||||||
|  |       "optional": true | ||||||
|  |     }, | ||||||
|     "merge-descriptors": { |     "merge-descriptors": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", | ||||||
| @ -987,6 +1349,76 @@ | |||||||
|         "mime-db": "1.52.0" |         "mime-db": "1.52.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "mongodb": { | ||||||
|  |       "version": "4.9.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", | ||||||
|  |       "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "bson": "^4.7.0", | ||||||
|  |         "denque": "^2.1.0", | ||||||
|  |         "mongodb-connection-string-url": "^2.5.3", | ||||||
|  |         "saslprep": "^1.0.3", | ||||||
|  |         "socks": "^2.7.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "mongodb-connection-string-url": { | ||||||
|  |       "version": "2.5.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", | ||||||
|  |       "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", | ||||||
|  |       "requires": { | ||||||
|  |         "@types/whatwg-url": "^8.2.1", | ||||||
|  |         "whatwg-url": "^11.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "mongoose": { | ||||||
|  |       "version": "6.6.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.6.3.tgz", | ||||||
|  |       "integrity": "sha512-2Ye018PNBBXJd717qhfjBGo7k8HQb/pKziO9d5wY14iZSUI7hxqL7bwNDg+poeBwnlhBYLncZkips15Blfgxbw==", | ||||||
|  |       "requires": { | ||||||
|  |         "bson": "^4.6.5", | ||||||
|  |         "kareem": "2.4.1", | ||||||
|  |         "mongodb": "4.9.1", | ||||||
|  |         "mpath": "0.9.0", | ||||||
|  |         "mquery": "4.0.3", | ||||||
|  |         "ms": "2.1.3", | ||||||
|  |         "sift": "16.0.0" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "ms": { | ||||||
|  |           "version": "2.1.3", | ||||||
|  |           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", | ||||||
|  |           "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "mpath": { | ||||||
|  |       "version": "0.9.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", | ||||||
|  |       "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" | ||||||
|  |     }, | ||||||
|  |     "mquery": { | ||||||
|  |       "version": "4.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", | ||||||
|  |       "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", | ||||||
|  |       "requires": { | ||||||
|  |         "debug": "4.x" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "debug": { | ||||||
|  |           "version": "4.3.4", | ||||||
|  |           "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", | ||||||
|  |           "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", | ||||||
|  |           "requires": { | ||||||
|  |             "ms": "2.1.2" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "ms": { | ||||||
|  |           "version": "2.1.2", | ||||||
|  |           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||||
|  |           "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "ms": { |     "ms": { | ||||||
|       "version": "2.0.0", |       "version": "2.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||||||
| @ -1029,6 +1461,11 @@ | |||||||
|         "ipaddr.js": "1.9.1" |         "ipaddr.js": "1.9.1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "punycode": { | ||||||
|  |       "version": "2.1.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||||
|  |       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" | ||||||
|  |     }, | ||||||
|     "qs": { |     "qs": { | ||||||
|       "version": "6.10.3", |       "version": "6.10.3", | ||||||
|       "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", |       "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", | ||||||
| @ -1063,6 +1500,15 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | ||||||
|       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" |       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | ||||||
|     }, |     }, | ||||||
|  |     "saslprep": { | ||||||
|  |       "version": "1.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", | ||||||
|  |       "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", | ||||||
|  |       "optional": true, | ||||||
|  |       "requires": { | ||||||
|  |         "sparse-bitfield": "^3.0.3" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "send": { |     "send": { | ||||||
|       "version": "0.18.0", |       "version": "0.18.0", | ||||||
|       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", |       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", | ||||||
| @ -1116,6 +1562,34 @@ | |||||||
|         "object-inspect": "^1.9.0" |         "object-inspect": "^1.9.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "sift": { | ||||||
|  |       "version": "16.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", | ||||||
|  |       "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" | ||||||
|  |     }, | ||||||
|  |     "smart-buffer": { | ||||||
|  |       "version": "4.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", | ||||||
|  |       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" | ||||||
|  |     }, | ||||||
|  |     "socks": { | ||||||
|  |       "version": "2.7.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", | ||||||
|  |       "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", | ||||||
|  |       "requires": { | ||||||
|  |         "ip": "^2.0.0", | ||||||
|  |         "smart-buffer": "^4.2.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "sparse-bitfield": { | ||||||
|  |       "version": "3.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", | ||||||
|  |       "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", | ||||||
|  |       "optional": true, | ||||||
|  |       "requires": { | ||||||
|  |         "memory-pager": "^1.0.2" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "spotify-api.js": { |     "spotify-api.js": { | ||||||
|       "version": "9.2.3", |       "version": "9.2.3", | ||||||
|       "resolved": "https://registry.npmjs.org/spotify-api.js/-/spotify-api.js-9.2.3.tgz", |       "resolved": "https://registry.npmjs.org/spotify-api.js/-/spotify-api.js-9.2.3.tgz", | ||||||
| @ -1140,6 +1614,14 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", | ||||||
|       "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" |       "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" | ||||||
|     }, |     }, | ||||||
|  |     "tr46": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", | ||||||
|  |       "requires": { | ||||||
|  |         "punycode": "^2.1.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "type-is": { |     "type-is": { | ||||||
|       "version": "1.6.18", |       "version": "1.6.18", | ||||||
|       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", |       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", | ||||||
| @ -1163,6 +1645,20 @@ | |||||||
|       "version": "1.1.2", |       "version": "1.1.2", | ||||||
|       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", |       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", | ||||||
|       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" |       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" | ||||||
|  |     }, | ||||||
|  |     "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==" | ||||||
|  |     }, | ||||||
|  |     "whatwg-url": { | ||||||
|  |       "version": "11.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", | ||||||
|  |       "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "tr46": "^3.0.0", | ||||||
|  |         "webidl-conversions": "^7.0.0" | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ | |||||||
|     "axios": "^0.27.2", |     "axios": "^0.27.2", | ||||||
|     "dotenv": "^16.0.3", |     "dotenv": "^16.0.3", | ||||||
|     "express": "^4.18.1", |     "express": "^4.18.1", | ||||||
|  |     "mongoose": "^6.6.3", | ||||||
|     "spotify-api.js": "^9.2.3" |     "spotify-api.js": "^9.2.3" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ export const store = { | |||||||
|   clientID: process.env.APP_SPOTIFY_CLIENT_ID, |   clientID: process.env.APP_SPOTIFY_CLIENT_ID, | ||||||
|   clientSecret: process.env.APP_SPOTIFY_CLIENT_SECRET, |   clientSecret: process.env.APP_SPOTIFY_CLIENT_SECRET, | ||||||
|   redirectURL: process.env.APP_SPOTIFY_REDIRECT_URI, |   redirectURL: process.env.APP_SPOTIFY_REDIRECT_URI, | ||||||
|  |   mongodbConnstring: process.env.MONGODB_CONNSTRING, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| console.log('store:', store); | console.log('store:', store); | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								frontend
									
									
									
									
									
								
							
							
								
								
								
								
								
								
							
						
						
									
										2
									
								
								frontend
									
									
									
									
									
								
							| @ -1 +1 @@ | |||||||
| Subproject commit 4b26d3aeef51185f4e27ae9e8700b378cd6cec0d | Subproject commit 2b501fdeed21fd533ae2e5968b08ec4291d288f9 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user