refactor: use findOne instead of limit(1) (@fehmer) (#6924)

This commit is contained in:
Christian Fehmer 2025-09-01 11:52:16 +02:00 committed by GitHub
parent 177eb590fd
commit d9887cf37c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 87 additions and 104 deletions

View file

@ -211,18 +211,15 @@ async function updateUser(uid: string): Promise<void> {
);
for (const mode of modes) {
const best = (
await ResultDal.getResultCollection()
.find({
uid,
language: mode.language,
mode: mode.mode,
mode2: mode.mode2,
})
.sort({ wpm: -1, timestamp: 1 })
.limit(1)
.toArray()
)[0] as DBResult;
const best = (await ResultDal.getResultCollection().findOne(
{
uid,
language: mode.language,
mode: mode.mode,
mode2: mode.mode2,
},
{ sort: { wpm: -1, timestamp: 1 } }
)) as DBResult;
if (personalBests[mode.mode] === undefined) personalBests[mode.mode] = {};
if (personalBests[mode.mode][mode.mode2] === undefined)

View file

@ -70,22 +70,25 @@ export async function getResult(uid: string, id: string): Promise<DBResult> {
}
export async function getLastResult(uid: string): Promise<DBResult> {
const [lastResult] = await getResultCollection()
.find({ uid })
.sort({ timestamp: -1 })
.limit(1)
.toArray();
if (!lastResult) throw new MonkeyError(404, "No last result found");
const lastResult = await getResultCollection().findOne(
{ uid },
{ sort: { timestamp: -1 } }
);
if (lastResult === null) throw new MonkeyError(404, "No last result found");
return convert(lastResult);
}
export async function getLastResultTimestamp(uid: string): Promise<number> {
const [lastResult] = await getResultCollection()
.find({ uid }, { projection: { timestamp: 1, _id: 0 } })
.sort({ timestamp: -1 })
.limit(1)
.toArray();
if (!lastResult) throw new MonkeyError(404, "No last result found");
const lastResult = await getResultCollection().findOne(
{ uid },
{
projection: { timestamp: 1, _id: 0 },
sort: { timestamp: -1 },
}
);
if (lastResult === null) throw new MonkeyError(404, "No last result found");
return lastResult.timestamp;
}

View file

@ -265,13 +265,12 @@ export async function getPartialUser<K extends keyof DBUser>(
}
export async function findByName(name: string): Promise<DBUser | undefined> {
return (
await getUsersCollection()
.find({ name })
.collation({ locale: "en", strength: 1 })
.limit(1)
.toArray()
)[0];
const found = await getUsersCollection().findOne(
{ name },
{ collation: { locale: "en", strength: 1 } }
);
return found !== null ? found : undefined;
}
export async function isNameAvailable(

View file

@ -67,6 +67,7 @@
"@commitlint/cli": "17.7.1",
"@commitlint/config-conventional": "19.2.2",
"@monkeytype/release": "workspace:*",
"@vitest/coverage-v8": "3.2.4",
"conventional-changelog": "6.0.0",
"eslint": "8.57.1",
"husky": "8.0.1",

129
pnpm-lock.yaml generated
View file

@ -17,6 +17,9 @@ importers:
'@monkeytype/release':
specifier: workspace:*
version: link:packages/release
'@vitest/coverage-v8':
specifier: 3.2.4
version: 3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))
conventional-changelog:
specifier: 6.0.0
version: 6.0.0(conventional-commits-filter@5.0.0)
@ -883,11 +886,6 @@ packages:
resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
engines: {node: '>=6.9.0'}
'@babel/parser@7.28.0':
resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/parser@7.28.3':
resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==}
engines: {node: '>=6.0.0'}
@ -2190,9 +2188,6 @@ packages:
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
'@jridgewell/gen-mapping@0.3.12':
resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==}
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@ -2209,15 +2204,9 @@ packages:
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/sourcemap-codec@1.5.4':
resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==}
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
'@jridgewell/trace-mapping@0.3.29':
resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==}
'@jridgewell/trace-mapping@0.3.30':
resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
@ -5291,10 +5280,6 @@ packages:
foreach@2.0.6:
resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==}
foreground-child@3.2.1:
resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==}
engines: {node: '>=14'}
foreground-child@3.3.1:
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
engines: {node: '>=14'}
@ -9816,8 +9801,8 @@ snapshots:
'@ampproject/remapping@2.3.0':
dependencies:
'@jridgewell/gen-mapping': 0.3.12
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.30
'@anatine/zod-openapi@1.14.2(openapi3-ts@2.0.2)(zod@3.23.8)':
dependencies:
@ -9862,7 +9847,7 @@ snapshots:
'@babel/helper-compilation-targets': 7.25.2
'@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
'@babel/helpers': 7.25.0
'@babel/parser': 7.28.0
'@babel/parser': 7.28.3
'@babel/template': 7.25.0
'@babel/traverse': 7.25.2
'@babel/types': 7.28.2
@ -9897,8 +9882,8 @@ snapshots:
'@babel/generator@7.25.0':
dependencies:
'@babel/types': 7.28.2
'@jridgewell/gen-mapping': 0.3.12
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.30
jsesc: 2.5.2
'@babel/generator@7.28.3':
@ -10073,10 +10058,6 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
'@babel/parser@7.28.0':
dependencies:
'@babel/types': 7.28.2
'@babel/parser@7.28.3':
dependencies:
'@babel/types': 7.28.2
@ -10563,7 +10544,7 @@ snapshots:
'@babel/template@7.25.0':
dependencies:
'@babel/code-frame': 7.24.7
'@babel/parser': 7.28.0
'@babel/parser': 7.28.3
'@babel/types': 7.28.2
'@babel/template@7.27.2':
@ -10576,7 +10557,7 @@ snapshots:
dependencies:
'@babel/code-frame': 7.24.7
'@babel/generator': 7.25.0
'@babel/parser': 7.28.0
'@babel/parser': 7.28.3
'@babel/template': 7.25.0
'@babel/types': 7.28.2
debug: 4.4.1
@ -10735,7 +10716,7 @@ snapshots:
'@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0)':
dependencies:
'@types/semver': 7.5.8
semver: 7.6.3
semver: 7.7.2
optionalDependencies:
conventional-commits-filter: 5.0.0
conventional-commits-parser: 6.0.0
@ -11644,11 +11625,6 @@ snapshots:
dependencies:
'@sinclair/typebox': 0.27.8
'@jridgewell/gen-mapping@0.3.12':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.4
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@ -11663,20 +11639,13 @@ snapshots:
'@jridgewell/source-map@0.3.6':
dependencies:
'@jridgewell/gen-mapping': 0.3.12
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.30
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/sourcemap-codec@1.5.4': {}
'@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.29':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.4
'@jridgewell/trace-mapping@0.3.30':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
@ -11685,7 +11654,7 @@ snapshots:
'@jridgewell/trace-mapping@0.3.9':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.4
'@jridgewell/sourcemap-codec': 1.5.5
'@js-sdsl/ordered-map@4.4.2': {}
@ -11773,7 +11742,7 @@ snapshots:
'@npmcli/fs@3.1.1':
dependencies:
semver: 7.6.3
semver: 7.7.2
optional: true
'@npmcli/map-workspaces@3.0.6':
@ -12744,7 +12713,7 @@ snapshots:
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
semver: 7.7.2
ts-api-utils: 1.4.3(typescript@5.5.4)
optionalDependencies:
typescript: 5.5.4
@ -12759,7 +12728,7 @@ snapshots:
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
semver: 7.7.2
ts-api-utils: 1.3.0(typescript@5.5.4)
optionalDependencies:
typescript: 5.5.4
@ -12829,6 +12798,25 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 1.0.2
ast-v8-to-istanbul: 0.3.3
debug: 4.4.1
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.6
istanbul-reports: 3.1.7
magic-string: 0.30.17
magicast: 0.3.5
std-env: 3.9.0
test-exclude: 7.0.1
tinyrainbow: 2.0.0
vitest: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)
transitivePeerDependencies:
- supports-color
'@vitest/expect@3.2.4':
dependencies:
'@types/chai': 5.2.2
@ -12881,7 +12869,7 @@ snapshots:
'@vue/compiler-core@3.4.37':
dependencies:
'@babel/parser': 7.28.0
'@babel/parser': 7.28.3
'@vue/shared': 3.4.37
entities: 5.0.0
estree-walker: 2.0.2
@ -12894,7 +12882,7 @@ snapshots:
'@vue/compiler-sfc@3.4.37':
dependencies:
'@babel/parser': 7.28.0
'@babel/parser': 7.28.3
'@vue/compiler-core': 3.4.37
'@vue/compiler-dom': 3.4.37
'@vue/compiler-ssr': 3.4.37
@ -13173,7 +13161,7 @@ snapshots:
ast-v8-to-istanbul@0.3.3:
dependencies:
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/trace-mapping': 0.3.30
estree-walker: 3.0.3
js-tokens: 9.0.1
@ -13922,7 +13910,7 @@ snapshots:
conventional-commits-filter: 5.0.0
handlebars: 4.7.8
meow: 13.2.0
semver: 7.6.3
semver: 7.7.2
conventional-changelog@6.0.0(conventional-commits-filter@5.0.0):
dependencies:
@ -14422,7 +14410,7 @@ snapshots:
'@one-ini/wasm': 0.1.1
commander: 10.0.1
minimatch: 9.0.1
semver: 7.6.3
semver: 7.7.2
ee-first@1.1.1: {}
@ -14917,7 +14905,7 @@ snapshots:
execa@7.2.0:
dependencies:
cross-spawn: 7.0.3
cross-spawn: 7.0.6
get-stream: 6.0.1
human-signals: 4.3.1
is-stream: 3.0.0
@ -14951,7 +14939,7 @@ snapshots:
pump: 3.0.0
qs: 6.13.0
raw-body: 2.5.2
semver: 7.6.3
semver: 7.7.2
transitivePeerDependencies:
- supports-color
@ -15388,11 +15376,6 @@ snapshots:
foreach@2.0.6: {}
foreground-child@3.2.1:
dependencies:
cross-spawn: 7.0.3
signal-exit: 4.1.0
foreground-child@3.3.1:
dependencies:
cross-spawn: 7.0.6
@ -15643,7 +15626,7 @@ snapshots:
glob@10.4.5:
dependencies:
foreground-child: 3.2.1
foreground-child: 3.3.1
jackspeak: 3.4.3
minimatch: 9.0.5
minipass: 7.1.2
@ -16376,7 +16359,7 @@ snapshots:
istanbul-lib-source-maps@5.0.6:
dependencies:
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/trace-mapping': 0.3.30
debug: 4.4.1
istanbul-lib-coverage: 3.2.2
transitivePeerDependencies:
@ -16868,11 +16851,11 @@ snapshots:
magic-string@0.30.8:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.4
'@jridgewell/sourcemap-codec': 1.5.5
magicast@0.3.5:
dependencies:
'@babel/parser': 7.28.0
'@babel/parser': 7.28.3
'@babel/types': 7.28.2
source-map-js: 1.2.1
@ -16882,7 +16865,7 @@ snapshots:
make-dir@4.0.0:
dependencies:
semver: 7.6.3
semver: 7.7.2
make-error@1.3.6: {}
@ -17554,7 +17537,7 @@ snapshots:
make-fetch-happen: 13.0.1
nopt: 7.2.1
proc-log: 4.2.0
semver: 7.6.3
semver: 7.7.2
tar: 6.2.1
which: 4.0.0
transitivePeerDependencies:
@ -17571,7 +17554,7 @@ snapshots:
node-source-walk@7.0.0:
dependencies:
'@babel/parser': 7.28.0
'@babel/parser': 7.28.3
nodemailer@6.9.14: {}
@ -17607,13 +17590,13 @@ snapshots:
dependencies:
hosted-git-info: 4.1.0
is-core-module: 2.15.0
semver: 7.6.3
semver: 7.7.2
validate-npm-package-license: 3.0.4
normalize-package-data@6.0.2:
dependencies:
hosted-git-info: 7.0.2
semver: 7.6.3
semver: 7.7.2
validate-npm-package-license: 3.0.4
normalize-path@3.0.0: {}
@ -18977,7 +18960,7 @@ snapshots:
simple-update-notifier@2.0.0:
dependencies:
semver: 7.6.3
semver: 7.7.2
simple-websocket@9.1.0:
dependencies:
@ -19330,7 +19313,7 @@ snapshots:
sucrase@3.35.0:
dependencies:
'@jridgewell/gen-mapping': 0.3.12
'@jridgewell/gen-mapping': 0.3.13
commander: 4.1.1
glob: 10.4.5
lines-and-columns: 1.2.4
@ -20017,7 +20000,7 @@ snapshots:
pupa: 2.1.1
registry-auth-token: 5.0.2
registry-url: 5.1.0
semver: 7.6.3
semver: 7.7.2
semver-diff: 3.1.1
xdg-basedir: 4.0.0
transitivePeerDependencies:
@ -20321,7 +20304,7 @@ snapshots:
vscode-languageclient@7.0.0:
dependencies:
minimatch: 3.1.2
semver: 7.6.3
semver: 7.7.2
vscode-languageserver-protocol: 3.16.0
vscode-languageserver-protocol@3.16.0: