Skip to content

Commit b34f47e

Browse files
committed
Merge branch 'ivanpadavan-controller-inheritance' into next
2 parents b4bf77c + ddee6cd commit b34f47e

File tree

5 files changed

+107
-2
lines changed

5 files changed

+107
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import "reflect-metadata";
2+
import * as express from "express";
3+
import {useExpressServer} from "../../src/index";
4+
5+
let app = express(); // create express server
6+
useExpressServer(app, {
7+
controllers: [__dirname + "/controllers/*{.js,.ts}"] // register controllers routes in our express app
8+
});
9+
app.listen(3001); // run express app
10+
11+
console.log("Express server is running on port 3001. Open http://localhost:3001/blogs/ or http://localhost:3002/posts/");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import {Request} from "express";
2+
import {Get} from "../../../src/decorator/Get";
3+
import {Req} from "../../../src/index";
4+
import {Post} from "../../../src/decorator/Post";
5+
import {Put} from "../../../src/decorator/Put";
6+
import {Patch} from "../../../src/decorator/Patch";
7+
import {Delete} from "../../../src/decorator/Delete";
8+
9+
export class BaseControllerClass {
10+
name: string;
11+
constructor(name: string) {
12+
this.name = name;
13+
}
14+
15+
@Get()
16+
getAll() {
17+
return [
18+
{id: 1, name: `First ${this.name}!`},
19+
{id: 2, name: `Second ${this.name}!`}
20+
];
21+
}
22+
23+
@Get("/:id")
24+
getOne() {
25+
return {id: 1, name: `First ${this.name}!`};
26+
}
27+
28+
@Post("")
29+
post(@Req() request: Request) {
30+
let entity = JSON.stringify(request.body);
31+
return `${this.name} ${entity} !saved!`;
32+
}
33+
34+
@Put("/:id")
35+
put(@Req() request: Request) {
36+
return `${this.name} # ${request.params.id} has been putted!`;
37+
}
38+
39+
@Patch("/:id")
40+
patch(@Req() request: Request) {
41+
return `${this.name} # ${request.params.id} has been patched!`;
42+
}
43+
44+
@Delete("/:id")
45+
remove(@Req() request: Request) {
46+
return `${this.name} # ${request.params.id} has been removed!`;
47+
}
48+
}
49+
50+
export function BaseController(name: string): { new(): BaseControllerClass } {
51+
return class extends BaseControllerClass {
52+
constructor() {
53+
super(name);
54+
}
55+
};
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import {JsonController} from "../../../src/decorator/JsonController";
2+
import {BaseController, BaseControllerClass} from "./BaseController";
3+
import {Get} from "../../../src/decorator/Get";
4+
5+
@JsonController("/blogs")
6+
export class BlogController extends BaseController("blog") {
7+
constructor() {
8+
super();
9+
}
10+
11+
@Get()
12+
getAll() {
13+
return [
14+
{id: 1, name: `First ${this.name}!`},
15+
{id: 2, name: `Second ${this.name}!`},
16+
{id: 3, name: `Third ${this.name}!`}
17+
];
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import {JsonController} from "../../../src/decorator/JsonController";
2+
import {BaseController, BaseControllerClass} from "./BaseController";
3+
4+
@JsonController("/posts")
5+
export class PostController extends BaseController("post") {}

src/metadata-builder/MetadataBuilder.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {ResponseHandlerMetadata} from "../metadata/ResponseHandleMetadata";
88
import { RoutingControllersOptions } from "../RoutingControllersOptions";
99
import {UseMetadata} from "../metadata/UseMetadata";
1010
import {getMetadataArgsStorage} from "../index";
11+
import {ActionMetadataArgs} from "../metadata/args/ActionMetadataArgs";
1112

1213
/**
1314
* Builds metadata from the given metadata arguments.
@@ -84,8 +85,21 @@ export class MetadataBuilder {
8485
* Creates action metadatas.
8586
*/
8687
protected createActions(controller: ControllerMetadata): ActionMetadata[] {
87-
return getMetadataArgsStorage()
88-
.filterActionsWithTarget(controller.target)
88+
let target = controller.target;
89+
let actionsWithTarget: ActionMetadataArgs[] = [];
90+
while (target) {
91+
actionsWithTarget.push(
92+
...getMetadataArgsStorage()
93+
.filterActionsWithTarget(target)
94+
.filter(action => {
95+
return actionsWithTarget
96+
.map(a => a.method)
97+
.indexOf(action.method) === -1;
98+
})
99+
);
100+
target = Object.getPrototypeOf(target);
101+
}
102+
return actionsWithTarget
89103
.map(actionArgs => {
90104
const action = new ActionMetadata(controller, actionArgs, this.options);
91105
action.options = {...controller.options, ...actionArgs.options};

0 commit comments

Comments
 (0)