Commit 270df4e0 authored by nanahira's avatar nanahira

fix recursive model

parent 18005cf7
...@@ -111,17 +111,18 @@ export class RestfulFactory<T> { ...@@ -111,17 +111,18 @@ export class RestfulFactory<T> {
if (typeof relationClassFactory !== 'function') continue; if (typeof relationClassFactory !== 'function') continue;
const relationClass = (relationClassFactory as () => AnyClass)(); const relationClass = (relationClassFactory as () => AnyClass)();
if (typeof relationClass !== 'function') continue; if (typeof relationClass !== 'function') continue;
const replace = (useClass) => { const replace = (useClass: [AnyClass]) => {
const oldApiProperty = const oldApiProperty =
Reflect.getMetadata( Reflect.getMetadata(
DECORATORS.API_MODEL_PROPERTIES, DECORATORS.API_MODEL_PROPERTIES,
this.entityClass.prototype, this.entityClass.prototype,
relation.propertyName, relation.propertyName,
) || {}; ) || {};
const isArray = relation.relationType.endsWith('-many');
ApiProperty({ ApiProperty({
...oldApiProperty, ...oldApiProperty,
required: false, required: false,
type: relation.relationType.endsWith('-many') ? [useClass] : useClass, type: () => (isArray ? [useClass[0]] : useClass[0]),
})(resultDto.prototype, relation.propertyName); })(resultDto.prototype, relation.propertyName);
}; };
const existing = this.__resolveVisited.get(relationClass); const existing = this.__resolveVisited.get(relationClass);
...@@ -129,7 +130,7 @@ export class RestfulFactory<T> { ...@@ -129,7 +130,7 @@ export class RestfulFactory<T> {
replace(existing); replace(existing);
} else { } else {
if (!this.__resolveVisited.has(this.entityClass)) { if (!this.__resolveVisited.has(this.entityClass)) {
this.__resolveVisited.set(this.entityClass, Object); this.__resolveVisited.set(this.entityClass, [null]);
} }
const relationFactory = new RestfulFactory( const relationFactory = new RestfulFactory(
relationClass, relationClass,
...@@ -141,14 +142,19 @@ export class RestfulFactory<T> { ...@@ -141,14 +142,19 @@ export class RestfulFactory<T> {
this.__resolveVisited, this.__resolveVisited,
); );
const relationResultDto = relationFactory.entityResultDto; const relationResultDto = relationFactory.entityResultDto;
replace(relationResultDto); replace([relationResultDto]);
this.__resolveVisited.set(relationClass, relationResultDto); this.__resolveVisited.set(relationClass, [relationResultDto]);
} }
} }
return RenameClass( const res = RenameClass(
resultDto, resultDto,
`${this.getEntityClassName()}ResultDto`, `${this.getEntityClassName()}ResultDto`,
) as ClassType<T>; ) as ClassType<T>;
const currentContainer = this.__resolveVisited.get(this.entityClass);
if (currentContainer) {
currentContainer[0] = res;
}
return res;
} }
readonly entityResultDto = this.resolveEntityResultDto(); readonly entityResultDto = this.resolveEntityResultDto();
...@@ -170,7 +176,7 @@ export class RestfulFactory<T> { ...@@ -170,7 +176,7 @@ export class RestfulFactory<T> {
constructor( constructor(
public readonly entityClass: ClassType<T>, public readonly entityClass: ClassType<T>,
private options: RestfulFactoryOptions<T> = {}, private options: RestfulFactoryOptions<T> = {},
private __resolveVisited = new Map<AnyClass, AnyClass>(), private __resolveVisited = new Map<AnyClass, [AnyClass]>(),
) {} ) {}
private usePrefix( private usePrefix(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment