-
Notifications
You must be signed in to change notification settings - Fork 50
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(core): Look up the proper assembler with inheritance
- Loading branch information
1 parent
13fdd2b
commit 8bd22c5
Showing
6 changed files
with
48 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,29 @@ | ||
import { Class, DeepPartial } from '../common'; | ||
import { Assembler, getAssembler } from './assembler'; | ||
import { Assembler, getAssemblers } from './assembler'; | ||
import { DefaultAssembler } from './default.assembler'; | ||
|
||
/** | ||
* Assembler Service used by query services to look up Assemblers. | ||
*/ | ||
export class AssemblerFactory { | ||
static getAssembler<From, To, C = DeepPartial<From>, CE = DeepPartial<To>, U = C, UE = CE>( | ||
FromClass: Class<From>, | ||
ToClass: Class<To>, | ||
): Assembler<From, To, C, CE, U, UE> { | ||
const AssemblerClass = getAssembler<From, To, C, CE, U, UE>(FromClass, ToClass); | ||
if (AssemblerClass) { | ||
return new AssemblerClass(); | ||
static getAssembler<DTO, Entity, C = DeepPartial<DTO>, CE = DeepPartial<Entity>, U = C, UE = CE>( | ||
DTOClass: Class<DTO>, | ||
EntityClass: Class<Entity>, | ||
): Assembler<DTO, Entity, C, CE, U, UE> { | ||
const AssemblerClasses = getAssemblers(DTOClass); | ||
if (AssemblerClasses) { | ||
const AssemblerClass = AssemblerClasses.get(EntityClass); | ||
if (AssemblerClass) { | ||
return new AssemblerClass() as Assembler<DTO, Entity, C, CE, U, UE>; | ||
} | ||
const keys = [...AssemblerClasses.keys()]; | ||
const keysWithParent = keys.filter((k) => k.prototype instanceof EntityClass); | ||
if (keysWithParent.length === 1) { | ||
return this.getAssembler(DTOClass, keysWithParent[0] as Class<Entity>); | ||
} | ||
} | ||
const defaultAssember = new DefaultAssembler(FromClass, ToClass); | ||
const defaultAssembler = new DefaultAssembler(DTOClass, EntityClass); | ||
// if its a default just assume the types can be converted for all types | ||
return (defaultAssember as unknown) as Assembler<From, To, C, CE, U, UE>; | ||
return (defaultAssembler as unknown) as Assembler<DTO, Entity, C, CE, U, UE>; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters