Skip to content

Commit f6679de

Browse files
authored
feat: multi host decorator (#68)
1 parent 4bba399 commit f6679de

15 files changed

Lines changed: 184 additions & 60 deletions

File tree

core/controller-decorator/src/decorator/http/Host.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,31 @@ import ControllerInfoUtil from '../../util/ControllerInfoUtil';
22
import { EggProtoImplClass } from '@eggjs/core-decorator';
33
import MethodInfoUtil from '../../util/MethodInfoUtil';
44
import assert from 'assert';
5+
import { HostType } from '../../model';
6+
7+
export function Host(host: HostType) {
8+
9+
function parseHost(): string[] {
10+
return Array.isArray(host) ? host : [ host ];
11+
}
512

6-
export function Host(host: string) {
713
function classHost(constructor: EggProtoImplClass) {
8-
ControllerInfoUtil.addControllerHost(host, constructor);
14+
ControllerInfoUtil.addControllerHosts(parseHost(), constructor);
915
}
1016

11-
function methodHOst(target: any, propertyKey: PropertyKey) {
17+
function methodHost(target: any, propertyKey: PropertyKey) {
1218
assert(typeof propertyKey === 'string',
1319
`[controller/${target.name}] expect method name be typeof string, but now is ${String(propertyKey)}`);
1420
const controllerClazz = target.constructor as EggProtoImplClass;
1521
const methodName = propertyKey as string;
16-
17-
MethodInfoUtil.setMethodHost(host, controllerClazz, methodName);
22+
MethodInfoUtil.setMethodHosts(parseHost(), controllerClazz, methodName);
1823
}
1924

2025
return function(target: any, propertyKey?: PropertyKey) {
2126
if (propertyKey === undefined) {
2227
classHost(target);
2328
} else {
24-
methodHOst(target, propertyKey);
29+
methodHost(target, propertyKey);
2530
}
2631
};
2732
}

core/controller-decorator/src/impl/http/HTTPControllerMetaBuilder.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ export class HTTPControllerMetaBuilder {
4343
const protoName = property!.name as string;
4444
const needAcl = ControllerInfoUtil.hasControllerAcl(this.clazz);
4545
const aclCode = ControllerInfoUtil.getControllerAcl(this.clazz);
46-
const host = ControllerInfoUtil.getControllerHost(this.clazz);
46+
const hosts = ControllerInfoUtil.getControllerHosts(this.clazz);
4747
const metadata = new HTTPControllerMeta(
48-
clazzName, protoName, controllerName, httpPath, httpMiddlewares, methods, needAcl, aclCode, host);
48+
clazzName, protoName, controllerName, httpPath, httpMiddlewares, methods, needAcl, aclCode, hosts);
4949
ControllerMetadataUtil.setControllerMetadata(this.clazz, metadata);
5050
for (const method of metadata.methods) {
5151
const realPath = metadata.getMethodRealPath(method);
@@ -63,4 +63,3 @@ export class HTTPControllerMetaBuilder {
6363
}
6464

6565
ControllerMetaBuilderFactory.registerControllerMetaBuilder(ControllerType.HTTP, HTTPControllerMetaBuilder.create);
66-

core/controller-decorator/src/impl/http/HTTPControllerMethodMetaBuilder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,13 @@ export class HTTPControllerMethodMetaBuilder {
105105
const middlewares = MethodInfoUtil.getMethodMiddlewares(this.clazz, this.methodName);
106106
const needAcl = MethodInfoUtil.hasMethodAcl(this.clazz, this.methodName);
107107
const aclCode = MethodInfoUtil.getMethodAcl(this.clazz, this.methodName);
108-
const host = MethodInfoUtil.getMethodHost(this.clazz, this.methodName);
108+
const hosts = MethodInfoUtil.getMethodHosts(this.clazz, this.methodName);
109109
const realPath = parentPath
110110
? path.posix.join(parentPath, httpPath)
111111
: httpPath;
112112
const paramTypeMap = this.buildParamType(realPath);
113113
const priority = this.getPriority();
114114
return new HTTPMethodMeta(
115-
this.methodName, httpPath!, httpMethod!, middlewares, contextIndex, paramTypeMap, priority, needAcl, aclCode, host);
115+
this.methodName, httpPath!, httpMethod!, middlewares, contextIndex, paramTypeMap, priority, needAcl, aclCode, hosts);
116116
}
117117
}

core/controller-decorator/src/model/HTTPControllerMeta.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class HTTPControllerMeta implements ControllerMetadata {
1414
public readonly methods: readonly HTTPMethodMeta[];
1515
public readonly needAcl: boolean;
1616
public readonly aclCode?: string;
17-
public readonly host?: string;
17+
public readonly hosts?: string[];
1818

1919
constructor(
2020
className: string,
@@ -25,7 +25,7 @@ export class HTTPControllerMeta implements ControllerMetadata {
2525
methods: HTTPMethodMeta[],
2626
needAcl: boolean,
2727
aclCode: string | undefined,
28-
host: string | undefined,
28+
hosts: string[] | undefined,
2929
) {
3030
this.protoName = protoName;
3131
this.controllerName = controllerName;
@@ -35,7 +35,7 @@ export class HTTPControllerMeta implements ControllerMetadata {
3535
this.methods = methods;
3636
this.needAcl = needAcl;
3737
this.aclCode = aclCode;
38-
this.host = host;
38+
this.hosts = hosts;
3939
}
4040

4141
getMethodRealPath(method: HTTPMethodMeta) {
@@ -45,11 +45,11 @@ export class HTTPControllerMeta implements ControllerMetadata {
4545
return method.path;
4646
}
4747

48-
getMethodHost(method: HTTPMethodMeta): string | undefined {
49-
if (this.host) {
50-
return this.host;
48+
getMethodHosts(method: HTTPMethodMeta): string[] | undefined {
49+
if (this.hosts) {
50+
return this.hosts;
5151
}
52-
return method.host;
52+
return method.hosts;
5353
}
5454

5555
getMethodName(method: HTTPMethodMeta) {

core/controller-decorator/src/model/HTTPMethodMeta.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class HTTPMethodMeta implements MethodMeta {
7373
public readonly priority: number;
7474
public readonly needAcL: boolean;
7575
public readonly aclCode: string | undefined;
76-
public readonly host: string | undefined;
76+
public readonly hosts: string[] | undefined;
7777

7878
constructor(
7979
name: string,
@@ -85,7 +85,7 @@ export class HTTPMethodMeta implements MethodMeta {
8585
priority: number,
8686
needAcl: boolean,
8787
aclCode: string | undefined,
88-
host: string | undefined,
88+
hosts: string[] | undefined,
8989
) {
9090
this.name = name;
9191
this.path = path;
@@ -96,7 +96,7 @@ export class HTTPMethodMeta implements MethodMeta {
9696
this.priority = priority;
9797
this.needAcL = needAcl;
9898
this.aclCode = aclCode;
99-
this.host = host;
99+
this.hosts = hosts;
100100
}
101101
}
102102

core/controller-decorator/src/model/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export enum ControllerType {
1010
MGW_RPC = 'MGW_RPC',
1111
}
1212

13+
export type HostType = string | string [];
14+
1315
export type ControllerTypeLike = ControllerType | string;
1416

1517
export enum MethodType {

core/controller-decorator/src/util/ControllerInfoUtil.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ export default class ControllerInfoUtil {
4545
return MetadataUtil.getMetaData(CONTROLLER_ACL, clazz);
4646
}
4747

48-
static addControllerHost(host: string, clazz: EggProtoImplClass) {
49-
MetadataUtil.defineMetaData(CONTROLLER_HOST, host, clazz);
48+
static addControllerHosts(hosts: string[], clazz: EggProtoImplClass) {
49+
MetadataUtil.defineMetaData(CONTROLLER_HOST, hosts, clazz);
5050
}
5151

52-
static getControllerHost(clazz: EggProtoImplClass): string | undefined {
52+
static getControllerHosts(clazz: EggProtoImplClass): string[] | undefined {
5353
return MetadataUtil.getMetaData(CONTROLLER_HOST, clazz);
5454
}
5555
}

core/controller-decorator/src/util/MethodInfoUtil.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const METHOD_CONTEXT_INDEX = Symbol.for('EggPrototype#controller#method#context'
88
const METHOD_MIDDLEWARES = Symbol.for('EggPrototype#method#middlewares');
99
const METHOD_ACL = Symbol.for('EggPrototype#method#acl');
1010

11-
type METHOD_MAP = Map<string, ControllerTypeLike>;
11+
type METHOD_MAP = Map<string, ControllerTypeLike | string[]>;
1212
type MethodContextIndexMap = Map<string, number>;
1313
type MethodMiddlewareMap = Map<string, MiddlewareFunc[]>;
1414
type MethodAclMap = Map<string, string | undefined>;
@@ -21,7 +21,7 @@ export default class MethodInfoUtil {
2121

2222
static getMethodControllerType(clazz: EggProtoImplClass, methodName: string): ControllerTypeLike | undefined {
2323
const methodControllerMap: METHOD_MAP | undefined = MetadataUtil.getMetaData(METHOD_CONTROLLER_TYPE_MAP, clazz);
24-
return methodControllerMap?.get(methodName);
24+
return methodControllerMap?.get(methodName) as ControllerTypeLike | undefined;
2525
}
2626

2727
static setMethodContextIndexInArgs(index: number, clazz: EggProtoImplClass, methodName: string) {
@@ -60,13 +60,13 @@ export default class MethodInfoUtil {
6060
return methodAclMap?.get(methodName);
6161
}
6262

63-
static setMethodHost(host: string, clazz: EggProtoImplClass, methodName: string) {
63+
static setMethodHosts(hosts: string[], clazz: EggProtoImplClass, methodName: string) {
6464
const methodControllerMap: METHOD_MAP = MetadataUtil.initOwnMapMetaData(METHOD_CONTROLLER_HOST, clazz, new Map());
65-
methodControllerMap.set(methodName, host);
65+
methodControllerMap.set(methodName, hosts);
6666
}
6767

68-
static getMethodHost(clazz: EggProtoImplClass, methodName: string): string | undefined {
68+
static getMethodHosts(clazz: EggProtoImplClass, methodName: string): string[] | undefined {
6969
const methodControllerMap: METHOD_MAP | undefined = MetadataUtil.getMetaData(METHOD_CONTROLLER_HOST, clazz);
70-
return methodControllerMap?.get(methodName);
70+
return methodControllerMap?.get(methodName) as string[] | undefined;
7171
}
7272
}

core/controller-decorator/test/Acl.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import assert from 'assert';
22
import { AclController } from './fixtures/AclController';
33
import { ControllerMetaBuilderFactory } from '../src/builder/ControllerMetaBuilderFactory';
4-
import { ControllerType } from '../src/model';
4+
import { ControllerType, HTTPControllerMeta } from '../src/model';
55

66
describe('test/Context.test.ts', () => {
77
it('should work', () => {

core/controller-decorator/test/http/Host.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import MethodInfoUtil from '../../src/util/MethodInfoUtil';
55

66
describe('test/Host.test.ts', () => {
77
it('controller Host work', () => {
8-
const controllerHost = ControllerInfoUtil.getControllerHost(HostController);
9-
assert(controllerHost === 'foo.eggjs.com');
8+
const controllerHost = ControllerInfoUtil.getControllerHosts(HostController);
9+
assert(controllerHost![0] === 'foo.eggjs.com');
1010
});
1111

1212
it('method Host work', () => {
13-
const methodHost = MethodInfoUtil.getMethodHost(HostController, 'bar');
14-
assert(methodHost === 'bar.eggjs.com');
13+
const methodHost = MethodInfoUtil.getMethodHosts(HostController, 'bar');
14+
assert(methodHost![0] === 'bar.eggjs.com');
1515
});
1616
});

0 commit comments

Comments
 (0)