대충이런느낌
This commit is contained in:
+96
-34
@@ -94,14 +94,14 @@ export abstract class APIExecuter<R extends ValidResponse, E extends InvalidResp
|
||||
}
|
||||
|
||||
let isValidRoute = true;
|
||||
if(index !== -1 && index !== this.postDecorator.length){
|
||||
if (index !== -1 && index !== this.postDecorator.length) {
|
||||
isValidRoute = false;
|
||||
index = clamp(index, 0, this.postDecorator.length);
|
||||
}
|
||||
|
||||
for (let i = index - 1; i >= 0; i--) {
|
||||
const proc = this.postDecorator[i];
|
||||
if(!proc){
|
||||
if (!proc) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ export abstract class APIExecuter<R extends ValidResponse, E extends InvalidResp
|
||||
const ctx = await this.preCtx(expressReq, expressRes);
|
||||
if (Array.isArray(ctx)) {
|
||||
const [invalidProc, errCtx, idx] = ctx;
|
||||
if (idx == 0){
|
||||
if (idx == 0) {
|
||||
expressRes.json(invalidProc);
|
||||
return;
|
||||
}
|
||||
@@ -147,7 +147,7 @@ export abstract class APIExecuter<R extends ValidResponse, E extends InvalidResp
|
||||
const result = await this.api(query, ctx, expressReq, expressRes);
|
||||
const postResult = await this.postCtx(ctx, expressReq, expressRes);
|
||||
if (postResult !== undefined) {
|
||||
if(result === true){
|
||||
if (result === true) {
|
||||
//NOTE: 이미 api에서 response를 보낸 특이 케이스.
|
||||
return;
|
||||
}
|
||||
@@ -163,7 +163,7 @@ export abstract class APIExecuter<R extends ValidResponse, E extends InvalidResp
|
||||
}
|
||||
}
|
||||
|
||||
interface ngAPIExecuter<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain>{
|
||||
interface ngAPIExecuter<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> {
|
||||
(query: Q, ctx: ResolveChain<PD>, expressReq: Request, expressRes: Response): Promise<R | E | true>;
|
||||
httpMethod: HttpMethod;
|
||||
argValidator?: ValidatorType<Q>;
|
||||
@@ -171,19 +171,38 @@ interface ngAPIExecuter<R extends ValidResponse, E extends InvalidResponse, Q ex
|
||||
postDecorator: (ProcDecorator<any, any> | undefined)[];
|
||||
}
|
||||
|
||||
interface ngAPIGenerator<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType>{
|
||||
<PD extends ProcDecoratorChain>(procDecoratorChain: PD): ngAPIExecuter<R, E, Q, PD>;
|
||||
export interface iAPI_GET<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD> {
|
||||
httpMethod: 'get';
|
||||
}
|
||||
|
||||
function ngGenerateAPI<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain>(httpMethod: HttpMethod, args: {
|
||||
argValidator?: ValidatorType<Q>,
|
||||
export interface iAPI_POST<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD> {
|
||||
httpMethod: 'post';
|
||||
}
|
||||
|
||||
export interface iAPI_PUT<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD> {
|
||||
httpMethod: 'put';
|
||||
}
|
||||
|
||||
export interface iAPI_DELETE<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD> {
|
||||
httpMethod: 'delete';
|
||||
}
|
||||
|
||||
export interface iAPI_PATCH<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD> {
|
||||
httpMethod: 'patch';
|
||||
}
|
||||
|
||||
export interface iAPI_HEAD<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD> {
|
||||
httpMethod: 'head';
|
||||
}
|
||||
|
||||
function ngGenerateAPI<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain>(httpMethod: HttpMethod,
|
||||
argValidator: ValidatorType<Q> | undefined,
|
||||
procDecoratorChain: PD,
|
||||
callback: (query: Q, ctx: ResolveChain<PD>, expressReq: Request, expressRes: Response) => Promise<R | E | true>,
|
||||
}): ngAPIExecuter<R, E, Q, PD>{
|
||||
const { argValidator, procDecoratorChain, callback } = args;
|
||||
): ngAPIExecuter<R, E, Q, PD> {
|
||||
const preDecorator: ProcDecorator<any, any>[] = [];
|
||||
const postDecorator: (ProcDecorator<any, any> | undefined)[] = [];
|
||||
if(procDecoratorChain){
|
||||
if (procDecoratorChain) {
|
||||
for (const procGen of procDecoratorChain) {
|
||||
const proc = procGen();
|
||||
if (Array.isArray(proc)) {
|
||||
@@ -208,41 +227,84 @@ function ngGenerateAPI<R extends ValidResponse, E extends InvalidResponse, Q ext
|
||||
);
|
||||
}
|
||||
|
||||
export function ngGET<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType>(argValidator?: ValidatorType<Q>){
|
||||
export function ngGET<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType>(argValidator?: ValidatorType<Q>) {
|
||||
return <PD extends ProcDecoratorChain>(procDecoratorChain: PD) => {
|
||||
return (callback: (query: Q, ctx: ResolveChain<PD>, expressReq: Request, expressRes: Response) => Promise<R | E | true>) => {
|
||||
return ngGenerateAPI<R, E, Q, PD>('get', {
|
||||
return ngGenerateAPI<R, E, Q, PD>(
|
||||
'get',
|
||||
argValidator,
|
||||
procDecoratorChain,
|
||||
callback,
|
||||
});
|
||||
) as iAPI_GET<R, E, Q, PD>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface ngGET<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD>{
|
||||
httpMethod: 'get';
|
||||
export function ngPOST<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType>(argValidator?: ValidatorType<Q>) {
|
||||
return <PD extends ProcDecoratorChain>(procDecoratorChain: PD) => {
|
||||
return (callback: (query: Q, ctx: ResolveChain<PD>, expressReq: Request, expressRes: Response) => Promise<R | E | true>) => {
|
||||
return ngGenerateAPI<R, E, Q, PD>(
|
||||
'post',
|
||||
argValidator,
|
||||
procDecoratorChain,
|
||||
callback,
|
||||
) as iAPI_POST<R, E, Q, PD>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface ngPOST<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD>{
|
||||
httpMethod: 'post';
|
||||
export function ngPUT<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType>(argValidator?: ValidatorType<Q>) {
|
||||
return <PD extends ProcDecoratorChain>(procDecoratorChain: PD) => {
|
||||
return (callback: (query: Q, ctx: ResolveChain<PD>, expressReq: Request, expressRes: Response) => Promise<R | E | true>) => {
|
||||
return ngGenerateAPI<R, E, Q, PD>(
|
||||
'put',
|
||||
argValidator,
|
||||
procDecoratorChain,
|
||||
callback,
|
||||
) as iAPI_PUT<R, E, Q, PD>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface ngPUT<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD>{
|
||||
httpMethod: 'put';
|
||||
export function ngDELETE<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType>(argValidator?: ValidatorType<Q>) {
|
||||
return <PD extends ProcDecoratorChain>(procDecoratorChain: PD) => {
|
||||
return (callback: (query: Q, ctx: ResolveChain<PD>, expressReq: Request, expressRes: Response) => Promise<R | E | true>) => {
|
||||
return ngGenerateAPI<R, E, Q, PD>(
|
||||
'delete',
|
||||
argValidator,
|
||||
procDecoratorChain,
|
||||
callback,
|
||||
) as iAPI_DELETE<R, E, Q, PD>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface ngDELETE<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD>{
|
||||
httpMethod: 'delete';
|
||||
export function ngPATCH<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType>(argValidator?: ValidatorType<Q>) {
|
||||
return <PD extends ProcDecoratorChain>(procDecoratorChain: PD) => {
|
||||
return (callback: (query: Q, ctx: ResolveChain<PD>, expressReq: Request, expressRes: Response) => Promise<R | E | true>) => {
|
||||
return ngGenerateAPI<R, E, Q, PD>(
|
||||
'patch',
|
||||
argValidator,
|
||||
procDecoratorChain,
|
||||
callback,
|
||||
) as iAPI_PATCH<R, E, Q, PD>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface ngPATCH<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD>{
|
||||
httpMethod: 'patch';
|
||||
export function ngHEAD<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType>(argValidator?: ValidatorType<Q>) {
|
||||
return <PD extends ProcDecoratorChain>(procDecoratorChain: PD) => {
|
||||
return (callback: (query: Q, ctx: ResolveChain<PD>, expressReq: Request, expressRes: Response) => Promise<R | E | true>) => {
|
||||
return ngGenerateAPI<R, E, Q, PD>(
|
||||
'head',
|
||||
argValidator,
|
||||
procDecoratorChain,
|
||||
callback,
|
||||
) as iAPI_HEAD<R, E, Q, PD>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface ngHEAD<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends ngAPIExecuter<R, E, Q, PD>{
|
||||
httpMethod: 'head';
|
||||
}
|
||||
|
||||
|
||||
export abstract class APIBodyParseExecuter<R extends ValidResponse, E extends InvalidResponse, Q extends RawArgType, PD extends ProcDecoratorChain> extends APIExecuter<R, E, Q, PD>{
|
||||
@@ -321,17 +383,17 @@ export type ClassType<T> = new (...args: any[]) => T;
|
||||
|
||||
export type APIServerType<T extends Callable> =
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
T extends GetAPICallT<infer Q, infer R, infer E> ? ClassType<GET<R, E, Q, any>> :
|
||||
T extends GetAPICallT<infer Q, infer R, infer E> ? iAPI_GET<R, E, Q, any> :
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
T extends PostAPICallT<infer Q, infer R, infer E> ? ClassType<POST<R, E, Q, any>> :
|
||||
T extends PostAPICallT<infer Q, infer R, infer E> ? iAPI_POST<R, E, Q, any> :
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
T extends PutAPICallT<infer Q, infer R, infer E> ? ClassType<PUT<R, E, Q, any>> :
|
||||
T extends PutAPICallT<infer Q, infer R, infer E> ? iAPI_PUT<R, E, Q, any> :
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
T extends DeleteAPICallT<infer Q, infer R, infer E> ? ClassType<DELETE<R, E, Q, any>> :
|
||||
T extends DeleteAPICallT<infer Q, infer R, infer E> ? iAPI_DELETE<R, E, Q, any> :
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
T extends PatchAPICallT<infer Q, infer R, infer E> ? ClassType<PATCH<R, E, Q, any>> :
|
||||
T extends PatchAPICallT<infer Q, infer R, infer E> ? iAPI_PATCH<R, E, Q, any> :
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
T extends HeadAPICallT<infer Q, infer R, infer E> ? ClassType<HEAD<R, E, Q, any>> :
|
||||
T extends HeadAPICallT<infer Q, infer R, infer E> ? iAPI_HEAD<R, E, Q, any> :
|
||||
never;
|
||||
export type APINamespaceType<T extends DefAPINamespace> = {
|
||||
[K in keyof T]:
|
||||
|
||||
Reference in New Issue
Block a user