@ruiapp/rapid-core 0.1.79 → 0.1.81
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/index.js +83 -42
- package/dist/plugins/dataManage/actionHandlers/deleteCollectionEntities.d.ts +8 -0
- package/package.json +1 -1
- package/rollup.config.js +16 -16
- package/src/core/actionHandler.ts +22 -22
- package/src/core/eventManager.ts +20 -20
- package/src/core/facility.ts +7 -7
- package/src/core/http/formDataParser.ts +89 -89
- package/src/core/pluginManager.ts +175 -175
- package/src/core/providers/runtimeProvider.ts +5 -5
- package/src/core/request.ts +86 -86
- package/src/core/response.ts +76 -76
- package/src/core/routeContext.ts +43 -43
- package/src/core/routesBuilder.ts +88 -88
- package/src/dataAccess/dataAccessor.ts +137 -137
- package/src/deno-std/datetime/to_imf.ts +32 -32
- package/src/deno-std/encoding/base64.ts +141 -141
- package/src/facilities/log/LogFacility.ts +35 -35
- package/src/helpers/entityHelpers.ts +76 -76
- package/src/plugins/auth/actionHandlers/changePassword.ts +54 -54
- package/src/plugins/auth/actionHandlers/createSession.ts +63 -63
- package/src/plugins/auth/actionHandlers/deleteSession.ts +18 -18
- package/src/plugins/auth/actionHandlers/getMyProfile.ts +35 -35
- package/src/plugins/auth/actionHandlers/index.ts +8 -8
- package/src/plugins/auth/actionHandlers/resetPassword.ts +38 -38
- package/src/plugins/auth/models/AccessToken.ts +56 -56
- package/src/plugins/auth/models/index.ts +3 -3
- package/src/plugins/auth/routes/changePassword.ts +15 -15
- package/src/plugins/auth/routes/getMyProfile.ts +15 -15
- package/src/plugins/auth/routes/index.ts +7 -7
- package/src/plugins/auth/routes/resetPassword.ts +15 -15
- package/src/plugins/auth/routes/signin.ts +15 -15
- package/src/plugins/auth/routes/signout.ts +15 -15
- package/src/plugins/cronJob/CronJobPluginTypes.ts +49 -49
- package/src/plugins/cronJob/actionHandlers/index.ts +4 -4
- package/src/plugins/cronJob/actionHandlers/runCronJob.ts +29 -29
- package/src/plugins/cronJob/routes/index.ts +3 -3
- package/src/plugins/cronJob/routes/runCronJob.ts +15 -15
- package/src/plugins/dataManage/DataManagePlugin.ts +8 -0
- package/src/plugins/dataManage/actionHandlers/addEntityRelations.ts +20 -20
- package/src/plugins/dataManage/actionHandlers/countCollectionEntities.ts +15 -15
- package/src/plugins/dataManage/actionHandlers/createCollectionEntitiesBatch.ts +42 -42
- package/src/plugins/dataManage/actionHandlers/createCollectionEntity.ts +24 -24
- package/src/plugins/dataManage/actionHandlers/deleteCollectionEntities.ts +38 -0
- package/src/plugins/dataManage/actionHandlers/findCollectionEntities.ts +26 -26
- package/src/plugins/dataManage/actionHandlers/findCollectionEntityById.ts +21 -21
- package/src/plugins/dataManage/actionHandlers/queryDatabase.ts +22 -22
- package/src/plugins/dataManage/actionHandlers/removeEntityRelations.ts +20 -20
- package/src/plugins/dataManage/actionHandlers/updateCollectionEntityById.ts +35 -35
- package/src/plugins/entityAccessControl/EntityAccessControlPlugin.ts +1 -1
- package/src/plugins/fileManage/actionHandlers/downloadDocument.ts +36 -36
- package/src/plugins/fileManage/actionHandlers/uploadFile.ts +33 -33
- package/src/plugins/fileManage/routes/downloadDocument.ts +15 -15
- package/src/plugins/fileManage/routes/downloadFile.ts +15 -15
- package/src/plugins/fileManage/routes/index.ts +5 -5
- package/src/plugins/fileManage/routes/uploadFile.ts +15 -15
- package/src/plugins/metaManage/actionHandlers/getMetaModelDetail.ts +10 -10
- package/src/plugins/metaManage/actionHandlers/listMetaModels.ts +9 -9
- package/src/plugins/metaManage/actionHandlers/listMetaRoutes.ts +9 -9
- package/src/plugins/routeManage/actionHandlers/httpProxy.ts +13 -13
- package/src/plugins/sequence/SequenceService.ts +81 -81
- package/src/plugins/sequence/actionHandlers/generateSn.ts +32 -32
- package/src/plugins/sequence/actionHandlers/index.ts +4 -4
- package/src/plugins/sequence/models/SequenceAutoIncrementRecord.ts +49 -49
- package/src/plugins/sequence/models/SequenceRule.ts +42 -42
- package/src/plugins/sequence/models/index.ts +4 -4
- package/src/plugins/sequence/routes/generateSn.ts +15 -15
- package/src/plugins/sequence/routes/index.ts +3 -3
- package/src/plugins/sequence/segment-utility.ts +11 -11
- package/src/plugins/sequence/segments/index.ts +9 -9
- package/src/plugins/serverOperation/ServerOperationPlugin.ts +91 -91
- package/src/plugins/serverOperation/ServerOperationPluginTypes.ts +15 -15
- package/src/plugins/serverOperation/actionHandlers/index.ts +4 -4
- package/src/plugins/setting/SettingService.ts +213 -213
- package/src/plugins/setting/actionHandlers/getSystemSettingValues.ts +30 -30
- package/src/plugins/setting/actionHandlers/getUserSettingValues.ts +38 -38
- package/src/plugins/setting/actionHandlers/index.ts +6 -6
- package/src/plugins/setting/actionHandlers/setSystemSettingValues.ts +30 -30
- package/src/plugins/setting/models/SystemSettingGroupSetting.ts +57 -57
- package/src/plugins/setting/models/SystemSettingItem.ts +42 -42
- package/src/plugins/setting/models/SystemSettingItemSetting.ts +73 -73
- package/src/plugins/setting/models/UserSettingGroupSetting.ts +57 -57
- package/src/plugins/setting/models/UserSettingItem.ts +49 -49
- package/src/plugins/setting/models/UserSettingItemSetting.ts +73 -73
- package/src/plugins/setting/models/index.ts +8 -8
- package/src/plugins/setting/routes/getSystemSettingValues.ts +15 -15
- package/src/plugins/setting/routes/getUserSettingValues.ts +15 -15
- package/src/plugins/setting/routes/index.ts +5 -5
- package/src/plugins/setting/routes/setSystemSettingValues.ts +15 -15
- package/src/plugins/stateMachine/actionHandlers/index.ts +4 -4
- package/src/plugins/stateMachine/actionHandlers/sendStateMachineEvent.ts +51 -51
- package/src/plugins/stateMachine/models/StateMachine.ts +42 -42
- package/src/plugins/stateMachine/models/index.ts +3 -3
- package/src/plugins/stateMachine/routes/index.ts +3 -3
- package/src/plugins/stateMachine/routes/sendStateMachineEvent.ts +15 -15
- package/src/polyfill.ts +5 -5
- package/src/proxy/mod.ts +38 -38
- package/src/queryBuilder/queryBuilder.ts +5 -1
- package/src/utilities/accessControlUtility.ts +33 -33
- package/src/utilities/fsUtility.ts +61 -61
- package/src/utilities/httpUtility.ts +19 -19
- package/src/utilities/jwtUtility.ts +26 -26
- package/src/utilities/timeUtility.ts +9 -9
- package/tsconfig.json +19 -19
package/src/core/response.ts
CHANGED
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
import { isArray, isObject } from "lodash";
|
|
2
|
-
import { HttpStatus, ResponseData } from "./http-types";
|
|
3
|
-
|
|
4
|
-
export const GlobalResponse = global.Response;
|
|
5
|
-
|
|
6
|
-
function mergeHeaders(target: Headers, source: HeadersInit) {
|
|
7
|
-
if (source instanceof Headers) {
|
|
8
|
-
for (const keyValuePair of source.entries()) {
|
|
9
|
-
target.set(keyValuePair[0], keyValuePair[1]);
|
|
10
|
-
}
|
|
11
|
-
} else if (isArray(source)) {
|
|
12
|
-
for (const keyValuePair of source) {
|
|
13
|
-
target.set(keyValuePair[0], keyValuePair[1]);
|
|
14
|
-
}
|
|
15
|
-
} else if (isObject(source)) {
|
|
16
|
-
Object.entries(source).forEach(([key, value]) => target.set(key, value));
|
|
17
|
-
}
|
|
18
|
-
return target;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface NewResponseOptions {
|
|
22
|
-
body?: ResponseData;
|
|
23
|
-
status?: HttpStatus;
|
|
24
|
-
headers?: HeadersInit;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function newResponse(options: NewResponseOptions) {
|
|
28
|
-
return new Response(options.body, {
|
|
29
|
-
headers: options.headers,
|
|
30
|
-
status: options.status || 200,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export class RapidResponse {
|
|
35
|
-
#response: Response;
|
|
36
|
-
status: number;
|
|
37
|
-
body: BodyInit;
|
|
38
|
-
headers: Headers;
|
|
39
|
-
|
|
40
|
-
constructor(body?: BodyInit, init?: ResponseInit) {
|
|
41
|
-
this.body = body;
|
|
42
|
-
this.headers = new Headers(init?.headers);
|
|
43
|
-
this.status = init?.status;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
json(obj: any, status?: HttpStatus, headers?: HeadersInit) {
|
|
47
|
-
let body: string | null = null;
|
|
48
|
-
if (obj) {
|
|
49
|
-
body = JSON.stringify(obj);
|
|
50
|
-
}
|
|
51
|
-
this.headers.set("Content-Type", "application/json");
|
|
52
|
-
const responseHeaders = new Headers(this.headers);
|
|
53
|
-
if (headers) {
|
|
54
|
-
mergeHeaders(responseHeaders, headers);
|
|
55
|
-
}
|
|
56
|
-
this.#response = newResponse({ body, status: status || 200, headers: responseHeaders });
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
redirect(location: string, status?: HttpStatus) {
|
|
60
|
-
this.headers.set("Location", location);
|
|
61
|
-
this.#response = newResponse({
|
|
62
|
-
headers: this.headers,
|
|
63
|
-
status: status || 302,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
getResponse() {
|
|
68
|
-
if (!this.#response) {
|
|
69
|
-
this.#response = new Response(this.body, {
|
|
70
|
-
status: this.status || (this.body ? 200 : 404),
|
|
71
|
-
headers: this.headers,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
return this.#response;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
1
|
+
import { isArray, isObject } from "lodash";
|
|
2
|
+
import { HttpStatus, ResponseData } from "./http-types";
|
|
3
|
+
|
|
4
|
+
export const GlobalResponse = global.Response;
|
|
5
|
+
|
|
6
|
+
function mergeHeaders(target: Headers, source: HeadersInit) {
|
|
7
|
+
if (source instanceof Headers) {
|
|
8
|
+
for (const keyValuePair of source.entries()) {
|
|
9
|
+
target.set(keyValuePair[0], keyValuePair[1]);
|
|
10
|
+
}
|
|
11
|
+
} else if (isArray(source)) {
|
|
12
|
+
for (const keyValuePair of source) {
|
|
13
|
+
target.set(keyValuePair[0], keyValuePair[1]);
|
|
14
|
+
}
|
|
15
|
+
} else if (isObject(source)) {
|
|
16
|
+
Object.entries(source).forEach(([key, value]) => target.set(key, value));
|
|
17
|
+
}
|
|
18
|
+
return target;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface NewResponseOptions {
|
|
22
|
+
body?: ResponseData;
|
|
23
|
+
status?: HttpStatus;
|
|
24
|
+
headers?: HeadersInit;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function newResponse(options: NewResponseOptions) {
|
|
28
|
+
return new Response(options.body, {
|
|
29
|
+
headers: options.headers,
|
|
30
|
+
status: options.status || 200,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export class RapidResponse {
|
|
35
|
+
#response: Response;
|
|
36
|
+
status: number;
|
|
37
|
+
body: BodyInit;
|
|
38
|
+
headers: Headers;
|
|
39
|
+
|
|
40
|
+
constructor(body?: BodyInit, init?: ResponseInit) {
|
|
41
|
+
this.body = body;
|
|
42
|
+
this.headers = new Headers(init?.headers);
|
|
43
|
+
this.status = init?.status;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
json(obj: any, status?: HttpStatus, headers?: HeadersInit) {
|
|
47
|
+
let body: string | null = null;
|
|
48
|
+
if (obj) {
|
|
49
|
+
body = JSON.stringify(obj);
|
|
50
|
+
}
|
|
51
|
+
this.headers.set("Content-Type", "application/json");
|
|
52
|
+
const responseHeaders = new Headers(this.headers);
|
|
53
|
+
if (headers) {
|
|
54
|
+
mergeHeaders(responseHeaders, headers);
|
|
55
|
+
}
|
|
56
|
+
this.#response = newResponse({ body, status: status || 200, headers: responseHeaders });
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
redirect(location: string, status?: HttpStatus) {
|
|
60
|
+
this.headers.set("Location", location);
|
|
61
|
+
this.#response = newResponse({
|
|
62
|
+
headers: this.headers,
|
|
63
|
+
status: status || 302,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
getResponse() {
|
|
68
|
+
if (!this.#response) {
|
|
69
|
+
this.#response = new Response(this.body, {
|
|
70
|
+
status: this.status || (this.body ? 200 : 404),
|
|
71
|
+
headers: this.headers,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return this.#response;
|
|
75
|
+
}
|
|
76
|
+
}
|
package/src/core/routeContext.ts
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import { isArray, isObject } from "lodash";
|
|
2
|
-
import { RapidRequest } from "./request";
|
|
3
|
-
import { RapidResponse } from "./response";
|
|
4
|
-
import { HttpStatus, ResponseData } from "./http-types";
|
|
5
|
-
import { IRpdServer } from "./server";
|
|
6
|
-
import { Logger } from "~/facilities/log/LogFacility";
|
|
7
|
-
|
|
8
|
-
export type Next = () => Promise<void>;
|
|
9
|
-
|
|
10
|
-
export class RouteContext {
|
|
11
|
-
#logger: Logger;
|
|
12
|
-
readonly request: RapidRequest;
|
|
13
|
-
readonly response: RapidResponse;
|
|
14
|
-
readonly state: Record<string, any>;
|
|
15
|
-
method: string;
|
|
16
|
-
path: string;
|
|
17
|
-
params: Record<string, string>;
|
|
18
|
-
routeConfig: any;
|
|
19
|
-
|
|
20
|
-
constructor(server: IRpdServer, request: RapidRequest) {
|
|
21
|
-
this.#logger = server.getLogger();
|
|
22
|
-
this.request = request;
|
|
23
|
-
this.state = {};
|
|
24
|
-
this.response = new RapidResponse();
|
|
25
|
-
|
|
26
|
-
// `method` and `path` are used by `koa-tree-router` to match route
|
|
27
|
-
this.method = request.method;
|
|
28
|
-
this.path = request.url.pathname;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// `koa-tree-router` uses this method to set headers
|
|
32
|
-
set(headerName: string, headerValue: string) {
|
|
33
|
-
this.response.headers.set(headerName, headerValue);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
json(obj: any, status?: HttpStatus, headers?: HeadersInit) {
|
|
37
|
-
this.response.json(obj, status, headers);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
redirect(url: string, status?: HttpStatus) {
|
|
41
|
-
this.response.redirect(url, status);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
1
|
+
import { isArray, isObject } from "lodash";
|
|
2
|
+
import { RapidRequest } from "./request";
|
|
3
|
+
import { RapidResponse } from "./response";
|
|
4
|
+
import { HttpStatus, ResponseData } from "./http-types";
|
|
5
|
+
import { IRpdServer } from "./server";
|
|
6
|
+
import { Logger } from "~/facilities/log/LogFacility";
|
|
7
|
+
|
|
8
|
+
export type Next = () => Promise<void>;
|
|
9
|
+
|
|
10
|
+
export class RouteContext {
|
|
11
|
+
#logger: Logger;
|
|
12
|
+
readonly request: RapidRequest;
|
|
13
|
+
readonly response: RapidResponse;
|
|
14
|
+
readonly state: Record<string, any>;
|
|
15
|
+
method: string;
|
|
16
|
+
path: string;
|
|
17
|
+
params: Record<string, string>;
|
|
18
|
+
routeConfig: any;
|
|
19
|
+
|
|
20
|
+
constructor(server: IRpdServer, request: RapidRequest) {
|
|
21
|
+
this.#logger = server.getLogger();
|
|
22
|
+
this.request = request;
|
|
23
|
+
this.state = {};
|
|
24
|
+
this.response = new RapidResponse();
|
|
25
|
+
|
|
26
|
+
// `method` and `path` are used by `koa-tree-router` to match route
|
|
27
|
+
this.method = request.method;
|
|
28
|
+
this.path = request.url.pathname;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// `koa-tree-router` uses this method to set headers
|
|
32
|
+
set(headerName: string, headerValue: string) {
|
|
33
|
+
this.response.headers.set(headerName, headerValue);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
json(obj: any, status?: HttpStatus, headers?: HeadersInit) {
|
|
37
|
+
this.response.json(obj, status, headers);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
redirect(url: string, status?: HttpStatus) {
|
|
41
|
+
this.response.redirect(url, status);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
import Router from "koa-tree-router";
|
|
2
|
-
import qs from "qs";
|
|
3
|
-
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
4
|
-
import { IRpdServer } from "~/core/server";
|
|
5
|
-
import { RpdApplicationConfig } from "~/types";
|
|
6
|
-
import { isNullOrUndefined } from "~/utilities/typeUtility";
|
|
7
|
-
import { Next, RouteContext } from "./routeContext";
|
|
8
|
-
import { cloneDeep } from "lodash";
|
|
9
|
-
|
|
10
|
-
export async function buildRoutes(server: IRpdServer, applicationConfig: RpdApplicationConfig) {
|
|
11
|
-
const logger = server.getLogger();
|
|
12
|
-
const router = new Router();
|
|
13
|
-
|
|
14
|
-
let baseUrl = server.config.baseUrl;
|
|
15
|
-
if (baseUrl) {
|
|
16
|
-
if (baseUrl.endsWith("/")) {
|
|
17
|
-
baseUrl = baseUrl.substring(0, baseUrl.length - 1);
|
|
18
|
-
}
|
|
19
|
-
} else {
|
|
20
|
-
baseUrl = "";
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
applicationConfig.routes.forEach((routeConfig) => {
|
|
24
|
-
if (routeConfig.type !== "RESTful") {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const routePath = baseUrl + routeConfig.endpoint;
|
|
29
|
-
|
|
30
|
-
(router as any)[routeConfig.method.toLowerCase()](routePath, async (routerContext: RouteContext, next: Next) => {
|
|
31
|
-
routerContext.routeConfig = cloneDeep(routeConfig);
|
|
32
|
-
const { request, params } = routerContext;
|
|
33
|
-
|
|
34
|
-
let search = request.url.search;
|
|
35
|
-
if (search && search.startsWith("?")) {
|
|
36
|
-
search = search.substring(1);
|
|
37
|
-
}
|
|
38
|
-
const query = qs.parse(search);
|
|
39
|
-
const input = Object.assign({}, params, query);
|
|
40
|
-
|
|
41
|
-
const requestMethod = request.method;
|
|
42
|
-
if (requestMethod === "POST" || requestMethod === "PUT" || requestMethod === "PATCH") {
|
|
43
|
-
const body = request.body;
|
|
44
|
-
if (body) {
|
|
45
|
-
Object.assign(input, body.value);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Normalize input value
|
|
50
|
-
|
|
51
|
-
logger.debug("Processing rapid request.", {
|
|
52
|
-
method: requestMethod,
|
|
53
|
-
url: request.url.toString(),
|
|
54
|
-
input,
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
let handlerContext: ActionHandlerContext = {
|
|
58
|
-
logger,
|
|
59
|
-
routerContext,
|
|
60
|
-
next,
|
|
61
|
-
server,
|
|
62
|
-
applicationConfig,
|
|
63
|
-
input,
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
await server.beforeRunRouteActions(handlerContext);
|
|
67
|
-
|
|
68
|
-
for (const actionConfig of routeConfig.actions) {
|
|
69
|
-
const actionCode = actionConfig.code;
|
|
70
|
-
const handler = server.getActionHandlerByCode(actionCode);
|
|
71
|
-
if (!handler) {
|
|
72
|
-
throw new Error("Unknown handler: " + actionCode);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const result = handler(handlerContext, actionConfig.config);
|
|
76
|
-
if (result instanceof Promise) {
|
|
77
|
-
await result;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (!isNullOrUndefined(handlerContext.output)) {
|
|
82
|
-
routerContext.json(handlerContext.output, handlerContext.status);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
return router.routes();
|
|
88
|
-
}
|
|
1
|
+
import Router from "koa-tree-router";
|
|
2
|
+
import qs from "qs";
|
|
3
|
+
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
4
|
+
import { IRpdServer } from "~/core/server";
|
|
5
|
+
import { RpdApplicationConfig } from "~/types";
|
|
6
|
+
import { isNullOrUndefined } from "~/utilities/typeUtility";
|
|
7
|
+
import { Next, RouteContext } from "./routeContext";
|
|
8
|
+
import { cloneDeep } from "lodash";
|
|
9
|
+
|
|
10
|
+
export async function buildRoutes(server: IRpdServer, applicationConfig: RpdApplicationConfig) {
|
|
11
|
+
const logger = server.getLogger();
|
|
12
|
+
const router = new Router();
|
|
13
|
+
|
|
14
|
+
let baseUrl = server.config.baseUrl;
|
|
15
|
+
if (baseUrl) {
|
|
16
|
+
if (baseUrl.endsWith("/")) {
|
|
17
|
+
baseUrl = baseUrl.substring(0, baseUrl.length - 1);
|
|
18
|
+
}
|
|
19
|
+
} else {
|
|
20
|
+
baseUrl = "";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
applicationConfig.routes.forEach((routeConfig) => {
|
|
24
|
+
if (routeConfig.type !== "RESTful") {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const routePath = baseUrl + routeConfig.endpoint;
|
|
29
|
+
|
|
30
|
+
(router as any)[routeConfig.method.toLowerCase()](routePath, async (routerContext: RouteContext, next: Next) => {
|
|
31
|
+
routerContext.routeConfig = cloneDeep(routeConfig);
|
|
32
|
+
const { request, params } = routerContext;
|
|
33
|
+
|
|
34
|
+
let search = request.url.search;
|
|
35
|
+
if (search && search.startsWith("?")) {
|
|
36
|
+
search = search.substring(1);
|
|
37
|
+
}
|
|
38
|
+
const query = qs.parse(search);
|
|
39
|
+
const input = Object.assign({}, params, query);
|
|
40
|
+
|
|
41
|
+
const requestMethod = request.method;
|
|
42
|
+
if (requestMethod === "POST" || requestMethod === "PUT" || requestMethod === "PATCH") {
|
|
43
|
+
const body = request.body;
|
|
44
|
+
if (body) {
|
|
45
|
+
Object.assign(input, body.value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Normalize input value
|
|
50
|
+
|
|
51
|
+
logger.debug("Processing rapid request.", {
|
|
52
|
+
method: requestMethod,
|
|
53
|
+
url: request.url.toString(),
|
|
54
|
+
input,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
let handlerContext: ActionHandlerContext = {
|
|
58
|
+
logger,
|
|
59
|
+
routerContext,
|
|
60
|
+
next,
|
|
61
|
+
server,
|
|
62
|
+
applicationConfig,
|
|
63
|
+
input,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
await server.beforeRunRouteActions(handlerContext);
|
|
67
|
+
|
|
68
|
+
for (const actionConfig of routeConfig.actions) {
|
|
69
|
+
const actionCode = actionConfig.code;
|
|
70
|
+
const handler = server.getActionHandlerByCode(actionCode);
|
|
71
|
+
if (!handler) {
|
|
72
|
+
throw new Error("Unknown handler: " + actionCode);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const result = handler(handlerContext, actionConfig.config);
|
|
76
|
+
if (result instanceof Promise) {
|
|
77
|
+
await result;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!isNullOrUndefined(handlerContext.output)) {
|
|
82
|
+
routerContext.json(handlerContext.output, handlerContext.status);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
return router.routes();
|
|
88
|
+
}
|