diff --git a/package-lock.json b/package-lock.json index 4b64ffe..6df0e52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@lenne.tech/nest-server", - "version": "10.2.0", + "version": "10.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@lenne.tech/nest-server", - "version": "10.2.0", + "version": "10.2.1", "license": "MIT", "dependencies": { "@apollo/gateway": "2.5.7", diff --git a/package.json b/package.json index ac8495e..9f59ab3 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lenne.tech/nest-server", - "version": "10.2.0", + "version": "10.2.1", "description": "Modern, fast, powerful Node.js web framework in TypeScript based on Nest with a GraphQL API and a connection to MongoDB (or other databases).", "keywords": [ "node", diff --git a/spectaql.yml b/spectaql.yml index 3cee84c..7f24ced 100644 --- a/spectaql.yml +++ b/spectaql.yml @@ -11,7 +11,7 @@ servers: info: title: lT Nest Server description: Modern, fast, powerful Node.js web framework in TypeScript based on Nest with a GraphQL API and a connection to MongoDB (or other databases). - version: 10.2.0 + version: 10.2.1 contact: name: lenne.Tech GmbH url: https://lenne.tech diff --git a/src/core/common/helpers/db.helper.ts b/src/core/common/helpers/db.helper.ts index 27bd9ac..49ac629 100644 --- a/src/core/common/helpers/db.helper.ts +++ b/src/core/common/helpers/db.helper.ts @@ -505,8 +505,13 @@ export async function popAndMap( // Map result if (Array.isArray(result)) { - result = result.map(item => (modelClass as any).map(item)); - } else { + result = result.map((item) => { + if (item && typeof item === 'object') { + return (modelClass as any).map(item); + } + return item; + }); + } else if (result && typeof result === 'object') { result = (modelClass as any).map(result); } @@ -514,12 +519,19 @@ export async function popAndMap( } else { if (Array.isArray(queryOrDocument)) { await setPopulates(queryOrDocument, populateOptions, mongooseModel, { ignoreSelections }); - result = queryOrDocument.map(item => (modelClass as any).map(item)); + result = queryOrDocument.map((item) => { + if (item && typeof item === 'object') { + return (modelClass as any).map(item); + } + return item; + }); // Process document } else { await setPopulates(queryOrDocument, populateOptions, mongooseModel, { ignoreSelections }); - result = (modelClass as any).map(queryOrDocument); + if (queryOrDocument && typeof queryOrDocument === 'object') { + result = (modelClass as any).map(queryOrDocument); + } } } diff --git a/src/core/common/helpers/input.helper.ts b/src/core/common/helpers/input.helper.ts index 7ce4d48..8535cd4 100644 --- a/src/core/common/helpers/input.helper.ts +++ b/src/core/common/helpers/input.helper.ts @@ -262,7 +262,7 @@ export async function check( } // Return value if it is only a basic type - if (typeof value !== 'object') { + if (!value || typeof value !== 'object') { return value; } diff --git a/src/core/common/helpers/service.helper.ts b/src/core/common/helpers/service.helper.ts index 007f84b..00af50c 100644 --- a/src/core/common/helpers/service.helper.ts +++ b/src/core/common/helpers/service.helper.ts @@ -92,7 +92,7 @@ export async function prepareInput( }; // Check input - if (typeof input !== 'object') { + if (!input || typeof input !== 'object') { return input; } @@ -206,7 +206,7 @@ export async function prepareOutput(User.findById(id), serviceOptions); - * @example const users = await this.populateAndProcessQuery(User.find({name: {'$regex': 'ma'}}), serviceOptions); + * @example const users = await this.populateAndProcessQuery(User.find({name: {'$regex': 'ma'}}), {...serviceOptions, populate:['contacts'], force: true}); */ - async populateAndProcessQuery( + async processQueryOrDocument( queryOrDocument: Query | Document | Document[], - options?: { - fieldSelection?: FieldSelection; - ignoreSelections?: boolean; - modelClass?: new (...args: any[]) => ArrayElement; - populate?: FieldSelection; - mongooseModel?: MongooseModel; - }, + serviceOptions?: ServiceOptions, ): Promise { - const config = { - modelClass: this.mainModelConstructor, - mongooseModel: this.mainDbModel, - ...options, - }; - let result: T; - if (config.fieldSelection || config.populate) { - result = (await popAndMap>( - queryOrDocument, - config.populate || config.fieldSelection, - config.modelClass as new (...args: any[]) => ArrayElement, - config.mongooseModel) - ) as T; - } else if (queryOrDocument instanceof Query) { - result = (await queryOrDocument.exec()) as T; - } - return result; + return this.process(() => { + if (queryOrDocument instanceof Query) { + return queryOrDocument.exec(); + } + return queryOrDocument; + }, { serviceOptions }); } } diff --git a/src/core/modules/auth/core-auth.controller.ts b/src/core/modules/auth/core-auth.controller.ts index b111d88..bfe08f5 100644 --- a/src/core/modules/auth/core-auth.controller.ts +++ b/src/core/modules/auth/core-auth.controller.ts @@ -77,7 +77,7 @@ export class CoreAuthController { // Check if cookie handling is activated if (this.configService.getFastButReadOnly('cookies')) { // Set cookies - if (typeof result !== 'object') { + if (!result || typeof result !== 'object') { res.cookie('token', '', { httpOnly: true }); res.cookie('refreshToken', '', { httpOnly: true }); return result; diff --git a/src/core/modules/auth/core-auth.resolver.ts b/src/core/modules/auth/core-auth.resolver.ts index 95699d6..969af16 100644 --- a/src/core/modules/auth/core-auth.resolver.ts +++ b/src/core/modules/auth/core-auth.resolver.ts @@ -96,7 +96,7 @@ export class CoreAuthResolver { // Check if cookie handling is activated if (this.configService.getFastButReadOnly('cookies')) { // Set cookies - if (typeof result !== 'object') { + if (!result || typeof result !== 'object') { ctx.res.cookie('token', '', { httpOnly: true }); ctx.res.cookie('refreshToken', '', { httpOnly: true }); return result;