@ruiapp/rapid-core 0.1.77 → 0.1.79

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.
Files changed (103) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +8 -3
  3. package/package.json +1 -1
  4. package/rollup.config.js +16 -16
  5. package/src/core/actionHandler.ts +22 -22
  6. package/src/core/eventManager.ts +20 -20
  7. package/src/core/facility.ts +7 -7
  8. package/src/core/http/formDataParser.ts +89 -89
  9. package/src/core/pluginManager.ts +175 -175
  10. package/src/core/providers/runtimeProvider.ts +5 -5
  11. package/src/core/request.ts +86 -86
  12. package/src/core/response.ts +76 -76
  13. package/src/core/routeContext.ts +43 -43
  14. package/src/core/routesBuilder.ts +88 -88
  15. package/src/dataAccess/dataAccessor.ts +137 -137
  16. package/src/dataAccess/entityManager.ts +4 -0
  17. package/src/deno-std/datetime/to_imf.ts +32 -32
  18. package/src/deno-std/encoding/base64.ts +141 -141
  19. package/src/facilities/log/LogFacility.ts +35 -35
  20. package/src/helpers/entityHelpers.ts +76 -76
  21. package/src/index.ts +46 -44
  22. package/src/plugins/auth/actionHandlers/changePassword.ts +54 -54
  23. package/src/plugins/auth/actionHandlers/createSession.ts +63 -63
  24. package/src/plugins/auth/actionHandlers/deleteSession.ts +18 -18
  25. package/src/plugins/auth/actionHandlers/getMyProfile.ts +35 -35
  26. package/src/plugins/auth/actionHandlers/index.ts +8 -8
  27. package/src/plugins/auth/actionHandlers/resetPassword.ts +38 -38
  28. package/src/plugins/auth/models/AccessToken.ts +56 -56
  29. package/src/plugins/auth/models/index.ts +3 -3
  30. package/src/plugins/auth/routes/changePassword.ts +15 -15
  31. package/src/plugins/auth/routes/getMyProfile.ts +15 -15
  32. package/src/plugins/auth/routes/index.ts +7 -7
  33. package/src/plugins/auth/routes/resetPassword.ts +15 -15
  34. package/src/plugins/auth/routes/signin.ts +15 -15
  35. package/src/plugins/auth/routes/signout.ts +15 -15
  36. package/src/plugins/cronJob/CronJobPluginTypes.ts +49 -49
  37. package/src/plugins/cronJob/actionHandlers/index.ts +4 -4
  38. package/src/plugins/cronJob/actionHandlers/runCronJob.ts +29 -29
  39. package/src/plugins/cronJob/routes/index.ts +3 -3
  40. package/src/plugins/cronJob/routes/runCronJob.ts +15 -15
  41. package/src/plugins/dataManage/actionHandlers/addEntityRelations.ts +20 -20
  42. package/src/plugins/dataManage/actionHandlers/countCollectionEntities.ts +15 -15
  43. package/src/plugins/dataManage/actionHandlers/createCollectionEntitiesBatch.ts +42 -42
  44. package/src/plugins/dataManage/actionHandlers/createCollectionEntity.ts +24 -24
  45. package/src/plugins/dataManage/actionHandlers/findCollectionEntities.ts +26 -26
  46. package/src/plugins/dataManage/actionHandlers/findCollectionEntityById.ts +21 -21
  47. package/src/plugins/dataManage/actionHandlers/queryDatabase.ts +22 -22
  48. package/src/plugins/dataManage/actionHandlers/removeEntityRelations.ts +20 -20
  49. package/src/plugins/dataManage/actionHandlers/updateCollectionEntityById.ts +35 -35
  50. package/src/plugins/entityAccessControl/EntityAccessControlPlugin.ts +146 -146
  51. package/src/plugins/fileManage/actionHandlers/downloadDocument.ts +36 -36
  52. package/src/plugins/fileManage/actionHandlers/uploadFile.ts +33 -33
  53. package/src/plugins/fileManage/routes/downloadDocument.ts +15 -15
  54. package/src/plugins/fileManage/routes/downloadFile.ts +15 -15
  55. package/src/plugins/fileManage/routes/index.ts +5 -5
  56. package/src/plugins/fileManage/routes/uploadFile.ts +15 -15
  57. package/src/plugins/metaManage/actionHandlers/getMetaModelDetail.ts +10 -10
  58. package/src/plugins/metaManage/actionHandlers/listMetaModels.ts +9 -9
  59. package/src/plugins/metaManage/actionHandlers/listMetaRoutes.ts +9 -9
  60. package/src/plugins/routeManage/actionHandlers/httpProxy.ts +13 -13
  61. package/src/plugins/sequence/SequenceService.ts +81 -81
  62. package/src/plugins/sequence/actionHandlers/generateSn.ts +32 -32
  63. package/src/plugins/sequence/actionHandlers/index.ts +4 -4
  64. package/src/plugins/sequence/models/SequenceAutoIncrementRecord.ts +49 -49
  65. package/src/plugins/sequence/models/SequenceRule.ts +42 -42
  66. package/src/plugins/sequence/models/index.ts +4 -4
  67. package/src/plugins/sequence/routes/generateSn.ts +15 -15
  68. package/src/plugins/sequence/routes/index.ts +3 -3
  69. package/src/plugins/sequence/segment-utility.ts +11 -11
  70. package/src/plugins/sequence/segments/index.ts +9 -9
  71. package/src/plugins/serverOperation/ServerOperationPlugin.ts +91 -91
  72. package/src/plugins/serverOperation/ServerOperationPluginTypes.ts +15 -15
  73. package/src/plugins/serverOperation/actionHandlers/index.ts +4 -4
  74. package/src/plugins/setting/SettingService.ts +213 -213
  75. package/src/plugins/setting/actionHandlers/getSystemSettingValues.ts +30 -30
  76. package/src/plugins/setting/actionHandlers/getUserSettingValues.ts +38 -38
  77. package/src/plugins/setting/actionHandlers/index.ts +6 -6
  78. package/src/plugins/setting/actionHandlers/setSystemSettingValues.ts +30 -30
  79. package/src/plugins/setting/models/SystemSettingGroupSetting.ts +57 -57
  80. package/src/plugins/setting/models/SystemSettingItem.ts +42 -42
  81. package/src/plugins/setting/models/SystemSettingItemSetting.ts +73 -73
  82. package/src/plugins/setting/models/UserSettingGroupSetting.ts +57 -57
  83. package/src/plugins/setting/models/UserSettingItem.ts +49 -49
  84. package/src/plugins/setting/models/UserSettingItemSetting.ts +73 -73
  85. package/src/plugins/setting/models/index.ts +8 -8
  86. package/src/plugins/setting/routes/getSystemSettingValues.ts +15 -15
  87. package/src/plugins/setting/routes/getUserSettingValues.ts +15 -15
  88. package/src/plugins/setting/routes/index.ts +5 -5
  89. package/src/plugins/setting/routes/setSystemSettingValues.ts +15 -15
  90. package/src/plugins/stateMachine/actionHandlers/index.ts +4 -4
  91. package/src/plugins/stateMachine/actionHandlers/sendStateMachineEvent.ts +51 -51
  92. package/src/plugins/stateMachine/models/StateMachine.ts +42 -42
  93. package/src/plugins/stateMachine/models/index.ts +3 -3
  94. package/src/plugins/stateMachine/routes/index.ts +3 -3
  95. package/src/plugins/stateMachine/routes/sendStateMachineEvent.ts +15 -15
  96. package/src/polyfill.ts +5 -5
  97. package/src/proxy/mod.ts +38 -38
  98. package/src/utilities/accessControlUtility.ts +33 -33
  99. package/src/utilities/fsUtility.ts +61 -61
  100. package/src/utilities/httpUtility.ts +19 -19
  101. package/src/utilities/jwtUtility.ts +26 -26
  102. package/src/utilities/timeUtility.ts +9 -9
  103. package/tsconfig.json +19 -19
@@ -1,35 +1,35 @@
1
- import winston from "winston";
2
-
3
- export interface Logger {
4
- log: winston.LogMethod;
5
- /**
6
- * The service/app is going to stop or become unusable now. An operator should definitely look into this immediately.
7
- */
8
- emerg: winston.LeveledLogMethod;
9
- /**
10
- * Fatal for a particular service, but the app continues servicing other requests. An operator should look at this immediately.
11
- */
12
- crit: winston.LeveledLogMethod;
13
- /**
14
- * Fatal for a particular request, but the service/app continues servicing other requests. An operator should look at this soon(ish).
15
- */
16
- error: winston.LeveledLogMethod;
17
- /**
18
- * A note on something that should probably be looked at by an operator eventually.
19
- */
20
- warn: winston.LeveledLogMethod;
21
- /**
22
- * Detail on regular operation.
23
- */
24
- info: winston.LeveledLogMethod;
25
- /**
26
- * Anything else, i.e. too verbose to be included in "info" level.
27
- */
28
- debug: winston.LeveledLogMethod;
29
- /**
30
- * Logging from external libraries used by your app or very detailed application logging.
31
- */
32
- verbose: winston.LeveledLogMethod;
33
-
34
- child(options: Object): Logger;
35
- }
1
+ import winston from "winston";
2
+
3
+ export interface Logger {
4
+ log: winston.LogMethod;
5
+ /**
6
+ * The service/app is going to stop or become unusable now. An operator should definitely look into this immediately.
7
+ */
8
+ emerg: winston.LeveledLogMethod;
9
+ /**
10
+ * Fatal for a particular service, but the app continues servicing other requests. An operator should look at this immediately.
11
+ */
12
+ crit: winston.LeveledLogMethod;
13
+ /**
14
+ * Fatal for a particular request, but the service/app continues servicing other requests. An operator should look at this soon(ish).
15
+ */
16
+ error: winston.LeveledLogMethod;
17
+ /**
18
+ * A note on something that should probably be looked at by an operator eventually.
19
+ */
20
+ warn: winston.LeveledLogMethod;
21
+ /**
22
+ * Detail on regular operation.
23
+ */
24
+ info: winston.LeveledLogMethod;
25
+ /**
26
+ * Anything else, i.e. too verbose to be included in "info" level.
27
+ */
28
+ debug: winston.LeveledLogMethod;
29
+ /**
30
+ * Logging from external libraries used by your app or very detailed application logging.
31
+ */
32
+ verbose: winston.LeveledLogMethod;
33
+
34
+ child(options: Object): Logger;
35
+ }
@@ -1,76 +1,76 @@
1
- import { isNumber, isObject } from "lodash";
2
- import { IRpdServer } from "~/core/server";
3
- import { getEntityPropertyByCode, isOneRelationProperty } from "~/helpers/metaHelper";
4
- import { RpdDataModel } from "~/types";
5
-
6
- export function getEntityPartChanges(server: IRpdServer, model: RpdDataModel, before: any, after: any): Record<string, any> | null {
7
- if (!before) {
8
- throw new Error("Argument 'before' can not be null.");
9
- }
10
-
11
- if (!after) {
12
- throw new Error("Argument 'after' can not be null.");
13
- }
14
-
15
- let changed = false;
16
- let changes = {};
17
- for (const key in after) {
18
- const property = getEntityPropertyByCode(server, model, key);
19
- if (isOneRelationProperty(property)) {
20
- const afterValue: number | { id: number } | null = after[key];
21
- const beforeValue: number | { id: number } | null = before[key] || before[property.targetIdColumnName];
22
- if (afterValue) {
23
- if (isNumber(afterValue)) {
24
- if (beforeValue) {
25
- if (isNumber(beforeValue)) {
26
- if (afterValue != beforeValue) {
27
- changed = true;
28
- changes[key] = afterValue;
29
- }
30
- } else {
31
- if (afterValue != beforeValue.id) {
32
- changed = true;
33
- changes[key] = afterValue;
34
- }
35
- }
36
- } else {
37
- changed = true;
38
- changes[key] = afterValue;
39
- }
40
- } else {
41
- if (beforeValue) {
42
- if (isNumber(beforeValue)) {
43
- if (afterValue.id != beforeValue) {
44
- changed = true;
45
- changes[key] = afterValue;
46
- }
47
- } else {
48
- if (afterValue.id != beforeValue.id) {
49
- changed = true;
50
- changes[key] = afterValue;
51
- }
52
- }
53
- } else {
54
- changed = true;
55
- changes[key] = afterValue;
56
- }
57
- }
58
- } else {
59
- if (beforeValue) {
60
- changed = true;
61
- changes[key] = null;
62
- }
63
- }
64
- } else {
65
- if (after[key] != before[key]) {
66
- changed = true;
67
- changes[key] = after[key];
68
- }
69
- }
70
- }
71
-
72
- if (changed) {
73
- return changes;
74
- }
75
- return null;
76
- }
1
+ import { isNumber, isObject } from "lodash";
2
+ import { IRpdServer } from "~/core/server";
3
+ import { getEntityPropertyByCode, isOneRelationProperty } from "~/helpers/metaHelper";
4
+ import { RpdDataModel } from "~/types";
5
+
6
+ export function getEntityPartChanges(server: IRpdServer, model: RpdDataModel, before: any, after: any): Record<string, any> | null {
7
+ if (!before) {
8
+ throw new Error("Argument 'before' can not be null.");
9
+ }
10
+
11
+ if (!after) {
12
+ throw new Error("Argument 'after' can not be null.");
13
+ }
14
+
15
+ let changed = false;
16
+ let changes = {};
17
+ for (const key in after) {
18
+ const property = getEntityPropertyByCode(server, model, key);
19
+ if (isOneRelationProperty(property)) {
20
+ const afterValue: number | { id: number } | null = after[key];
21
+ const beforeValue: number | { id: number } | null = before[key] || before[property.targetIdColumnName];
22
+ if (afterValue) {
23
+ if (isNumber(afterValue)) {
24
+ if (beforeValue) {
25
+ if (isNumber(beforeValue)) {
26
+ if (afterValue != beforeValue) {
27
+ changed = true;
28
+ changes[key] = afterValue;
29
+ }
30
+ } else {
31
+ if (afterValue != beforeValue.id) {
32
+ changed = true;
33
+ changes[key] = afterValue;
34
+ }
35
+ }
36
+ } else {
37
+ changed = true;
38
+ changes[key] = afterValue;
39
+ }
40
+ } else {
41
+ if (beforeValue) {
42
+ if (isNumber(beforeValue)) {
43
+ if (afterValue.id != beforeValue) {
44
+ changed = true;
45
+ changes[key] = afterValue;
46
+ }
47
+ } else {
48
+ if (afterValue.id != beforeValue.id) {
49
+ changed = true;
50
+ changes[key] = afterValue;
51
+ }
52
+ }
53
+ } else {
54
+ changed = true;
55
+ changes[key] = afterValue;
56
+ }
57
+ }
58
+ } else {
59
+ if (beforeValue) {
60
+ changed = true;
61
+ changes[key] = null;
62
+ }
63
+ }
64
+ } else {
65
+ if (after[key] != before[key]) {
66
+ changed = true;
67
+ changes[key] = after[key];
68
+ }
69
+ }
70
+ }
71
+
72
+ if (changed) {
73
+ return changes;
74
+ }
75
+ return null;
76
+ }
package/src/index.ts CHANGED
@@ -1,44 +1,46 @@
1
- import { fixBigIntJSONSerialize } from "./polyfill";
2
- fixBigIntJSONSerialize();
3
-
4
- export * from "./types";
5
- export * from "./server";
6
-
7
- export * from "./core/request";
8
- export * from "./core/routeContext";
9
- export * from "./core/server";
10
- export * from "./core/http-types";
11
- export * from "./core/actionHandler";
12
-
13
- export * from "./utilities/jwtUtility";
14
-
15
- export * as bootstrapApplicationConfig from "./bootstrapApplicationConfig";
16
-
17
- export { default as MetaManagePlugin } from "./plugins/metaManage/MetaManagePlugin";
18
-
19
- export { default as DataManagePlugin } from "./plugins/dataManage/DataManagePlugin";
20
-
21
- export { default as RouteManagePlugin } from "./plugins/routeManage/RouteManagePlugin";
22
-
23
- export { default as SequencePlugin } from "./plugins/sequence/SequencePlugin";
24
- export * from "./plugins/sequence/SequencePluginTypes";
25
-
26
- export { default as WebhooksPlugin } from "./plugins/webhooks/WebhooksPlugin";
27
-
28
- export { default as AuthPlugin } from "./plugins/auth/AuthPlugin";
29
-
30
- export { default as FileManagePlugin } from "./plugins/fileManage/FileManagePlugin";
31
-
32
- export { default as ServerOperationPlugin } from "./plugins/serverOperation/ServerOperationPlugin";
33
- export * from "./plugins/serverOperation/ServerOperationPluginTypes";
34
-
35
- export { default as SettingPlugin } from "./plugins/setting/SettingPlugin";
36
- export * from "./plugins/setting/SettingPluginTypes";
37
-
38
- export { default as CronJobPlugin } from "./plugins/cronJob/CronJobPlugin";
39
- export * from "./plugins/cronJob/CronJobPluginTypes";
40
-
41
- export { default as StateMachinePlugin } from "./plugins/stateMachine/StateMachinePlugin";
42
- export * from "./plugins/stateMachine/StateMachinePluginTypes";
43
-
44
- export { default as EntityAccessControlPlugin } from "./plugins/entityAccessControl/EntityAccessControlPlugin";
1
+ import { fixBigIntJSONSerialize } from "./polyfill";
2
+ fixBigIntJSONSerialize();
3
+
4
+ export * from "./types";
5
+ export * from "./server";
6
+
7
+ export * from "./core/request";
8
+ export * from "./core/routeContext";
9
+ export * from "./core/server";
10
+ export * from "./core/http-types";
11
+ export * from "./core/actionHandler";
12
+
13
+ export * from "./utilities/jwtUtility";
14
+
15
+ export { mapDbRowToEntity } from "./dataAccess/entityMapper";
16
+
17
+ export * as bootstrapApplicationConfig from "./bootstrapApplicationConfig";
18
+
19
+ export { default as MetaManagePlugin } from "./plugins/metaManage/MetaManagePlugin";
20
+
21
+ export { default as DataManagePlugin } from "./plugins/dataManage/DataManagePlugin";
22
+
23
+ export { default as RouteManagePlugin } from "./plugins/routeManage/RouteManagePlugin";
24
+
25
+ export { default as SequencePlugin } from "./plugins/sequence/SequencePlugin";
26
+ export * from "./plugins/sequence/SequencePluginTypes";
27
+
28
+ export { default as WebhooksPlugin } from "./plugins/webhooks/WebhooksPlugin";
29
+
30
+ export { default as AuthPlugin } from "./plugins/auth/AuthPlugin";
31
+
32
+ export { default as FileManagePlugin } from "./plugins/fileManage/FileManagePlugin";
33
+
34
+ export { default as ServerOperationPlugin } from "./plugins/serverOperation/ServerOperationPlugin";
35
+ export * from "./plugins/serverOperation/ServerOperationPluginTypes";
36
+
37
+ export { default as SettingPlugin } from "./plugins/setting/SettingPlugin";
38
+ export * from "./plugins/setting/SettingPluginTypes";
39
+
40
+ export { default as CronJobPlugin } from "./plugins/cronJob/CronJobPlugin";
41
+ export * from "./plugins/cronJob/CronJobPluginTypes";
42
+
43
+ export { default as StateMachinePlugin } from "./plugins/stateMachine/StateMachinePlugin";
44
+ export * from "./plugins/stateMachine/StateMachinePluginTypes";
45
+
46
+ export { default as EntityAccessControlPlugin } from "./plugins/entityAccessControl/EntityAccessControlPlugin";
@@ -1,54 +1,54 @@
1
- import bcrypt from "bcrypt";
2
- import { ActionHandlerContext } from "~/core/actionHandler";
3
- import { RapidPlugin } from "~/core/server";
4
-
5
- export const code = "changePassword";
6
-
7
- export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
8
- const { server, input, routerContext } = ctx;
9
- const { response } = routerContext;
10
- const { id, oldPassword, newPassword } = input;
11
-
12
- const userId = routerContext.state.userId;
13
- if (!userId) {
14
- ctx.status = 401;
15
- ctx.output = {
16
- error: {
17
- message: "You are not signed in.",
18
- },
19
- };
20
- return;
21
- }
22
-
23
- const userDataAccessor = server.getDataAccessor({
24
- singularCode: "oc_user",
25
- });
26
-
27
- const user = await userDataAccessor.findOne({
28
- filters: [
29
- {
30
- operator: "eq",
31
- field: "id",
32
- value: userId,
33
- },
34
- ],
35
- });
36
-
37
- if (!user) {
38
- throw new Error("User not found.");
39
- }
40
-
41
- const isMatch = await bcrypt.compare(oldPassword, user.password);
42
- if (!isMatch) {
43
- throw new Error("旧密码错误。");
44
- }
45
-
46
- const saltRounds = 10;
47
- const passwordHash = await bcrypt.hash(newPassword, saltRounds);
48
-
49
- await userDataAccessor.updateById(user.id, {
50
- password: passwordHash,
51
- });
52
-
53
- ctx.output = {};
54
- }
1
+ import bcrypt from "bcrypt";
2
+ import { ActionHandlerContext } from "~/core/actionHandler";
3
+ import { RapidPlugin } from "~/core/server";
4
+
5
+ export const code = "changePassword";
6
+
7
+ export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
8
+ const { server, input, routerContext } = ctx;
9
+ const { response } = routerContext;
10
+ const { id, oldPassword, newPassword } = input;
11
+
12
+ const userId = routerContext.state.userId;
13
+ if (!userId) {
14
+ ctx.status = 401;
15
+ ctx.output = {
16
+ error: {
17
+ message: "You are not signed in.",
18
+ },
19
+ };
20
+ return;
21
+ }
22
+
23
+ const userDataAccessor = server.getDataAccessor({
24
+ singularCode: "oc_user",
25
+ });
26
+
27
+ const user = await userDataAccessor.findOne({
28
+ filters: [
29
+ {
30
+ operator: "eq",
31
+ field: "id",
32
+ value: userId,
33
+ },
34
+ ],
35
+ });
36
+
37
+ if (!user) {
38
+ throw new Error("User not found.");
39
+ }
40
+
41
+ const isMatch = await bcrypt.compare(oldPassword, user.password);
42
+ if (!isMatch) {
43
+ throw new Error("旧密码错误。");
44
+ }
45
+
46
+ const saltRounds = 10;
47
+ const passwordHash = await bcrypt.hash(newPassword, saltRounds);
48
+
49
+ await userDataAccessor.updateById(user.id, {
50
+ password: passwordHash,
51
+ });
52
+
53
+ ctx.output = {};
54
+ }
@@ -1,63 +1,63 @@
1
- import bcrypt from "bcrypt";
2
- import { setCookie } from "~/deno-std/http/cookie";
3
- import { createJwt } from "~/utilities/jwtUtility";
4
- import { ActionHandlerContext } from "~/core/actionHandler";
5
- import { RapidPlugin } from "~/core/server";
6
-
7
- export interface UserAccessToken {
8
- sub: "userAccessToken";
9
- aud: string;
10
- }
11
-
12
- export const code = "createSession";
13
-
14
- export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
15
- const { server, input, routerContext } = ctx;
16
- const { response } = routerContext;
17
- const { account, password } = input;
18
-
19
- const userDataAccessor = server.getDataAccessor({
20
- singularCode: "oc_user",
21
- });
22
-
23
- const user = await userDataAccessor.findOne({
24
- filters: [
25
- {
26
- operator: "eq",
27
- field: "login",
28
- value: account,
29
- },
30
- ],
31
- });
32
-
33
- if (!user) {
34
- throw new Error("用户名或密码错误。");
35
- }
36
-
37
- const isMatch = await bcrypt.compare(password, user.password);
38
- if (!isMatch) {
39
- throw new Error("用户名或密码错误。");
40
- }
41
-
42
- const secretKey = Buffer.from(server.config.jwtKey, "base64");
43
- const token = createJwt(
44
- {
45
- iss: "authManager",
46
- sub: "userAccessToken",
47
- aud: "" + user.id,
48
- iat: Math.floor(Date.now() / 1000),
49
- act: user.login,
50
- } as UserAccessToken,
51
- secretKey,
52
- );
53
-
54
- setCookie(response.headers, {
55
- name: ctx.server.config.sessionCookieName,
56
- value: token,
57
- path: "/",
58
- });
59
-
60
- ctx.output = {
61
- token,
62
- };
63
- }
1
+ import bcrypt from "bcrypt";
2
+ import { setCookie } from "~/deno-std/http/cookie";
3
+ import { createJwt } from "~/utilities/jwtUtility";
4
+ import { ActionHandlerContext } from "~/core/actionHandler";
5
+ import { RapidPlugin } from "~/core/server";
6
+
7
+ export interface UserAccessToken {
8
+ sub: "userAccessToken";
9
+ aud: string;
10
+ }
11
+
12
+ export const code = "createSession";
13
+
14
+ export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
15
+ const { server, input, routerContext } = ctx;
16
+ const { response } = routerContext;
17
+ const { account, password } = input;
18
+
19
+ const userDataAccessor = server.getDataAccessor({
20
+ singularCode: "oc_user",
21
+ });
22
+
23
+ const user = await userDataAccessor.findOne({
24
+ filters: [
25
+ {
26
+ operator: "eq",
27
+ field: "login",
28
+ value: account,
29
+ },
30
+ ],
31
+ });
32
+
33
+ if (!user) {
34
+ throw new Error("用户名或密码错误。");
35
+ }
36
+
37
+ const isMatch = await bcrypt.compare(password, user.password);
38
+ if (!isMatch) {
39
+ throw new Error("用户名或密码错误。");
40
+ }
41
+
42
+ const secretKey = Buffer.from(server.config.jwtKey, "base64");
43
+ const token = createJwt(
44
+ {
45
+ iss: "authManager",
46
+ sub: "userAccessToken",
47
+ aud: "" + user.id,
48
+ iat: Math.floor(Date.now() / 1000),
49
+ act: user.login,
50
+ } as UserAccessToken,
51
+ secretKey,
52
+ );
53
+
54
+ setCookie(response.headers, {
55
+ name: ctx.server.config.sessionCookieName,
56
+ value: token,
57
+ path: "/",
58
+ });
59
+
60
+ ctx.output = {
61
+ token,
62
+ };
63
+ }
@@ -1,18 +1,18 @@
1
- import { ActionHandlerContext } from "~/core/actionHandler";
2
- import { RapidPlugin } from "~/core/server";
3
- import { setCookie } from "~/deno-std/http/cookie";
4
-
5
- export const code = "deleteSession";
6
-
7
- export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
8
- const { server, input, routerContext } = ctx;
9
- const { response } = routerContext;
10
-
11
- setCookie(response.headers, {
12
- name: ctx.server.config.sessionCookieName,
13
- value: "",
14
- path: "/",
15
- });
16
-
17
- routerContext.redirect("/signin");
18
- }
1
+ import { ActionHandlerContext } from "~/core/actionHandler";
2
+ import { RapidPlugin } from "~/core/server";
3
+ import { setCookie } from "~/deno-std/http/cookie";
4
+
5
+ export const code = "deleteSession";
6
+
7
+ export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
8
+ const { server, input, routerContext } = ctx;
9
+ const { response } = routerContext;
10
+
11
+ setCookie(response.headers, {
12
+ name: ctx.server.config.sessionCookieName,
13
+ value: "",
14
+ path: "/",
15
+ });
16
+
17
+ routerContext.redirect("/signin");
18
+ }
@@ -1,35 +1,35 @@
1
- import { ActionHandlerContext } from "~/core/actionHandler";
2
- import { RapidPlugin } from "~/core/server";
3
-
4
- export const code = "getMyProfile";
5
-
6
- export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
7
- const { server, input, routerContext } = ctx;
8
-
9
- const userId = routerContext.state.userId;
10
- if (!userId) {
11
- ctx.status = 401;
12
- ctx.output = {
13
- error: {
14
- message: "You are not signed in.",
15
- },
16
- };
17
- return;
18
- }
19
-
20
- const entityManager = server.getEntityManager("oc_user");
21
- const user = await entityManager.findEntity({
22
- filters: [
23
- {
24
- operator: "eq",
25
- field: "id",
26
- value: userId,
27
- },
28
- ],
29
- properties: ["id", "name", "login", "email", "department", "roles", "state", "createdAt"],
30
- });
31
-
32
- ctx.output = {
33
- user,
34
- };
35
- }
1
+ import { ActionHandlerContext } from "~/core/actionHandler";
2
+ import { RapidPlugin } from "~/core/server";
3
+
4
+ export const code = "getMyProfile";
5
+
6
+ export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
7
+ const { server, input, routerContext } = ctx;
8
+
9
+ const userId = routerContext.state.userId;
10
+ if (!userId) {
11
+ ctx.status = 401;
12
+ ctx.output = {
13
+ error: {
14
+ message: "You are not signed in.",
15
+ },
16
+ };
17
+ return;
18
+ }
19
+
20
+ const entityManager = server.getEntityManager("oc_user");
21
+ const user = await entityManager.findEntity({
22
+ filters: [
23
+ {
24
+ operator: "eq",
25
+ field: "id",
26
+ value: userId,
27
+ },
28
+ ],
29
+ properties: ["id", "name", "login", "email", "department", "roles", "state", "createdAt"],
30
+ });
31
+
32
+ ctx.output = {
33
+ user,
34
+ };
35
+ }