Skip to content

Commit

Permalink
feat(common): support return type
Browse files Browse the repository at this point in the history
  • Loading branch information
zanminkian committed Aug 9, 2022
1 parent ebcf96a commit a19a696
Showing 1 changed file with 31 additions and 8 deletions.
39 changes: 31 additions & 8 deletions packages/common/serializer/class-serializer.interceptor.ts
@@ -1,8 +1,14 @@
import { RETURN_TYPE_METADATA } from '../constants';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Inject, Injectable, Optional } from '../decorators/core';
import { StreamableFile } from '../file-stream';
import { CallHandler, ExecutionContext, NestInterceptor } from '../interfaces';
import {
CallHandler,
ExecutionContext,
NestInterceptor,
Type,
} from '../interfaces';
import { ClassTransformOptions } from '../interfaces/external/class-transform-options.interface';
import { TransformerPackage } from '../interfaces/external/transformer-package.interface';
import { loadPackage } from '../utils/load-package.util';
Expand All @@ -23,6 +29,7 @@ const REFLECTOR = 'Reflector';
export interface ClassSerializerInterceptorOptions
extends ClassTransformOptions {
transformerPackage?: TransformerPackage;
returnType?: Type<any>;
}

@Injectable()
Expand All @@ -45,15 +52,16 @@ export class ClassSerializerInterceptor implements NestInterceptor {

intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const contextOptions = this.getContextOptions(context);
const options = {
const options: ClassSerializerInterceptorOptions = {
...this.defaultOptions,
...contextOptions,
};
const returnType = this.getReturnType(context);
return next
.handle()
.pipe(
map((res: PlainLiteralObject | Array<PlainLiteralObject>) =>
this.serialize(res, options),
this.serialize(res, { returnType, ...options }),
),
);
}
Expand All @@ -63,7 +71,7 @@ export class ClassSerializerInterceptor implements NestInterceptor {
*/
serialize(
response: PlainLiteralObject | Array<PlainLiteralObject>,
options: ClassTransformOptions,
options: ClassSerializerInterceptorOptions,
): PlainLiteralObject | Array<PlainLiteralObject> {
if (!isObject(response) || response instanceof StreamableFile) {
return response;
Expand All @@ -76,11 +84,26 @@ export class ClassSerializerInterceptor implements NestInterceptor {

transformToPlain(
plainOrClass: any,
options: ClassTransformOptions,
options: ClassSerializerInterceptorOptions,
): PlainLiteralObject {
return plainOrClass
? classTransformer.classToPlain(plainOrClass, options)
: plainOrClass;
if (!plainOrClass) {
return plainOrClass;
}
if (!options.returnType) {
return classTransformer.classToPlain(plainOrClass, options);
}
if (plainOrClass instanceof options.returnType) {
return classTransformer.classToPlain(plainOrClass, options);
}
const instance = classTransformer.plainToClass(
options.returnType,
plainOrClass,
);
return classTransformer.classToPlain(instance, options);
}

private getReturnType(context: ExecutionContext): Type<any> {
return this.reflector.get(RETURN_TYPE_METADATA, context.getHandler());
}

protected getContextOptions(
Expand Down

0 comments on commit a19a696

Please sign in to comment.