@my-devkit/firebase 1.0.76 → 1.0.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{dist/aggregate.d.ts → aggregate.d.ts} +0 -0
- package/{dist/aggregate.js → aggregate.js} +0 -0
- package/{dist/aggregate.js.map → aggregate.js.map} +0 -0
- package/{dist/app-factory.d.ts → app-factory.d.ts} +0 -0
- package/{dist/app-factory.js → app-factory.js} +0 -0
- package/{dist/app-factory.js.map → app-factory.js.map} +0 -0
- package/{dist/bus.d.ts → bus.d.ts} +0 -0
- package/{dist/bus.js → bus.js} +0 -0
- package/{dist/bus.js.map → bus.js.map} +0 -0
- package/{dist/constants.d.ts → constants.d.ts} +0 -0
- package/{dist/constants.js → constants.js} +0 -0
- package/{dist/constants.js.map → constants.js.map} +0 -0
- package/{dist/context.d.ts → context.d.ts} +0 -0
- package/{dist/context.js → context.js} +0 -0
- package/{dist/context.js.map → context.js.map} +0 -0
- package/{dist/decorators → decorators}/controller/body.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/body.js +0 -0
- package/{dist/decorators → decorators}/controller/body.js.map +0 -0
- package/{dist/decorators → decorators}/controller/body.spec.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/body.spec.js +0 -0
- package/{dist/decorators → decorators}/controller/body.spec.js.map +0 -0
- package/{dist/decorators → decorators}/controller/controller.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/controller.js +0 -0
- package/{dist/decorators → decorators}/controller/controller.js.map +0 -0
- package/{dist/decorators → decorators}/controller/controller.spec.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/controller.spec.js +0 -0
- package/{dist/decorators → decorators}/controller/controller.spec.js.map +0 -0
- package/{dist/decorators → decorators}/controller/get.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/get.js +0 -0
- package/{dist/decorators → decorators}/controller/get.js.map +0 -0
- package/{dist/decorators → decorators}/controller/get.spec.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/get.spec.js +0 -0
- package/{dist/decorators → decorators}/controller/get.spec.js.map +0 -0
- package/{dist/decorators → decorators}/controller/index.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/index.js +0 -0
- package/{dist/decorators → decorators}/controller/index.js.map +0 -0
- package/{dist/decorators → decorators}/controller/param.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/param.js +0 -0
- package/{dist/decorators → decorators}/controller/param.js.map +0 -0
- package/{dist/decorators → decorators}/controller/param.spec.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/param.spec.js +0 -0
- package/{dist/decorators → decorators}/controller/param.spec.js.map +0 -0
- package/{dist/decorators → decorators}/controller/post.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/post.js +0 -0
- package/{dist/decorators → decorators}/controller/post.js.map +0 -0
- package/{dist/decorators → decorators}/controller/post.spec.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/post.spec.js +0 -0
- package/{dist/decorators → decorators}/controller/post.spec.js.map +0 -0
- package/{dist/decorators → decorators}/controller/query.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/query.js +0 -0
- package/{dist/decorators → decorators}/controller/query.js.map +0 -0
- package/{dist/decorators → decorators}/controller/query.spec.d.ts +0 -0
- package/{dist/decorators → decorators}/controller/query.spec.js +0 -0
- package/{dist/decorators → decorators}/controller/query.spec.js.map +0 -0
- package/{dist/decorators → decorators}/handler/command-handler.d.ts +0 -0
- package/{dist/decorators → decorators}/handler/command-handler.js +0 -0
- package/{dist/decorators → decorators}/handler/command-handler.js.map +0 -0
- package/{dist/decorators → decorators}/handler/command-handler.spec.d.ts +0 -0
- package/{dist/decorators → decorators}/handler/command-handler.spec.js +0 -0
- package/{dist/decorators → decorators}/handler/command-handler.spec.js.map +0 -0
- package/{dist/decorators → decorators}/handler/event-handler.d.ts +0 -0
- package/{dist/decorators → decorators}/handler/event-handler.js +0 -0
- package/{dist/decorators → decorators}/handler/event-handler.js.map +0 -0
- package/{dist/decorators → decorators}/handler/event-handler.spec.d.ts +0 -0
- package/{dist/decorators → decorators}/handler/event-handler.spec.js +0 -0
- package/{dist/decorators → decorators}/handler/event-handler.spec.js.map +0 -0
- package/{dist/decorators → decorators}/handler/index.d.ts +0 -0
- package/{dist/decorators → decorators}/handler/index.js +0 -0
- package/{dist/decorators → decorators}/handler/index.js.map +0 -0
- package/{dist/decorators → decorators}/index.d.ts +0 -0
- package/{dist/decorators → decorators}/index.js +0 -0
- package/{dist/decorators → decorators}/index.js.map +0 -0
- package/{dist/decorators → decorators}/injectable.d.ts +0 -0
- package/{dist/decorators → decorators}/injectable.js +0 -0
- package/{dist/decorators → decorators}/injectable.js.map +0 -0
- package/{dist/decorators → decorators}/module.d.ts +0 -0
- package/{dist/decorators → decorators}/module.js +0 -0
- package/{dist/decorators → decorators}/module.js.map +0 -0
- package/{dist/decorators → decorators}/transactional-client.d.ts +0 -0
- package/{dist/decorators → decorators}/transactional-client.js +0 -0
- package/{dist/decorators → decorators}/transactional-client.js.map +0 -0
- package/{dist/execution-mode-enum.d.ts → execution-mode-enum.d.ts} +0 -0
- package/{dist/execution-mode-enum.js → execution-mode-enum.js} +0 -0
- package/{dist/execution-mode-enum.js.map → execution-mode-enum.js.map} +0 -0
- package/{dist/firestore-client.d.ts → firestore-client.d.ts} +0 -0
- package/{dist/firestore-client.js → firestore-client.js} +0 -0
- package/{dist/firestore-client.js.map → firestore-client.js.map} +0 -0
- package/{dist/handler-helper.d.ts → handler-helper.d.ts} +0 -0
- package/{dist/handler-helper.js → handler-helper.js} +0 -0
- package/{dist/handler-helper.js.map → handler-helper.js.map} +0 -0
- package/{dist/index.d.ts → index.d.ts} +0 -0
- package/{dist/index.js → index.js} +0 -0
- package/{dist/index.js.map → index.js.map} +0 -0
- package/{dist/injector.d.ts → injector.d.ts} +0 -0
- package/{dist/injector.js → injector.js} +0 -0
- package/{dist/injector.js.map → injector.js.map} +0 -0
- package/{dist/interfaces → interfaces}/app-config.d.ts +0 -0
- package/{dist/interfaces → interfaces}/app-config.js +0 -0
- package/{dist/interfaces → interfaces}/app-config.js.map +0 -0
- package/{dist/interfaces → interfaces}/from-array.d.ts +0 -0
- package/{dist/interfaces → interfaces}/from-array.js +0 -0
- package/{dist/interfaces → interfaces}/from-array.js.map +0 -0
- package/{dist/interfaces → interfaces}/index.d.ts +0 -0
- package/{dist/interfaces → interfaces}/index.js +0 -0
- package/{dist/interfaces → interfaces}/index.js.map +0 -0
- package/{dist/interfaces → interfaces}/newable.d.ts +0 -0
- package/{dist/interfaces → interfaces}/newable.js +0 -0
- package/{dist/interfaces → interfaces}/newable.js.map +0 -0
- package/{dist/interfaces → interfaces}/transactional-client.d.ts +0 -0
- package/{dist/interfaces → interfaces}/transactional-client.js +0 -0
- package/{dist/interfaces → interfaces}/transactional-client.js.map +0 -0
- package/{dist/interfaces → interfaces}/type.d.ts +0 -0
- package/{dist/interfaces → interfaces}/type.js +0 -0
- package/{dist/interfaces → interfaces}/type.js.map +0 -0
- package/package.json +6 -6
- package/{dist/reflect.d.ts → reflect.d.ts} +0 -0
- package/{dist/reflect.js → reflect.js} +0 -0
- package/{dist/reflect.js.map → reflect.js.map} +0 -0
- package/{dist/request-method.enum.d.ts → request-method.enum.d.ts} +0 -0
- package/{dist/request-method.enum.js → request-method.enum.js} +0 -0
- package/{dist/request-method.enum.js.map → request-method.enum.js.map} +0 -0
- package/{dist/server → server}/index.d.ts +0 -0
- package/{dist/server → server}/index.js +0 -0
- package/{dist/server → server}/index.js.map +0 -0
- package/{dist/server → server}/middlewares/authentication-middleware.d.ts +0 -0
- package/{dist/server → server}/middlewares/authentication-middleware.js +0 -0
- package/{dist/server → server}/middlewares/authentication-middleware.js.map +0 -0
- package/{dist/server → server}/middlewares/create-context-middleware.d.ts +0 -0
- package/{dist/server → server}/middlewares/create-context-middleware.js +0 -0
- package/{dist/server → server}/middlewares/create-context-middleware.js.map +0 -0
- package/{dist/server → server}/middlewares/error-middleware.d.ts +0 -0
- package/{dist/server → server}/middlewares/error-middleware.js +0 -0
- package/{dist/server → server}/middlewares/error-middleware.js.map +0 -0
- package/{dist/server → server}/middlewares/headers-middleware.d.ts +0 -0
- package/{dist/server → server}/middlewares/headers-middleware.js +0 -0
- package/{dist/server → server}/middlewares/headers-middleware.js.map +0 -0
- package/{dist/server → server}/middlewares/index.d.ts +0 -0
- package/{dist/server → server}/middlewares/index.js +0 -0
- package/{dist/server → server}/middlewares/index.js.map +0 -0
- package/{dist/server → server}/middlewares/not-found-middleware.d.ts +0 -0
- package/{dist/server → server}/middlewares/not-found-middleware.js +0 -0
- package/{dist/server → server}/middlewares/not-found-middleware.js.map +0 -0
- package/{dist/server → server}/server.d.ts +0 -0
- package/{dist/server → server}/server.js +0 -0
- package/{dist/server → server}/server.js.map +0 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/.eslintrc.js +0 -15
- package/.vscode/settings.json +0 -7
- package/dist/package.json +0 -54
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/my-devkit-firebase-1.0.76.tgz +0 -0
- package/src/aggregate.ts +0 -54
- package/src/app-factory.ts +0 -252
- package/src/bus.ts +0 -70
- package/src/constants.ts +0 -5
- package/src/context.ts +0 -108
- package/src/decorators/controller/body.spec.ts +0 -52
- package/src/decorators/controller/body.ts +0 -17
- package/src/decorators/controller/controller.spec.ts +0 -19
- package/src/decorators/controller/controller.ts +0 -10
- package/src/decorators/controller/get.spec.ts +0 -32
- package/src/decorators/controller/get.ts +0 -8
- package/src/decorators/controller/index.ts +0 -8
- package/src/decorators/controller/param.spec.ts +0 -51
- package/src/decorators/controller/param.ts +0 -21
- package/src/decorators/controller/post.spec.ts +0 -60
- package/src/decorators/controller/post.ts +0 -8
- package/src/decorators/controller/query.spec.ts +0 -51
- package/src/decorators/controller/query.ts +0 -21
- package/src/decorators/handler/command-handler.spec.ts +0 -101
- package/src/decorators/handler/command-handler.ts +0 -21
- package/src/decorators/handler/event-handler.spec.ts +0 -104
- package/src/decorators/handler/event-handler.ts +0 -22
- package/src/decorators/handler/index.ts +0 -2
- package/src/decorators/index.ts +0 -5
- package/src/decorators/injectable.ts +0 -7
- package/src/decorators/module.ts +0 -29
- package/src/decorators/transactional-client.ts +0 -7
- package/src/execution-mode-enum.ts +0 -4
- package/src/firestore-client.ts +0 -125
- package/src/handler-helper.ts +0 -68
- package/src/index.ts +0 -7
- package/src/injector.ts +0 -31
- package/src/interfaces/app-config.ts +0 -1
- package/src/interfaces/from-array.ts +0 -1
- package/src/interfaces/index.ts +0 -4
- package/src/interfaces/newable.ts +0 -1
- package/src/interfaces/transactional-client.ts +0 -3
- package/src/interfaces/type.ts +0 -3
- package/src/reflect.ts +0 -164
- package/src/request-method.enum.ts +0 -4
- package/src/server/index.ts +0 -1
- package/src/server/middlewares/authentication-middleware.ts +0 -47
- package/src/server/middlewares/create-context-middleware.ts +0 -16
- package/src/server/middlewares/error-middleware.ts +0 -33
- package/src/server/middlewares/headers-middleware.ts +0 -16
- package/src/server/middlewares/index.ts +0 -5
- package/src/server/middlewares/not-found-middleware.ts +0 -9
- package/src/server/server.ts +0 -96
- package/tsconfig.json +0 -24
package/src/handler-helper.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@my-devkit/core';
|
|
2
|
-
|
|
3
|
-
import { Aggregate } from './aggregate';
|
|
4
|
-
import { Context } from './context';
|
|
5
|
-
import { ExecutionMode } from './execution-mode-enum';
|
|
6
|
-
import { FirestoreClient } from './firestore-client';
|
|
7
|
-
|
|
8
|
-
export class HandlerHelper {
|
|
9
|
-
public static async create<A extends Aggregate, R>(aggregate: A, callback: (a: A) => Promise<R>): Promise<R> {
|
|
10
|
-
const result = await callback(aggregate);
|
|
11
|
-
|
|
12
|
-
this.client.createDocument(aggregate);
|
|
13
|
-
await this.publishEvents(aggregate);
|
|
14
|
-
|
|
15
|
-
return result;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
public static async update<A extends Aggregate, R>(aggregateOrId: A | string, callback: (a: A) => Promise<R>): Promise<R> {
|
|
19
|
-
const aggregate = await this.getAggregate(aggregateOrId);
|
|
20
|
-
if (aggregate.events.length > 0) {
|
|
21
|
-
Logger.warn(`${aggregate._type} ${aggregate.id} has ${aggregate.events.length} events!!`);
|
|
22
|
-
}
|
|
23
|
-
const hashBefore = aggregate.hash;
|
|
24
|
-
|
|
25
|
-
const result = await callback(aggregate);
|
|
26
|
-
|
|
27
|
-
if (aggregate.hash !== hashBefore) {
|
|
28
|
-
this.client.updateDocument(aggregate);
|
|
29
|
-
await this.publishEvents(aggregate);
|
|
30
|
-
} else {
|
|
31
|
-
Logger.debug(`${aggregate._type} ${aggregate.id} didn't change, ${aggregate.events.length} events skipped`);
|
|
32
|
-
aggregate.clearEvents();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public static async delete<A extends Aggregate, R>(aggregateOrId: A | string, callback: (a: A) => Promise<R>): Promise<R> {
|
|
39
|
-
const aggregate = await this.getAggregate(aggregateOrId);
|
|
40
|
-
|
|
41
|
-
const result = await callback(aggregate);
|
|
42
|
-
|
|
43
|
-
this.client.deleteDocument(aggregate);
|
|
44
|
-
await this.publishEvents(aggregate);
|
|
45
|
-
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
private static get client(): FirestoreClient {
|
|
50
|
-
return Context.resolve(FirestoreClient);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
private static async publishEvents<A extends Aggregate>(aggregate: A): Promise<void> {
|
|
54
|
-
const events = aggregate.events;
|
|
55
|
-
aggregate.clearEvents();
|
|
56
|
-
|
|
57
|
-
for (const event of events) {
|
|
58
|
-
await Context.bus.publish(event, ExecutionMode.Synchronous);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
private static async getAggregate<A extends Aggregate>(aggregateOrId: A | string): Promise<A> {
|
|
63
|
-
if (typeof aggregateOrId === 'string' || aggregateOrId instanceof String) {
|
|
64
|
-
return this.client._find<A>(`/aggregates/${aggregateOrId}`);
|
|
65
|
-
}
|
|
66
|
-
return aggregateOrId;
|
|
67
|
-
}
|
|
68
|
-
}
|
package/src/index.ts
DELETED
package/src/injector.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { ITransactionalClient, Type } from './interfaces';
|
|
2
|
-
import { reflect } from './reflect';
|
|
3
|
-
|
|
4
|
-
export class Injector {
|
|
5
|
-
private instances = new Map<string, any>();
|
|
6
|
-
private transactionalClients: ITransactionalClient[] = [];
|
|
7
|
-
|
|
8
|
-
public resolve<T>(target: Type<T>): T {
|
|
9
|
-
const injectableId = reflect(target).getInjectableId();
|
|
10
|
-
if (!injectableId) {
|
|
11
|
-
throw new Error(`${target.name} is not injectable`);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (!this.instances.has(injectableId)) {
|
|
15
|
-
const tokens = reflect(target).getParameters();
|
|
16
|
-
const injections = tokens.map(token => this.resolve<any>(token));
|
|
17
|
-
const instance = new target(...injections);
|
|
18
|
-
this.instances.set(injectableId, instance);
|
|
19
|
-
|
|
20
|
-
if (reflect(target).isTransactionalClient()) {
|
|
21
|
-
this.transactionalClients.push(<any>instance);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return this.instances.get(injectableId);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public getTransactionalClients(): ITransactionalClient[] {
|
|
29
|
-
return [...this.transactionalClients];
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type FromArray<T extends ReadonlyArray<unknown>> = T extends ReadonlyArray<infer FromArray> ? FromArray : never;
|
package/src/interfaces/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type Newable<T> = new () => T;
|
package/src/interfaces/type.ts
DELETED
package/src/reflect.ts
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
|
-
|
|
3
|
-
import { Command, Event, guid } from '@my-devkit/core';
|
|
4
|
-
import { ExecutionMode } from 'execution-mode-enum';
|
|
5
|
-
|
|
6
|
-
import { Type } from './interfaces';
|
|
7
|
-
import { RequestMethod } from './request-method.enum';
|
|
8
|
-
import { Server } from './server';
|
|
9
|
-
|
|
10
|
-
/* eslint-disable @typescript-eslint/ban-types */
|
|
11
|
-
class ReflectHelper<T extends ReflectTarget<any>> {
|
|
12
|
-
private readonly HANDLER_META_DATA = '__handler__';
|
|
13
|
-
private readonly CONTROLLER_META_DATA = '__controller__';
|
|
14
|
-
private readonly INJECTABLE_META_DATA = '__injectable__';
|
|
15
|
-
private readonly TRANSACTIONAL_CLIENT_META_DATA = '__transactional_client__';
|
|
16
|
-
|
|
17
|
-
constructor(private target: T, private methodName: string | symbol) {
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public getParameters(): Type[] {
|
|
22
|
-
return Reflect.getMetadata('design:paramtypes', this.target, this.methodName) || [];
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public registerInjectable(): void {
|
|
26
|
-
this.defineMetaData(this.INJECTABLE_META_DATA, guid());
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public getInjectableId(): string {
|
|
30
|
-
return this.getMetaData<string>(this.INJECTABLE_META_DATA)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public registerTransactionalClient(): void {
|
|
34
|
-
this.defineMetaData(this.TRANSACTIONAL_CLIENT_META_DATA, guid);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
public isTransactionalClient(): boolean {
|
|
38
|
-
return this.hasMetaData(this.TRANSACTIONAL_CLIENT_META_DATA)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public getControllerConfiguration(): ControllerConfiguration {
|
|
42
|
-
if (!this.hasMetaData(this.CONTROLLER_META_DATA)) {
|
|
43
|
-
this.defineMetaData<ControllerConfiguration>(this.CONTROLLER_META_DATA, {
|
|
44
|
-
basePath: null,
|
|
45
|
-
routes: []
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return this.getMetaData<ControllerConfiguration>(this.CONTROLLER_META_DATA);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public registerController(basePath: string): void {
|
|
53
|
-
this.getControllerConfiguration().basePath = basePath;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public registerControllerRoute(route: { path: string, requestMethod: RequestMethod }): void {
|
|
57
|
-
this.getControllerRoute().path = route.path;
|
|
58
|
-
this.getControllerRoute().requestMethod = route.requestMethod;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
public registerControllerRouteArgumentInjector<T>(injector: RequestArgumentInjector<T>, index: number): void {
|
|
62
|
-
this.getControllerRoute().argumentInjectors[index] = injector;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
public getHandlerConfiguration(): HandlerConfiguration {
|
|
66
|
-
if (!this.hasMetaData(this.HANDLER_META_DATA)) {
|
|
67
|
-
this.defineMetaData<HandlerConfiguration>(this.HANDLER_META_DATA, {
|
|
68
|
-
commandHandlers: new Map<string, CommandHandler>(),
|
|
69
|
-
eventHandlers: new Map<string, EventHandler>()
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return this.getMetaData<HandlerConfiguration>(this.HANDLER_META_DATA);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
public registerCommandHandler<C extends Command>(command: new () => C): void {
|
|
77
|
-
this.getHandlerConfiguration().commandHandlers.set(this.methodName.toString(), {
|
|
78
|
-
methodName: this.methodName.toString(),
|
|
79
|
-
command
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
public registerEventHandler<E extends Event>(event: new () => E, executionMode: ExecutionMode): void {
|
|
84
|
-
this.getHandlerConfiguration().eventHandlers.set(this.methodName.toString(), {
|
|
85
|
-
methodName: this.methodName.toString(),
|
|
86
|
-
executionMode,
|
|
87
|
-
event
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
private getControllerRoute(): ControllerRoute {
|
|
92
|
-
const config = this.getControllerConfiguration();
|
|
93
|
-
if (!config.routes.find(r => r.methodName === this.methodName.toString())) {
|
|
94
|
-
config.routes.push({
|
|
95
|
-
methodName: this.methodName.toString(),
|
|
96
|
-
path: null,
|
|
97
|
-
requestMethod: null,
|
|
98
|
-
argumentInjectors: []
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return config.routes.find(r => r.methodName === this.methodName.toString());
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
private getMetaData<M>(key: string): M {
|
|
106
|
-
return Reflect.getMetadata(key, this.targetConstructor);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
private defineMetaData<M>(key: string, data: M): void {
|
|
110
|
-
Reflect.defineMetadata(key, data, this.targetConstructor);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private hasMetaData(key: string): boolean {
|
|
114
|
-
return Reflect.hasMetadata(key, this.targetConstructor);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
private get targetConstructor() {
|
|
118
|
-
if (this.target['prototype']) {
|
|
119
|
-
return this.target['prototype'].constructor;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (this.target.constructor) {
|
|
123
|
-
return this.target.constructor;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return this.target;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export interface ControllerConfiguration {
|
|
131
|
-
basePath: string;
|
|
132
|
-
routes: ControllerRoute[];
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export interface ControllerRoute {
|
|
136
|
-
path: string;
|
|
137
|
-
methodName: string;
|
|
138
|
-
requestMethod: RequestMethod;
|
|
139
|
-
argumentInjectors: RequestArgumentInjector<any>[];
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export interface CommandHandler {
|
|
143
|
-
methodName: string;
|
|
144
|
-
command: new () => Command;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export interface EventHandler {
|
|
148
|
-
methodName: string;
|
|
149
|
-
executionMode: ExecutionMode;
|
|
150
|
-
event: new () => Event;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export interface HandlerConfiguration {
|
|
154
|
-
commandHandlers: Map<string, CommandHandler>;
|
|
155
|
-
eventHandlers: Map<string, EventHandler>;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export type RequestArgumentInjector<T = any> = (req: Server.Request) => T;
|
|
159
|
-
|
|
160
|
-
export function reflect<T extends ReflectTarget<any>>(target: T, methodName?: string | symbol): ReflectHelper<T> {
|
|
161
|
-
return new ReflectHelper(target, methodName);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
type ReflectTarget<T> = T | (new (...args: any[]) => T);
|
package/src/server/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './server';
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Logger, UnauthorizedError } from '@my-devkit/core';
|
|
2
|
-
import { Auth } from 'firebase-admin/auth';
|
|
3
|
-
|
|
4
|
-
import { Context } from '../../context';
|
|
5
|
-
import { Server } from '../server';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export function AuthenticationMiddleware(auth: Auth, publicPaths: string[]): Server.RequestHandler {
|
|
9
|
-
return async (request: Server.Request, _response: Server.Response, next: Server.NextFunction): Promise<void> => {
|
|
10
|
-
const authorizationHeader = request.headers.authorization ? request.headers.authorization.toString() : null;
|
|
11
|
-
Logger.info(`${request.method} ${request.path}: Authentication check`);
|
|
12
|
-
|
|
13
|
-
if (publicPaths.includes(request.path)) {
|
|
14
|
-
Logger.info(`${request.path} is a public path, no authorization check`);
|
|
15
|
-
Context.user = null;
|
|
16
|
-
next();
|
|
17
|
-
} else if (request.method === 'OPTIONS') {
|
|
18
|
-
next();
|
|
19
|
-
} else if (!authorizationHeader) {
|
|
20
|
-
throw new UnauthorizedError('No authorization header found');
|
|
21
|
-
} else if (authorizationHeader.startsWith('Bearer')) {
|
|
22
|
-
const idToken = authorizationHeader.split('Bearer ')[1];
|
|
23
|
-
try {
|
|
24
|
-
const decodedIdToken = await auth.verifyIdToken(idToken, true);
|
|
25
|
-
const userId = decodedIdToken.uid;
|
|
26
|
-
Context.user = await auth.getUser(userId);
|
|
27
|
-
next();
|
|
28
|
-
} catch (error) {
|
|
29
|
-
throw new UnauthorizedError(`Error while verifying token ${error.message ? error.message : null}`);
|
|
30
|
-
}
|
|
31
|
-
} else if (authorizationHeader.startsWith('Basic')) {
|
|
32
|
-
const idToken = authorizationHeader.split('Basic ')[1];
|
|
33
|
-
try {
|
|
34
|
-
const [userId, password] = Buffer.from(idToken, 'base64').toString().split(':');
|
|
35
|
-
if (password !== '20V0anV4M!we') {
|
|
36
|
-
throw new Error('Wrong password!!');
|
|
37
|
-
}
|
|
38
|
-
Context.user = await auth.getUser(userId);
|
|
39
|
-
next();
|
|
40
|
-
} catch (error) {
|
|
41
|
-
throw new UnauthorizedError(`Error while verifying token ${error.message ? error.message : null}`);
|
|
42
|
-
}
|
|
43
|
-
} else {
|
|
44
|
-
throw new UnauthorizedError('Incorrect authorization header');
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { guid, Logger } from '@my-devkit/core';
|
|
2
|
-
|
|
3
|
-
import { Bus } from '../../bus';
|
|
4
|
-
import { Context } from '../../context';
|
|
5
|
-
import { Server } from '../server';
|
|
6
|
-
|
|
7
|
-
export function CreateContextMiddleware(bus: Bus): Server.RequestHandler {
|
|
8
|
-
return async (request: Server.Request, _response: Server.Response, next: Server.NextFunction): Promise<void> => {
|
|
9
|
-
Context.create(bus);
|
|
10
|
-
Context.correlationId = request.header('X-Correlation-ID') || guid();
|
|
11
|
-
|
|
12
|
-
Logger.info(`${request.method} ${request.path}: context created`);
|
|
13
|
-
|
|
14
|
-
next();
|
|
15
|
-
};
|
|
16
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@my-devkit/core';
|
|
2
|
-
|
|
3
|
-
import { Context } from '../../context';
|
|
4
|
-
import { Server } from '../server';
|
|
5
|
-
|
|
6
|
-
export function ErrorMiddleWare(): Server.ErrorHandler {
|
|
7
|
-
return async (error: any, _request: Server.Request, response: Server.Response): Promise<void> => {
|
|
8
|
-
if (!(error instanceof Error)) {
|
|
9
|
-
error = new Error(error);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
let status = Server.statusCodes.INTERNAL_SERVER_ERROR;
|
|
13
|
-
if (error.name === 'UnauthorizedError') {
|
|
14
|
-
status = Server.statusCodes.UNAUTHORIZED;
|
|
15
|
-
} else if (error.name === 'BadRequestError') {
|
|
16
|
-
status = Server.statusCodes.BAD_REQUEST;
|
|
17
|
-
} else if (error.name === 'DomainError') {
|
|
18
|
-
status = Server.statusCodes.BAD_REQUEST;
|
|
19
|
-
} else if (error.name === 'ForbiddenError') {
|
|
20
|
-
status = Server.statusCodes.FORBIDDEN;
|
|
21
|
-
} else if (error.name === 'NotImplemented') {
|
|
22
|
-
status = Server.statusCodes.NOT_IMPLEMENTED;
|
|
23
|
-
} else if (error.name === 'NotFoundError') {
|
|
24
|
-
status = Server.statusCodes.NOT_FOUND;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
Logger.error(`${error.name}: ${error.message}`);
|
|
28
|
-
|
|
29
|
-
Context.destroy();
|
|
30
|
-
|
|
31
|
-
response.status(status).send({ message: error.message });
|
|
32
|
-
};
|
|
33
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Context } from '../../context';
|
|
2
|
-
import { Server } from '../server';
|
|
3
|
-
|
|
4
|
-
export function HeadersMiddleWare(): Server.RequestHandler {
|
|
5
|
-
return async (_request: Server.Request, response: Server.Response, next: Server.NextFunction): Promise<void> => {
|
|
6
|
-
response.removeHeader('X-Powered-By'); // Remove verbose express
|
|
7
|
-
response.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); // HTTP 1.1.
|
|
8
|
-
response.setHeader('Pragma', 'no-cache'); // HTTP 1.0.
|
|
9
|
-
response.setHeader('Expires', '0'); // Proxies.
|
|
10
|
-
response.setHeader('Content-Type', 'application/json'); // default response type
|
|
11
|
-
response.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
12
|
-
response.setHeader('X-Correlation-ID', Context.correlationId);
|
|
13
|
-
|
|
14
|
-
next();
|
|
15
|
-
};
|
|
16
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { NotFoundError } from '@my-devkit/core';
|
|
2
|
-
|
|
3
|
-
import { Server } from '../server';
|
|
4
|
-
|
|
5
|
-
export function NotFoundMiddleware(): Server.RequestHandler {
|
|
6
|
-
return async (req: Server.Request): Promise<void> => {
|
|
7
|
-
throw new NotFoundError(`No controller found for ${req.method} ${req.path}`);
|
|
8
|
-
};
|
|
9
|
-
}
|
package/src/server/server.ts
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import * as cors from 'cors';
|
|
2
|
-
import * as express from 'express';
|
|
3
|
-
import { auth, firestore } from 'firebase-admin';
|
|
4
|
-
import { StatusCodes } from 'http-status-codes';
|
|
5
|
-
|
|
6
|
-
import { Bus } from '../bus';
|
|
7
|
-
import { RequestMethod } from '../request-method.enum';
|
|
8
|
-
import * as middlewares from './middlewares';
|
|
9
|
-
|
|
10
|
-
function encapsulate(handler: Server.RequestHandler): Server.RequestHandler {
|
|
11
|
-
return async (request: Server.Request, response: Server.Response, next: Server.NextFunction): Promise<void> => {
|
|
12
|
-
try {
|
|
13
|
-
await handler(request, response, next);
|
|
14
|
-
} catch (error) {
|
|
15
|
-
next(error);
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class Server {
|
|
21
|
-
private _app: express.Express;
|
|
22
|
-
public static statusCodes = StatusCodes;
|
|
23
|
-
|
|
24
|
-
constructor(options: Server.Options) {
|
|
25
|
-
this._app = express();
|
|
26
|
-
this.registerRequestHandler(cors({ origin: true }));
|
|
27
|
-
this.registerRequestHandler(middlewares.CreateContextMiddleware(options.bus));
|
|
28
|
-
this.registerRequestHandler(middlewares.HeadersMiddleWare());
|
|
29
|
-
this.registerRequestHandler(middlewares.AuthenticationMiddleware(options.firebaseAuth, options.publicPaths));
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public registerRequestHandler(handler: Server.RequestHandler): void {
|
|
33
|
-
this._app.use(encapsulate(handler));
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
public registerErrorHandler(handler: Server.ErrorHandler): void {
|
|
37
|
-
this._app.use(async (error: any, request: Server.Request, response: Server.Response, next: Server.NextFunction): Promise<void> => {
|
|
38
|
-
try {
|
|
39
|
-
await handler(error, request, response, next);
|
|
40
|
-
} catch (error) {
|
|
41
|
-
next(error);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
public registerRouter(path: string, router: express.Router): void {
|
|
47
|
-
this._app.use(path, router);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
public get app(): express.Express {
|
|
51
|
-
this.registerRequestHandler(middlewares.NotFoundMiddleware());
|
|
52
|
-
this.registerErrorHandler(middlewares.ErrorMiddleWare());
|
|
53
|
-
|
|
54
|
-
return this._app;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export namespace Server {
|
|
59
|
-
|
|
60
|
-
export interface Options {
|
|
61
|
-
bus: Bus;
|
|
62
|
-
firebaseAuth: auth.Auth;
|
|
63
|
-
firestore: firestore.Firestore;
|
|
64
|
-
publicPaths: string[];
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export class Router {
|
|
68
|
-
private router: express.Router;
|
|
69
|
-
constructor() {
|
|
70
|
-
this.router = express.Router();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
public registerRoute(method: RequestMethod, path: string, handler: RequestHandler): void {
|
|
74
|
-
switch (method) {
|
|
75
|
-
case RequestMethod.GET:
|
|
76
|
-
this.router.get(path, encapsulate(handler));
|
|
77
|
-
break;
|
|
78
|
-
case RequestMethod.POST:
|
|
79
|
-
this.router.post(path, encapsulate(handler));
|
|
80
|
-
break;
|
|
81
|
-
default:
|
|
82
|
-
throw new Error(`Server.Router:registerRoute: ${method} is not managed yet...`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
public registerOnServer(path: string, server: Server): void {
|
|
87
|
-
server.registerRouter(path, this.router);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export type Request = express.Request;
|
|
92
|
-
export type Response = express.Response;
|
|
93
|
-
export type NextFunction = express.NextFunction;
|
|
94
|
-
export type RequestHandler = (request: Request, response: Response, next: NextFunction) => Promise<void> | void;
|
|
95
|
-
export type ErrorHandler = (error: any, request: Request, response: Response, next: NextFunction) => Promise<void> | void;
|
|
96
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compileOnSave": false,
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"target": "es5",
|
|
5
|
-
"lib": [
|
|
6
|
-
"es2016"
|
|
7
|
-
],
|
|
8
|
-
"incremental": true,
|
|
9
|
-
"baseUrl": "src",
|
|
10
|
-
"outDir": "./dist",
|
|
11
|
-
"sourceMap": true,
|
|
12
|
-
"declaration": true,
|
|
13
|
-
"moduleResolution": "node",
|
|
14
|
-
"emitDecoratorMetadata": true,
|
|
15
|
-
"experimentalDecorators": true,
|
|
16
|
-
"typeRoots": [
|
|
17
|
-
"node_modules/@types"
|
|
18
|
-
],
|
|
19
|
-
"types": [
|
|
20
|
-
"reflect-metadata",
|
|
21
|
-
"mocha"
|
|
22
|
-
],
|
|
23
|
-
}
|
|
24
|
-
}
|