-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: request model args + refactor parameter handler components WIP
- Loading branch information
1 parent
4d45b5e
commit 1cba0f4
Showing
21 changed files
with
398 additions
and
56 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
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
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
99 changes: 99 additions & 0 deletions
99
pkgs/core/builtin/parameterhandlers/handlers/ModelParameterHandler.ts
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 |
---|---|---|
@@ -0,0 +1,99 @@ | ||
/* eslint-disable @typescript-eslint/no-explicit-any */ | ||
|
||
import { ParameterHandler } from '../ParameterHandler' | ||
import { RequestFactory } from '../../../RequestFactory' | ||
import { Drizzle } from '../../../Drizzle' | ||
import { Parameter } from '../Parameter' | ||
import { ParameterHandlerFactory } from '../ParameterHandlerFactory' | ||
import { RequestParameterization } from '../../../RequestParameterization' | ||
import { QueryParameterHandler } from './QueryParameterHandler' | ||
import { HeaderParameterHandler } from './HeaderParameterHandler' | ||
import { QueryNameParameterHandler } from './QueryNameParameterHandler' | ||
import { FormParameterHandler } from './FormParameterHandler' | ||
import { BodyParameterHandler } from './BodyParameterHandler' | ||
import { PathParameterHandler } from './PathParameterHandler' | ||
import { ModelMapping } from "./ModelRegistry"; | ||
import { ModelRegistry } from "./ModelRegistry"; | ||
import { HeaderParameter } from "./HeaderParameterHandler"; | ||
|
||
export class ModelArgumentParameter extends Parameter { | ||
static Type = 'request_map' | ||
|
||
constructor(public readonly index: number, public readonly source: string, public readonly target: any) { | ||
super(index, ModelArgumentParameter.Type) | ||
} | ||
} | ||
|
||
export class ModelParameterHandler implements ParameterHandler<ModelArgumentParameter, Record<string, unknown>> { | ||
constructor( | ||
readonly parameter: ModelArgumentParameter, | ||
readonly mappings: ModelMapping[], | ||
readonly headerParameterHandler: HeaderParameterHandler, | ||
readonly queryParameterHandler: QueryParameterHandler, | ||
readonly queryNameParameterHandler: QueryNameParameterHandler, | ||
readonly pathParameterHandler: PathParameterHandler, | ||
readonly formParameterHandler: FormParameterHandler, | ||
readonly bodyParameterHandler: BodyParameterHandler | ||
) {} | ||
|
||
apply(requestValues: RequestParameterization, value: any): void { | ||
for (const map of this.mappings) { | ||
let v | ||
|
||
if (map.type === 'property') { | ||
v = value[map.key] | ||
} else if (map.type === 'method') { | ||
v = (value[map.key] as Function)() | ||
} else if (map.type === 'static') { | ||
const source = this.parameter.target[map.key] | ||
|
||
if (typeof source === 'function') { | ||
v = this.parameter.target[map.key]() | ||
} else { | ||
v = this.parameter.target[map.key] | ||
} | ||
} | ||
|
||
switch (map.to) { | ||
case 'header': | ||
this.headerParameterHandler.apply(requestValues, v) | ||
break | ||
case 'query': | ||
this.queryParameterHandler.apply(requestValues, v) | ||
break | ||
case 'queryname': | ||
this.queryNameParameterHandler.apply(requestValues, v) | ||
break | ||
case 'param': | ||
this.pathParameterHandler.apply(requestValues, v) | ||
break | ||
case 'field': | ||
this.formParameterHandler.apply(requestValues, v) | ||
break | ||
case 'body': | ||
this.bodyParameterHandler.apply(requestValues, v) | ||
break | ||
} | ||
} | ||
} | ||
} | ||
|
||
export class ModelArgumentParameterHandlerFactory implements ParameterHandlerFactory<ModelArgumentParameter, object> { | ||
static INSTANCE: ModelArgumentParameterHandlerFactory = new ModelArgumentParameterHandlerFactory() | ||
|
||
forType = (): string => ModelArgumentParameter.Type | ||
|
||
provide( | ||
drizzle: Drizzle, | ||
requestFactory: RequestFactory, | ||
p: ModelArgumentParameter | ||
): ParameterHandler<ModelArgumentParameter, object> { | ||
const mapping = ModelRegistry.mapping(p.target, p.source) | ||
const mappings = ModelRegistry.mappingsForType(p.target) | ||
|
||
return new ModelParameterHandler( | ||
p, | ||
mappings, | ||
ModelRegistry.register().(p.type), new HeaderParameterHandler(mapping.parameter as HeaderParameter)) | ||
} | ||
} |
96 changes: 96 additions & 0 deletions
96
pkgs/core/builtin/parameterhandlers/handlers/ModelRegistry.ts
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 |
---|---|---|
@@ -0,0 +1,96 @@ | ||
import { Class } from '../../../internal' | ||
import { pathParameterRegex } from '../../../internal' | ||
import { ToDest } from '../../../decorators/To' | ||
import { Parameter } from '../Parameter' | ||
import { HeaderParameter } from './HeaderParameterHandler' | ||
import { QueryParameter } from './QueryParameterHandler' | ||
import { QueryNameParameter } from './QueryNameParameterHandler' | ||
import { PathParameter } from './PathParameterHandler' | ||
import { FormParameter } from './FormParameterHandler' | ||
import { BodyParameter } from './BodyParameterHandler' | ||
|
||
export type ModelMapSourceTypes = 'method' | 'property' | 'static' | ||
export type ModelMapping = { to: ToDest; key: string; source: string; type: ModelMapSourceTypes; parameter: Parameter } | ||
export type RequestModelMappings = Map<Class, Array<ModelMapping>> | ||
|
||
export class ModelRegistry { | ||
private static readonly data: RequestModelMappings = new Map() | ||
|
||
static register( | ||
target: Class, | ||
to: ToDest, | ||
key: string, | ||
source: string, | ||
type: ModelMapSourceTypes, | ||
parameter: Parameter | ||
): void { | ||
const current = ModelRegistry.data.get(target) | ||
|
||
if (!current) { | ||
ModelRegistry.data.set(target, [ | ||
{ | ||
key, | ||
type, | ||
to, | ||
parameter, | ||
source | ||
} | ||
]) | ||
return | ||
} | ||
|
||
current.push({ | ||
key, | ||
type, | ||
to, | ||
parameter, | ||
source | ||
}) | ||
} | ||
|
||
static mappingsForType(type: Class): Array<ModelMapping> { | ||
return ModelRegistry.data.get(type) ?? [] | ||
} | ||
|
||
static mapping(type: Class, key: string): ModelMapping | undefined { | ||
return (ModelRegistry.data.get(type) ?? []).find(x => x.key === key) | ||
} | ||
} | ||
|
||
export function createModelDecorator(source: string, to: ToDest, key?: string) { | ||
return function (target: object | Class, prop: string, descriptor?: PropertyDescriptor): void { | ||
const type: ModelMapSourceTypes = typeof target === 'function' ? 'static' : descriptor ? 'method' : 'property' | ||
const k = key || prop | ||
let parameter: Parameter | ||
|
||
switch (to) { | ||
case 'header': | ||
parameter = new HeaderParameter(k, -1) | ||
break | ||
case 'query': | ||
parameter = new QueryParameter(k, -1) | ||
break | ||
case 'queryname': | ||
parameter = new QueryNameParameter(-1) | ||
break | ||
case 'param': | ||
parameter = new PathParameter(k, pathParameterRegex(k), -1) | ||
break | ||
case 'field': | ||
parameter = new FormParameter(k, -1) | ||
break | ||
case 'body': | ||
parameter = new BodyParameter(-1) | ||
break | ||
} | ||
|
||
ModelRegistry.register( | ||
typeof target === 'function' ? (target as Class) : (target.constructor as Class), | ||
to, | ||
k, | ||
source, | ||
type, | ||
parameter | ||
) | ||
} | ||
} |
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
Oops, something went wrong.