diff --git a/server/api/decorator/ParseUserLevel.ts b/server/api/decorator/ParseUserLevel.ts new file mode 100644 index 0000000..10c6fef --- /dev/null +++ b/server/api/decorator/ParseUserLevel.ts @@ -0,0 +1,32 @@ +import { type BaseConverter, InvalidConversion } from "./base"; +import { Request, Response, NextFunction } from "express"; + + +interface GameLoginIn { + userID: number; + [key: string]: unknown; +} + +interface UserLevelOut { + userID: number; + userLevel: number; + [key: string]: unknown; +} + +/*export class ReqGameLogin0 extends BaseConverter { + override transform(inCtx: SessionIn, request: Request, response: Response): SessionOut | InvalidConversion { + return { + generalID: inCtx.userID * 4, + ...inCtx, + } + } +}*/ + +export function ParseUserLevel(): BaseConverter { + return (inCtx: GameLoginIn, request: Request, response: Response): UserLevelOut | InvalidConversion => { + return { + userLevel: 123, + ...inCtx, + } + } +} \ No newline at end of file diff --git a/server/api/decorator/base.d.ts b/server/api/decorator/base.d.ts new file mode 100644 index 0000000..deb54ec --- /dev/null +++ b/server/api/decorator/base.d.ts @@ -0,0 +1,18 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any + +type C = (...args: any) => any; +type Rev = ()=> A; + +type ChainResult = + T extends [infer R0 extends C] ? ReturnType : + T extends [infer R1 extends C, infer R0 extends C] ? ReturnType & ReturnType : + T extends [infer R2, infer R1, ...infer RX] ? ChainResult2, ChainResult<[Rev>, ...RX]>> : + never; + +type ChainResult2 = T extends ChainResult<[A, B]> ? ANS: never; + +declare function DeclConverter(r0: R0): [[R0], ReturnType]; +declare function DeclConverter(r0: R0, r1: R1): [[R0, R1], ChainResult<[R0, R1]>]; +declare function DeclConverter(r0: R0, r1: R1, r2:R2) : [[R0, R1, R2], ChainResult<[R0, R1, R2]>]; +declare function DeclConverter(r0: R0, r1: R1, r2:R2, r3:R3) : [[R0, R1, R2, R3], ChainResult<[R0, R1, R2, R3]>]; +declare function DeclConverter(r0: R0, r1: R1, r2:R2, r3:R3, r4:R4) : [[R0, R1, R2, R3, R4], ChainResult<[R0, R1, R2, R3, R4]>]; diff --git a/server/api/decorator/base.ts b/server/api/decorator/base.ts new file mode 100644 index 0000000..4e961e4 --- /dev/null +++ b/server/api/decorator/base.ts @@ -0,0 +1,44 @@ +import { Request, Response, NextFunction } from "express"; +import { ReqLogin } from "./reqLogin"; +import { ReqGameLogin } from "./reqGameLogin"; +import { ParseUserLevel } from "./ParseUserLevel"; + +export type InvalidConversion = { + isInvalid: true; + reason?: string; + alreadyProcessed?: boolean; +} + +export interface BaseConverter{ + (inCtx: In, request: Request, response: Response): Out | InvalidConversion; +} + +function Chain(args: In, request: Request, response: Response) { + return { + next: (inner: (payload: In, request: Request, response: Response) => Out) => { + return Chain(inner(args, request, response), request, response); + } + } +} + +type ExtendsType = T extends U ? T : never; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any + + +//export function DeclConverter(): [[], Record]; + + +//TODO: ReqLogin이 위에 있을 경우에만 통과시켜야..? +const a = DeclConverter( + ParseUserLevel(), + ReqLogin(), + ReqGameLogin(), +) + +type b = Exclude<(typeof a)[1], InvalidConversion>; +const c: b = undefined as unknown as b; +//흠.... +console.log(c.generalID); +console.log(c.userID); +console.log(c.userLevel); \ No newline at end of file diff --git a/server/api/decorator/reqGameLogin.ts b/server/api/decorator/reqGameLogin.ts new file mode 100644 index 0000000..c1ce74a --- /dev/null +++ b/server/api/decorator/reqGameLogin.ts @@ -0,0 +1,32 @@ +import { type BaseConverter, InvalidConversion } from "./base"; +import { Request, Response, NextFunction } from "express"; + + +interface GameLoginIn { + userID: number; + [key: string]: unknown; +} + +interface GameLoginOut { + userID: number; + generalID: number; + [key: string]: unknown; +} + +/*export class ReqGameLogin0 extends BaseConverter { + override transform(inCtx: SessionIn, request: Request, response: Response): SessionOut | InvalidConversion { + return { + generalID: inCtx.userID * 4, + ...inCtx, + } + } +}*/ + +export function ReqGameLogin(): BaseConverter { + return (inCtx: GameLoginIn, request: Request, response: Response): GameLoginOut | InvalidConversion => { + return { + generalID: inCtx.userID * 4, + ...inCtx, + } + } +} \ No newline at end of file diff --git a/server/api/decorator/reqGameSession.ts b/server/api/decorator/reqGameSession.ts deleted file mode 100644 index e69de29..0000000 diff --git a/server/api/decorator/reqLogin.ts b/server/api/decorator/reqLogin.ts new file mode 100644 index 0000000..3c99d48 --- /dev/null +++ b/server/api/decorator/reqLogin.ts @@ -0,0 +1,42 @@ +import { BaseConverter, InvalidConversion } from "./base"; +import { Request, Response, NextFunction } from "express"; + + +interface SessionIn { + [key: string]: unknown; +} + +interface SessionOut { + userID: number; + [key: string]: unknown; +} + +/*export class ReqLogin extends BaseConverter { + override transform(inCtx: SessionIn, request: Request, response: Response): SessionOut | InvalidConversion { + if(request.params['something'] === 'haha'){ + return { + isInvalid: true, + reason: 'haha', + } + } + return { + generalID: inCtx.userID * 4, + ...inCtx, + } + } +}*/ + +export function ReqLogin(): BaseConverter { + return (inCtx: SessionIn, request: Request, response: Response): SessionOut | InvalidConversion => { + if(request.params['something'] === 'haha'){ + return { + isInvalid: true, + reason: 'haha', + } + } + return { + userID: 123, + ...inCtx, + } + } +} \ No newline at end of file diff --git a/server/api/decorator/reqSession.ts b/server/api/decorator/reqSession.ts deleted file mode 100644 index e69de29..0000000