diff --git a/.nvmrc b/.nvmrc
index 8ce70308..d4b7699d 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-20.16.0
+20.18.1
diff --git a/package.json b/package.json
index ca04951f..516e9f6c 100644
--- a/package.json
+++ b/package.json
@@ -93,7 +93,7 @@
     "@types/express": "^4.17.21",
     "@types/lodash": "^4.17.6",
     "@types/ms": "^0.7.34",
-    "@types/node": "20.14.14",
+    "@types/node": "20.17.10",
     "@types/passport-jwt": "4.0.1",
     "@types/passport-spotify": "2.0.4",
     "@typescript-eslint/eslint-plugin": "^8.0.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9570a790..6c525585 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -49,7 +49,7 @@ importers:
         version: 1.2.0
       '@vitest/coverage-v8':
         specifier: 2.1.1
-        version: 2.1.1(vitest@2.1.1(@types/node@20.14.14)(terser@5.36.0))
+        version: 2.1.1(vitest@2.1.1(@types/node@20.17.10)(terser@5.36.0))
       axios:
         specifier: 1.7.7
         version: 1.7.7
@@ -107,7 +107,7 @@ importers:
     devDependencies:
       '@commitlint/cli':
         specifier: ^19.3.0
-        version: 19.6.0(@types/node@20.14.14)(typescript@5.7.2)
+        version: 19.6.0(@types/node@20.17.10)(typescript@5.7.2)
       '@commitlint/config-conventional':
         specifier: ^19.2.2
         version: 19.6.0
@@ -148,8 +148,8 @@ importers:
         specifier: ^0.7.34
         version: 0.7.34
       '@types/node':
-        specifier: 20.14.14
-        version: 20.14.14
+        specifier: 20.17.10
+        version: 20.17.10
       '@types/passport-jwt':
         specifier: 4.0.1
         version: 4.0.1
@@ -164,7 +164,7 @@ importers:
         version: 8.15.0(eslint@8.57.1)(typescript@5.7.2)
       commitizen:
         specifier: ^4.3.0
-        version: 4.3.1(@types/node@20.14.14)(typescript@5.7.2)
+        version: 4.3.1(@types/node@20.17.10)(typescript@5.7.2)
       eslint:
         specifier: ^8.56.0
         version: 8.57.1
@@ -197,7 +197,7 @@ importers:
         version: 55.0.0(eslint@8.57.1)
       eslint-plugin-vitest:
         specifier: 0.3.20
-        version: 0.3.20(@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)(vitest@2.1.1(@types/node@20.14.14)(terser@5.36.0))
+        version: 0.3.20(@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)(vitest@2.1.1(@types/node@20.17.10)(terser@5.36.0))
       husky:
         specifier: ^9.0.11
         version: 9.1.7
@@ -224,13 +224,13 @@ importers:
         version: 1.5.1(@swc/core@1.7.28)(rollup@4.27.4)
       vite-tsconfig-paths:
         specifier: 4.3.2
-        version: 4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@20.14.14)(terser@5.36.0))
+        version: 4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.10)(terser@5.36.0))
       vitest:
         specifier: 2.1.1
-        version: 2.1.1(@types/node@20.14.14)(terser@5.36.0)
+        version: 2.1.1(@types/node@20.17.10)(terser@5.36.0)
       vitest-mock-extended:
         specifier: 2.0.2
-        version: 2.0.2(typescript@5.7.2)(vitest@2.1.1(@types/node@20.14.14)(terser@5.36.0))
+        version: 2.0.2(typescript@5.7.2)(vitest@2.1.1(@types/node@20.17.10)(terser@5.36.0))
 
 packages:
 
@@ -1802,8 +1802,8 @@ packages:
   '@types/ms@0.7.34':
     resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
 
-  '@types/node@20.14.14':
-    resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==}
+  '@types/node@20.17.10':
+    resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==}
 
   '@types/normalize-package-data@2.4.4':
     resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -5343,8 +5343,8 @@ packages:
   unbox-primitive@1.0.2:
     resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
 
-  undici-types@5.26.5:
-    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+  undici-types@6.19.8:
+    resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
 
   unicode-canonical-property-names-ecmascript@2.0.1:
     resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
@@ -6525,11 +6525,11 @@ snapshots:
   '@colors/colors@1.5.0':
     optional: true
 
-  '@commitlint/cli@19.6.0(@types/node@20.14.14)(typescript@5.7.2)':
+  '@commitlint/cli@19.6.0(@types/node@20.17.10)(typescript@5.7.2)':
     dependencies:
       '@commitlint/format': 19.5.0
       '@commitlint/lint': 19.6.0
-      '@commitlint/load': 19.5.0(@types/node@20.14.14)(typescript@5.7.2)
+      '@commitlint/load': 19.5.0(@types/node@20.17.10)(typescript@5.7.2)
       '@commitlint/read': 19.5.0
       '@commitlint/types': 19.5.0
       tinyexec: 0.3.1
@@ -6576,7 +6576,7 @@ snapshots:
       '@commitlint/rules': 19.6.0
       '@commitlint/types': 19.5.0
 
-  '@commitlint/load@19.5.0(@types/node@20.14.14)(typescript@5.7.2)':
+  '@commitlint/load@19.5.0(@types/node@20.17.10)(typescript@5.7.2)':
     dependencies:
       '@commitlint/config-validator': 19.5.0
       '@commitlint/execute-rule': 19.5.0
@@ -6584,7 +6584,7 @@ snapshots:
       '@commitlint/types': 19.5.0
       chalk: 5.3.0
       cosmiconfig: 9.0.0(typescript@5.7.2)
-      cosmiconfig-typescript-loader: 5.1.0(@types/node@20.14.14)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2)
+      cosmiconfig-typescript-loader: 5.1.0(@types/node@20.17.10)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2)
       lodash.isplainobject: 4.0.6
       lodash.merge: 4.6.2
       lodash.uniq: 4.5.0
@@ -7249,22 +7249,22 @@ snapshots:
   '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
 
   '@types/cacheable-request@6.0.3':
     dependencies:
       '@types/http-cache-semantics': 4.0.4
       '@types/keyv': 3.1.4
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
       '@types/responselike': 1.0.3
 
   '@types/connect@3.4.38':
     dependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
 
   '@types/conventional-commits-parser@5.0.0':
     dependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
 
   '@types/cookie-parser@1.4.7':
     dependencies:
@@ -7284,7 +7284,7 @@ snapshots:
 
   '@types/express-serve-static-core@4.19.6':
     dependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
       '@types/qs': 6.9.17
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -7306,11 +7306,11 @@ snapshots:
 
   '@types/jsonwebtoken@9.0.7':
     dependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
 
   '@types/keyv@3.1.4':
     dependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
 
   '@types/lodash@4.17.13': {}
 
@@ -7320,9 +7320,9 @@ snapshots:
 
   '@types/ms@0.7.34': {}
 
-  '@types/node@20.14.14':
+  '@types/node@20.17.10':
     dependencies:
-      undici-types: 5.26.5
+      undici-types: 6.19.8
 
   '@types/normalize-package-data@2.4.4': {}
 
@@ -7350,19 +7350,19 @@ snapshots:
 
   '@types/responselike@1.0.3':
     dependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
 
   '@types/semver@7.5.8': {}
 
   '@types/send@0.17.4':
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
 
   '@types/serve-static@1.15.7':
     dependencies:
       '@types/http-errors': 2.0.4
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
       '@types/send': 0.17.4
 
   '@types/validator@13.12.2': {}
@@ -7560,7 +7560,7 @@ snapshots:
 
   '@ungap/structured-clone@1.2.0': {}
 
-  '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.14.14)(terser@5.36.0))':
+  '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.17.10)(terser@5.36.0))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 0.2.3
@@ -7574,7 +7574,7 @@ snapshots:
       std-env: 3.8.0
       test-exclude: 7.0.1
       tinyrainbow: 1.2.0
-      vitest: 2.1.1(@types/node@20.14.14)(terser@5.36.0)
+      vitest: 2.1.1(@types/node@20.17.10)(terser@5.36.0)
     transitivePeerDependencies:
       - supports-color
 
@@ -7585,13 +7585,13 @@ snapshots:
       chai: 5.1.2
       tinyrainbow: 1.2.0
 
-  '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@20.14.14)(terser@5.36.0))':
+  '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@20.17.10)(terser@5.36.0))':
     dependencies:
       '@vitest/spy': 2.1.1
       estree-walker: 3.0.3
       magic-string: 0.30.13
     optionalDependencies:
-      vite: 5.4.11(@types/node@20.14.14)(terser@5.36.0)
+      vite: 5.4.11(@types/node@20.17.10)(terser@5.36.0)
 
   '@vitest/pretty-format@2.1.1':
     dependencies:
@@ -8211,10 +8211,10 @@ snapshots:
       has-own-prop: 2.0.0
       repeat-string: 1.6.1
 
-  commitizen@4.3.1(@types/node@20.14.14)(typescript@5.7.2):
+  commitizen@4.3.1(@types/node@20.17.10)(typescript@5.7.2):
     dependencies:
       cachedir: 2.3.0
-      cz-conventional-changelog: 3.3.0(@types/node@20.14.14)(typescript@5.7.2)
+      cz-conventional-changelog: 3.3.0(@types/node@20.17.10)(typescript@5.7.2)
       dedent: 0.7.0
       detect-indent: 6.1.0
       find-node-modules: 2.1.3
@@ -8296,9 +8296,9 @@ snapshots:
       object-assign: 4.1.1
       vary: 1.1.2
 
-  cosmiconfig-typescript-loader@5.1.0(@types/node@20.14.14)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2):
+  cosmiconfig-typescript-loader@5.1.0(@types/node@20.17.10)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2):
     dependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
       cosmiconfig: 9.0.0(typescript@5.7.2)
       jiti: 1.21.6
       typescript: 5.7.2
@@ -8342,16 +8342,16 @@ snapshots:
       shebang-command: 2.0.0
       which: 2.0.2
 
-  cz-conventional-changelog@3.3.0(@types/node@20.14.14)(typescript@5.7.2):
+  cz-conventional-changelog@3.3.0(@types/node@20.17.10)(typescript@5.7.2):
     dependencies:
       chalk: 2.4.2
-      commitizen: 4.3.1(@types/node@20.14.14)(typescript@5.7.2)
+      commitizen: 4.3.1(@types/node@20.17.10)(typescript@5.7.2)
       conventional-commit-types: 3.0.0
       lodash.map: 4.6.0
       longest: 2.0.1
       word-wrap: 1.2.5
     optionalDependencies:
-      '@commitlint/load': 19.5.0(@types/node@20.14.14)(typescript@5.7.2)
+      '@commitlint/load': 19.5.0(@types/node@20.17.10)(typescript@5.7.2)
     transitivePeerDependencies:
       - '@types/node'
       - typescript
@@ -8877,13 +8877,13 @@ snapshots:
       semver: 7.6.3
       strip-indent: 3.0.0
 
-  eslint-plugin-vitest@0.3.20(@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)(vitest@2.1.1(@types/node@20.14.14)(terser@5.36.0)):
+  eslint-plugin-vitest@0.3.20(@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)(vitest@2.1.1(@types/node@20.17.10)(terser@5.36.0)):
     dependencies:
       '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.2)
       eslint: 8.57.1
     optionalDependencies:
       '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
-      vitest: 2.1.1(@types/node@20.14.14)(terser@5.36.0)
+      vitest: 2.1.1(@types/node@20.17.10)(terser@5.36.0)
     transitivePeerDependencies:
       - supports-color
       - typescript
@@ -9806,7 +9806,7 @@ snapshots:
 
   jest-worker@27.5.1:
     dependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
@@ -11282,7 +11282,7 @@ snapshots:
       has-symbols: 1.0.3
       which-boxed-primitive: 1.0.2
 
-  undici-types@5.26.5: {}
+  undici-types@6.19.8: {}
 
   unicode-canonical-property-names-ecmascript@2.0.1: {}
 
@@ -11340,12 +11340,12 @@ snapshots:
 
   vary@1.1.2: {}
 
-  vite-node@2.1.1(@types/node@20.14.14)(terser@5.36.0):
+  vite-node@2.1.1(@types/node@20.17.10)(terser@5.36.0):
     dependencies:
       cac: 6.7.14
       debug: 4.3.7
       pathe: 1.1.2
-      vite: 5.4.11(@types/node@20.14.14)(terser@5.36.0)
+      vite: 5.4.11(@types/node@20.17.10)(terser@5.36.0)
     transitivePeerDependencies:
       - '@types/node'
       - less
@@ -11357,37 +11357,37 @@ snapshots:
       - supports-color
       - terser
 
-  vite-tsconfig-paths@4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@20.14.14)(terser@5.36.0)):
+  vite-tsconfig-paths@4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.10)(terser@5.36.0)):
     dependencies:
       debug: 4.3.7
       globrex: 0.1.2
       tsconfck: 3.1.4(typescript@5.7.2)
     optionalDependencies:
-      vite: 5.4.11(@types/node@20.14.14)(terser@5.36.0)
+      vite: 5.4.11(@types/node@20.17.10)(terser@5.36.0)
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  vite@5.4.11(@types/node@20.14.14)(terser@5.36.0):
+  vite@5.4.11(@types/node@20.17.10)(terser@5.36.0):
     dependencies:
       esbuild: 0.21.5
       postcss: 8.4.49
       rollup: 4.27.4
     optionalDependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
       fsevents: 2.3.3
       terser: 5.36.0
 
-  vitest-mock-extended@2.0.2(typescript@5.7.2)(vitest@2.1.1(@types/node@20.14.14)(terser@5.36.0)):
+  vitest-mock-extended@2.0.2(typescript@5.7.2)(vitest@2.1.1(@types/node@20.17.10)(terser@5.36.0)):
     dependencies:
       ts-essentials: 10.0.3(typescript@5.7.2)
       typescript: 5.7.2
-      vitest: 2.1.1(@types/node@20.14.14)(terser@5.36.0)
+      vitest: 2.1.1(@types/node@20.17.10)(terser@5.36.0)
 
-  vitest@2.1.1(@types/node@20.14.14)(terser@5.36.0):
+  vitest@2.1.1(@types/node@20.17.10)(terser@5.36.0):
     dependencies:
       '@vitest/expect': 2.1.1
-      '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@20.14.14)(terser@5.36.0))
+      '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@20.17.10)(terser@5.36.0))
       '@vitest/pretty-format': 2.1.5
       '@vitest/runner': 2.1.1
       '@vitest/snapshot': 2.1.1
@@ -11402,11 +11402,11 @@ snapshots:
       tinyexec: 0.3.1
       tinypool: 1.0.2
       tinyrainbow: 1.2.0
-      vite: 5.4.11(@types/node@20.14.14)(terser@5.36.0)
-      vite-node: 2.1.1(@types/node@20.14.14)(terser@5.36.0)
+      vite: 5.4.11(@types/node@20.17.10)(terser@5.36.0)
+      vite-node: 2.1.1(@types/node@20.17.10)(terser@5.36.0)
       why-is-node-running: 2.3.0
     optionalDependencies:
-      '@types/node': 20.14.14
+      '@types/node': 20.17.10
     transitivePeerDependencies:
       - less
       - lightningcss