@things-factory/auth-base 5.0.14 → 6.0.0-alpha.0
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/client/actions/auth.ts +23 -0
- package/client/{auth.js → auth.ts} +66 -59
- package/client/{bootstrap.js → bootstrap.ts} +5 -4
- package/client/index.ts +1 -0
- package/client/reducers/{auth.js → auth.ts} +1 -1
- package/dist-client/actions/auth.d.ts +8 -0
- package/dist-client/actions/auth.js +15 -0
- package/dist-client/actions/auth.js.map +1 -0
- package/dist-client/auth.d.ts +34 -0
- package/dist-client/auth.js +209 -0
- package/dist-client/auth.js.map +1 -0
- package/dist-client/bootstrap.d.ts +1 -0
- package/dist-client/bootstrap.js +34 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +1 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/reducers/auth.d.ts +14 -0
- package/dist-client/reducers/auth.js +19 -0
- package/dist-client/reducers/auth.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/constants/error-code.d.ts +17 -0
- package/dist-server/constants/error-message.d.ts +0 -0
- package/dist-server/constants/max-age.d.ts +1 -0
- package/dist-server/controllers/auth.d.ts +5 -0
- package/dist-server/controllers/auth.js +1 -0
- package/dist-server/controllers/auth.js.map +1 -1
- package/dist-server/controllers/change-pwd.d.ts +1 -0
- package/dist-server/controllers/change-pwd.js +5 -4
- package/dist-server/controllers/change-pwd.js.map +1 -1
- package/dist-server/controllers/checkin.d.ts +4 -0
- package/dist-server/controllers/checkin.js +3 -3
- package/dist-server/controllers/checkin.js.map +1 -1
- package/dist-server/controllers/delete-user.d.ts +3 -0
- package/dist-server/controllers/invitation.d.ts +11 -0
- package/dist-server/controllers/invitation.js +11 -12
- package/dist-server/controllers/invitation.js.map +1 -1
- package/dist-server/controllers/profile.d.ts +26 -0
- package/dist-server/controllers/profile.js +4 -4
- package/dist-server/controllers/profile.js.map +1 -1
- package/dist-server/controllers/reset-password.d.ts +5 -0
- package/dist-server/controllers/reset-password.js +7 -7
- package/dist-server/controllers/reset-password.js.map +1 -1
- package/dist-server/controllers/signin.d.ts +6 -0
- package/dist-server/controllers/signin.js +4 -3
- package/dist-server/controllers/signin.js.map +1 -1
- package/dist-server/controllers/signup.d.ts +8 -0
- package/dist-server/controllers/signup.js +13 -9
- package/dist-server/controllers/signup.js.map +1 -1
- package/dist-server/controllers/unlock-user.d.ts +5 -0
- package/dist-server/controllers/unlock-user.js +6 -6
- package/dist-server/controllers/unlock-user.js.map +1 -1
- package/dist-server/controllers/utils/make-invitation-token.d.ts +1 -0
- package/dist-server/controllers/utils/make-verification-token.d.ts +1 -0
- package/dist-server/controllers/utils/password-rule.d.ts +14 -0
- package/dist-server/controllers/utils/save-invitation-token.d.ts +5 -0
- package/dist-server/controllers/utils/save-invitation-token.js +2 -2
- package/dist-server/controllers/utils/save-invitation-token.js.map +1 -1
- package/dist-server/controllers/utils/save-verification-token.d.ts +6 -0
- package/dist-server/controllers/utils/save-verification-token.js +2 -2
- package/dist-server/controllers/utils/save-verification-token.js.map +1 -1
- package/dist-server/controllers/verification.d.ts +6 -0
- package/dist-server/controllers/verification.js +8 -8
- package/dist-server/controllers/verification.js.map +1 -1
- package/dist-server/errors/auth-error.d.ts +11 -0
- package/dist-server/errors/auth-error.js.map +1 -1
- package/dist-server/errors/index.d.ts +2 -0
- package/dist-server/errors/user-domain-not-match-error.d.ts +9 -0
- package/dist-server/errors/user-domain-not-match-error.js.map +1 -1
- package/dist-server/index.d.ts +13 -0
- package/dist-server/index.js +2 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/middlewares/authenticate-401-middleware.d.ts +1 -0
- package/dist-server/middlewares/authenticate-401-middleware.js +12 -14
- package/dist-server/middlewares/authenticate-401-middleware.js.map +1 -1
- package/dist-server/middlewares/domain-authenticate-middleware.d.ts +11 -0
- package/dist-server/middlewares/domain-authenticate-middleware.js +7 -4
- package/dist-server/middlewares/domain-authenticate-middleware.js.map +1 -1
- package/dist-server/middlewares/graphql-authenticate-middleware.d.ts +1 -0
- package/dist-server/middlewares/index.d.ts +5 -0
- package/dist-server/middlewares/jwt-authenticate-middleware.d.ts +1 -0
- package/dist-server/middlewares/signin-middleware.d.ts +1 -0
- package/dist-server/migrations/1548206416130-SeedUser.d.ts +5 -0
- package/dist-server/migrations/1548206416130-SeedUser.js +4 -5
- package/dist-server/migrations/1548206416130-SeedUser.js.map +1 -1
- package/dist-server/migrations/1566805283882-SeedPrivilege.d.ts +5 -0
- package/dist-server/migrations/1566805283882-SeedPrivilege.js +2 -2
- package/dist-server/migrations/1566805283882-SeedPrivilege.js.map +1 -1
- package/dist-server/migrations/index.d.ts +1 -0
- package/dist-server/router/auth-checkin-router.d.ts +1 -0
- package/dist-server/router/auth-checkin-router.js.map +1 -1
- package/dist-server/router/auth-private-process-router.d.ts +1 -0
- package/dist-server/router/auth-private-process-router.js +2 -2
- package/dist-server/router/auth-private-process-router.js.map +1 -1
- package/dist-server/router/auth-public-process-router.d.ts +1 -0
- package/dist-server/router/auth-public-process-router.js +2 -3
- package/dist-server/router/auth-public-process-router.js.map +1 -1
- package/dist-server/router/auth-signin-router.d.ts +1 -0
- package/dist-server/router/auth-signup-router.d.ts +1 -0
- package/dist-server/router/auth-signup-router.js +31 -32
- package/dist-server/router/auth-signup-router.js.map +1 -1
- package/dist-server/router/index.d.ts +8 -0
- package/dist-server/router/oauth2/index.d.ts +2 -0
- package/dist-server/router/oauth2/oauth2-authorize-router.d.ts +1 -0
- package/dist-server/router/oauth2/oauth2-authorize-router.js +2 -2
- package/dist-server/router/oauth2/oauth2-authorize-router.js.map +1 -1
- package/dist-server/router/oauth2/oauth2-router.d.ts +9 -0
- package/dist-server/router/oauth2/oauth2-router.js +6 -7
- package/dist-server/router/oauth2/oauth2-router.js.map +1 -1
- package/dist-server/router/oauth2/oauth2-server.d.ts +5 -0
- package/dist-server/router/oauth2/oauth2-server.js +23 -21
- package/dist-server/router/oauth2/oauth2-server.js.map +1 -1
- package/dist-server/router/oauth2/passport-oauth2-client-password.d.ts +7 -0
- package/dist-server/router/oauth2/passport-refresh-token.d.ts +7 -0
- package/dist-server/router/path-base-domain-router.d.ts +1 -0
- package/dist-server/router/site-root-router.d.ts +1 -0
- package/dist-server/routes.d.ts +1 -0
- package/dist-server/service/app-binding/app-binding-mutation.d.ts +3 -0
- package/dist-server/service/app-binding/app-binding-mutation.js +2 -2
- package/dist-server/service/app-binding/app-binding-mutation.js.map +1 -1
- package/dist-server/service/app-binding/app-binding-query.d.ts +14 -0
- package/dist-server/service/app-binding/app-binding-query.js +7 -9
- package/dist-server/service/app-binding/app-binding-query.js.map +1 -1
- package/dist-server/service/app-binding/app-binding-types.d.ts +5 -0
- package/dist-server/service/app-binding/app-binding.d.ts +7 -0
- package/dist-server/service/app-binding/index.d.ts +3 -0
- package/dist-server/service/appliance/appliance-mutation.d.ts +8 -0
- package/dist-server/service/appliance/appliance-mutation.js +13 -12
- package/dist-server/service/appliance/appliance-mutation.js.map +1 -1
- package/dist-server/service/appliance/appliance-query.d.ts +11 -0
- package/dist-server/service/appliance/appliance-query.js +7 -9
- package/dist-server/service/appliance/appliance-query.js.map +1 -1
- package/dist-server/service/appliance/appliance-types.d.ts +22 -0
- package/dist-server/service/appliance/appliance.d.ts +22 -0
- package/dist-server/service/appliance/appliance.js +1 -2
- package/dist-server/service/appliance/appliance.js.map +1 -1
- package/dist-server/service/appliance/index.d.ts +5 -0
- package/dist-server/service/application/application-mutation.d.ts +66 -0
- package/dist-server/service/application/application-mutation.js +13 -13
- package/dist-server/service/application/application-mutation.js.map +1 -1
- package/dist-server/service/application/application-query.d.ts +16 -0
- package/dist-server/service/application/application-query.js +11 -13
- package/dist-server/service/application/application-query.js.map +1 -1
- package/dist-server/service/application/application-types.d.ts +27 -0
- package/dist-server/service/application/application.d.ts +35 -0
- package/dist-server/service/application/application.js +1 -2
- package/dist-server/service/application/application.js.map +1 -1
- package/dist-server/service/application/index.d.ts +5 -0
- package/dist-server/service/domain-generator/domain-generator-mutation.d.ts +6 -0
- package/dist-server/service/domain-generator/domain-generator-mutation.js +7 -7
- package/dist-server/service/domain-generator/domain-generator-mutation.js.map +1 -1
- package/dist-server/service/domain-generator/domain-generator-types.d.ts +19 -0
- package/dist-server/service/domain-generator/domain-generator-types.js +1 -2
- package/dist-server/service/domain-generator/domain-generator-types.js.map +1 -1
- package/dist-server/service/domain-generator/index.d.ts +2 -0
- package/dist-server/service/granted-role/granted-role-mutation.d.ts +11 -0
- package/dist-server/service/granted-role/granted-role-mutation.js +14 -9
- package/dist-server/service/granted-role/granted-role-mutation.js.map +1 -1
- package/dist-server/service/granted-role/granted-role-query.d.ts +16 -0
- package/dist-server/service/granted-role/granted-role-query.js +8 -9
- package/dist-server/service/granted-role/granted-role-query.js.map +1 -1
- package/dist-server/service/granted-role/granted-role.d.ts +9 -0
- package/dist-server/service/granted-role/granted-role.js +1 -2
- package/dist-server/service/granted-role/granted-role.js.map +1 -1
- package/dist-server/service/granted-role/index.d.ts +5 -0
- package/dist-server/service/index.d.ts +31 -0
- package/dist-server/service/invitation/index.d.ts +5 -0
- package/dist-server/service/invitation/invitation-mutation.d.ts +17 -0
- package/dist-server/service/invitation/invitation-mutation.js +9 -9
- package/dist-server/service/invitation/invitation-mutation.js.map +1 -1
- package/dist-server/service/invitation/invitation-query.d.ts +8 -0
- package/dist-server/service/invitation/invitation-query.js +4 -4
- package/dist-server/service/invitation/invitation-query.js.map +1 -1
- package/dist-server/service/invitation/invitation-types.d.ts +5 -0
- package/dist-server/service/invitation/invitation.d.ts +14 -0
- package/dist-server/service/login-history/index.d.ts +4 -0
- package/dist-server/service/login-history/login-history-query.d.ts +8 -0
- package/dist-server/service/login-history/login-history-query.js +9 -11
- package/dist-server/service/login-history/login-history-query.js.map +1 -1
- package/dist-server/service/login-history/login-history.d.ts +12 -0
- package/dist-server/service/login-history/login-history.js +14 -15
- package/dist-server/service/login-history/login-history.js.map +1 -1
- package/dist-server/service/partner/index.d.ts +5 -0
- package/dist-server/service/partner/partner-mutation.d.ts +4 -0
- package/dist-server/service/partner/partner-mutation.js +6 -7
- package/dist-server/service/partner/partner-mutation.js.map +1 -1
- package/dist-server/service/partner/partner-query.d.ts +14 -0
- package/dist-server/service/partner/partner-query.js +11 -13
- package/dist-server/service/partner/partner-query.js.map +1 -1
- package/dist-server/service/partner/partner-types.d.ts +5 -0
- package/dist-server/service/partner/partner.d.ts +15 -0
- package/dist-server/service/partner/partner.js +2 -3
- package/dist-server/service/partner/partner.js.map +1 -1
- package/dist-server/service/password-history/index.d.ts +2 -0
- package/dist-server/service/password-history/password-history.d.ts +4 -0
- package/dist-server/service/privilege/index.d.ts +5 -0
- package/dist-server/service/privilege/privilege-directive.d.ts +3 -0
- package/dist-server/service/privilege/privilege-directive.js +2 -2
- package/dist-server/service/privilege/privilege-directive.js.map +1 -1
- package/dist-server/service/privilege/privilege-mutation.d.ts +7 -0
- package/dist-server/service/privilege/privilege-mutation.js +6 -5
- package/dist-server/service/privilege/privilege-mutation.js.map +1 -1
- package/dist-server/service/privilege/privilege-query.d.ts +13 -0
- package/dist-server/service/privilege/privilege-query.js +7 -8
- package/dist-server/service/privilege/privilege-query.js.map +1 -1
- package/dist-server/service/privilege/privilege-types.d.ts +25 -0
- package/dist-server/service/privilege/privilege.d.ts +15 -0
- package/dist-server/service/role/index.d.ts +5 -0
- package/dist-server/service/role/role-mutation.d.ts +8 -0
- package/dist-server/service/role/role-mutation.js +13 -11
- package/dist-server/service/role/role-mutation.js.map +1 -1
- package/dist-server/service/role/role-query.d.ts +18 -0
- package/dist-server/service/role/role-query.js +13 -13
- package/dist-server/service/role/role-query.js.map +1 -1
- package/dist-server/service/role/role-types.d.ts +33 -0
- package/dist-server/service/role/role.d.ts +18 -0
- package/dist-server/service/role/role.js +1 -2
- package/dist-server/service/role/role.js.map +1 -1
- package/dist-server/service/user/index.d.ts +5 -0
- package/dist-server/service/user/user-mutation.d.ts +28 -0
- package/dist-server/service/user/user-mutation.js +24 -17
- package/dist-server/service/user/user-mutation.js.map +1 -1
- package/dist-server/service/user/user-query.d.ts +16 -0
- package/dist-server/service/user/user-query.js +15 -13
- package/dist-server/service/user/user-query.js.map +1 -1
- package/dist-server/service/user/user-types.d.ts +26 -0
- package/dist-server/service/user/user.d.ts +39 -0
- package/dist-server/service/user/user.js +9 -8
- package/dist-server/service/user/user.js.map +1 -1
- package/dist-server/service/verification-token/index.d.ts +2 -0
- package/dist-server/service/verification-token/verification-token.d.ts +14 -0
- package/dist-server/templates/account-unlock-email.d.ts +4 -0
- package/dist-server/templates/invitation-email.d.ts +4 -0
- package/dist-server/templates/reset-password-email.d.ts +4 -0
- package/dist-server/templates/verification-email.d.ts +4 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/types.d.ts +17 -0
- package/dist-server/types.js +3 -0
- package/dist-server/types.js.map +1 -0
- package/dist-server/utils/accepts.d.ts +1 -0
- package/dist-server/utils/access-token-cookie.d.ts +3 -0
- package/dist-server/utils/check-user-belongs-domain.d.ts +10 -0
- package/dist-server/utils/check-user-belongs-domain.js +2 -2
- package/dist-server/utils/check-user-belongs-domain.js.map +1 -1
- package/dist-server/utils/get-domain-from-hostname.d.ts +1 -0
- package/dist-server/utils/get-domain-users.d.ts +5 -0
- package/dist-server/utils/get-domain-users.js +2 -3
- package/dist-server/utils/get-domain-users.js.map +1 -1
- package/dist-server/utils/get-secret.d.ts +1 -0
- package/dist-server/utils/get-user-domains.d.ts +5 -0
- package/dist-server/utils/get-user-domains.js +7 -5
- package/dist-server/utils/get-user-domains.js.map +1 -1
- package/package.json +15 -13
- package/server/controllers/auth.ts +1 -0
- package/server/controllers/change-pwd.ts +3 -3
- package/server/controllers/checkin.ts +3 -3
- package/server/controllers/invitation.ts +6 -7
- package/server/controllers/profile.ts +4 -3
- package/server/controllers/reset-password.ts +3 -3
- package/server/controllers/signin.ts +4 -2
- package/server/controllers/signup.ts +13 -8
- package/server/controllers/unlock-user.ts +5 -3
- package/server/controllers/utils/save-invitation-token.ts +2 -1
- package/server/controllers/utils/save-verification-token.ts +2 -1
- package/server/controllers/verification.ts +6 -4
- package/server/errors/auth-error.ts +3 -0
- package/server/errors/user-domain-not-match-error.ts +3 -0
- package/server/index.ts +3 -1
- package/server/middlewares/authenticate-401-middleware.ts +15 -3
- package/server/middlewares/domain-authenticate-middleware.ts +9 -6
- package/server/migrations/1548206416130-SeedUser.ts +3 -3
- package/server/migrations/1566805283882-SeedPrivilege.ts +2 -1
- package/server/router/auth-checkin-router.ts +1 -1
- package/server/router/auth-private-process-router.ts +1 -2
- package/server/router/auth-public-process-router.ts +2 -3
- package/server/router/auth-signup-router.ts +38 -38
- package/server/router/oauth2/oauth2-authorize-router.ts +3 -2
- package/server/router/oauth2/oauth2-router.ts +4 -5
- package/server/router/oauth2/oauth2-server.ts +19 -22
- package/server/service/app-binding/app-binding-mutation.ts +3 -2
- package/server/service/app-binding/app-binding-query.ts +9 -9
- package/server/service/appliance/appliance-mutation.ts +14 -8
- package/server/service/appliance/appliance-query.ts +11 -10
- package/server/service/application/application-mutation.ts +21 -12
- package/server/service/application/application-query.ts +20 -17
- package/server/service/domain-generator/domain-generator-mutation.ts +15 -10
- package/server/service/granted-role/granted-role-mutation.ts +14 -12
- package/server/service/granted-role/granted-role-query.ts +12 -10
- package/server/service/invitation/invitation-mutation.ts +7 -5
- package/server/service/invitation/invitation-query.ts +6 -4
- package/server/service/login-history/login-history-query.ts +13 -11
- package/server/service/login-history/login-history.ts +5 -4
- package/server/service/partner/partner-mutation.ts +10 -9
- package/server/service/partner/partner-query.ts +10 -10
- package/server/service/privilege/privilege-directive.ts +1 -1
- package/server/service/privilege/privilege-mutation.ts +10 -5
- package/server/service/privilege/privilege-query.ts +7 -7
- package/server/service/role/role-mutation.ts +18 -11
- package/server/service/role/role-query.ts +18 -16
- package/server/service/user/user-mutation.ts +39 -34
- package/server/service/user/user-query.ts +29 -21
- package/server/service/user/user.ts +12 -10
- package/server/types.ts +21 -0
- package/server/utils/check-user-belongs-domain.ts +2 -2
- package/server/utils/get-domain-users.ts +4 -2
- package/server/utils/get-user-domains.ts +8 -5
- package/things-factory.config.js +1 -1
- package/translations/en.json +2 -5
- package/translations/ko.json +5 -8
- package/translations/ms.json +2 -5
- package/translations/zh.json +2 -5
- package/client/actions/auth.js +0 -16
- package/client/index.js +0 -2
|
@@ -35,7 +35,7 @@ exports.server.deserializeClient(async function (id) {
|
|
|
35
35
|
if (id == exports.NOTFOUND) {
|
|
36
36
|
return {};
|
|
37
37
|
}
|
|
38
|
-
const application = await (0,
|
|
38
|
+
const application = await (0, shell_1.getRepository)(application_1.Application).findOneBy({ id });
|
|
39
39
|
return application;
|
|
40
40
|
});
|
|
41
41
|
// Register supported grant types.
|
|
@@ -68,7 +68,7 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.code(async (client, c
|
|
|
68
68
|
return false;
|
|
69
69
|
}
|
|
70
70
|
let { email, appKey, subdomain, scopes } = decoded;
|
|
71
|
-
const application = await (0,
|
|
71
|
+
const application = await (0, shell_1.getRepository)(application_1.Application).findOneBy({
|
|
72
72
|
appKey
|
|
73
73
|
});
|
|
74
74
|
if (!application) {
|
|
@@ -86,19 +86,20 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.code(async (client, c
|
|
|
86
86
|
// `oauth2 exchange error - redirectUrl should begins with the application setting : '${redirectUrl}':'${application.redirectUrl}'`
|
|
87
87
|
// )
|
|
88
88
|
// }
|
|
89
|
-
const domain = await (0,
|
|
89
|
+
const domain = await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({
|
|
90
90
|
subdomain
|
|
91
91
|
});
|
|
92
|
-
const creator = await (0,
|
|
92
|
+
const creator = await (0, shell_1.getRepository)(user_1.User).findOneBy({ email });
|
|
93
93
|
const appuserEmail = `${crypto.randomUUID()}@${subdomain}`;
|
|
94
|
-
var appuser = await (0,
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
94
|
+
var appuser = await (0, shell_1.getRepository)(user_1.User).findOne({
|
|
95
|
+
where: {
|
|
96
|
+
email: appuserEmail,
|
|
97
|
+
reference: application.id,
|
|
98
|
+
userType: 'application'
|
|
99
|
+
},
|
|
99
100
|
relations: ['domains', 'creator', 'updater']
|
|
100
101
|
});
|
|
101
|
-
appuser = await (0,
|
|
102
|
+
appuser = await (0, shell_1.getRepository)(user_1.User).save(Object.assign(Object.assign({}, (appuser || {})), { email: appuserEmail, name: application.name, userType: 'application', reference: application.id, domains: [domain], roles: scopes, status: user_1.UserStatus.ACTIVATED, updater: creator, creator }));
|
|
102
103
|
// appuser = await getRepository(User).findOne({
|
|
103
104
|
// where: { email: appuserEmail },
|
|
104
105
|
// relations: ['domains']
|
|
@@ -109,7 +110,7 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.code(async (client, c
|
|
|
109
110
|
// Lazy relation 업데이트 방법의 일관성이 부족하므로, Lazy relation 필드를 사용하지 않기를 권장함.
|
|
110
111
|
var accessToken = application_1.Application.generateAccessToken(domain, appuser, appKey, scopes);
|
|
111
112
|
var refreshToken = application_1.Application.generateRefreshToken(domain, appuser, appKey, scopes);
|
|
112
|
-
await (0,
|
|
113
|
+
await (0, shell_1.getRepository)(user_1.User).save(Object.assign(Object.assign({}, appuser), { password: refreshToken }));
|
|
113
114
|
return [
|
|
114
115
|
accessToken,
|
|
115
116
|
refreshToken,
|
|
@@ -130,7 +131,7 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.refreshToken(async (c
|
|
|
130
131
|
return false;
|
|
131
132
|
}
|
|
132
133
|
const { id, userType, email, application: { appKey }, domain: { subdomain }, scope: originalScope, exp: expires_in } = decoded;
|
|
133
|
-
const application = await (0,
|
|
134
|
+
const application = await (0, shell_1.getRepository)(application_1.Application).findOneBy({
|
|
134
135
|
appKey
|
|
135
136
|
});
|
|
136
137
|
if (!application) {
|
|
@@ -141,19 +142,20 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.refreshToken(async (c
|
|
|
141
142
|
env_1.logger.error('refresh token is expired');
|
|
142
143
|
return false;
|
|
143
144
|
}
|
|
144
|
-
const domain = await (0,
|
|
145
|
+
const domain = await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({
|
|
145
146
|
subdomain
|
|
146
147
|
});
|
|
147
|
-
const creator = await (0,
|
|
148
|
+
const creator = await (0, shell_1.getRepository)(user_1.User).findOneBy({
|
|
148
149
|
id,
|
|
149
150
|
userType
|
|
150
151
|
});
|
|
151
152
|
const appuserEmail = `${appKey}@${subdomain}`;
|
|
152
|
-
var appuser = await (0,
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
153
|
+
var appuser = await (0, shell_1.getRepository)(user_1.User).findOne({
|
|
154
|
+
where: {
|
|
155
|
+
email: appuserEmail,
|
|
156
|
+
reference: application.id,
|
|
157
|
+
userType: 'application'
|
|
158
|
+
},
|
|
157
159
|
relations: ['domain', 'creator', 'updater']
|
|
158
160
|
});
|
|
159
161
|
if (!appuser) {
|
|
@@ -171,13 +173,13 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.refreshToken(async (c
|
|
|
171
173
|
env_1.logger.error(`additional scope(${additionalScope}) required`);
|
|
172
174
|
return false;
|
|
173
175
|
}
|
|
174
|
-
const roles = await (0,
|
|
176
|
+
const roles = await (0, shell_1.getRepository)(role_1.Role).findBy({
|
|
175
177
|
name: (0, typeorm_1.In)(scopes),
|
|
176
178
|
domain
|
|
177
179
|
});
|
|
178
180
|
var accessToken = application_1.Application.generateAccessToken(domain, appuser, appKey, scope);
|
|
179
181
|
var refreshToken = application_1.Application.generateRefreshToken(domain, appuser, appKey, scope);
|
|
180
|
-
await (0,
|
|
182
|
+
await (0, shell_1.getRepository)(user_1.User).save(Object.assign(Object.assign({}, appuser), { roles, password: refreshToken }));
|
|
181
183
|
return [
|
|
182
184
|
accessToken,
|
|
183
185
|
refreshToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth2-server.js","sourceRoot":"","sources":["../../../server/router/oauth2/oauth2-server.ts"],"names":[],"mappings":"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","sourcesContent":["import oauth2orize from 'oauth2orize-koa'\nimport { getRepository, In } from 'typeorm'\n\nimport { logger } from '@things-factory/env'\nimport { Domain } from '@things-factory/shell'\n\nimport { Application } from '../../service/application/application'\nimport { Role } from '../../service/role/role'\nimport { User, UserStatus } from '../../service/user/user'\n\nconst crypto = require('crypto')\n\nexport const NOTFOUND = 'NOTFOUND'\nexport const NonClient = {\n id: NOTFOUND\n}\n\n// create OAuth 2.0 server\nexport const server = oauth2orize.createServer()\n\n// Register serialialization and deserialization functions.\n//\n// When a client redirects a user to user authorization endpoint, an\n// authorization transaction is initiated. To complete the transaction, the\n// user must authenticate and approve the authorization request. Because this\n// may involve multiple HTTP request/response exchanges, the transaction is\n// stored in the session.\n//\n// An application must supply serialization functions, which determine how the\n// client object is serialized into the session. Typically this will be a\n// simple matter of serializing the client's ID, and deserializing by finding\n// the client by ID from the database.\n\nserver.serializeClient(async function (client) {\n return client.id\n})\n\nserver.deserializeClient(async function (id) {\n if (id == NOTFOUND) {\n return {}\n }\n\n const application = await getRepository(Application).findOne(id)\n return application\n})\n\n// Register supported grant types.\n//\n// OAuth 2.0 specifies a framework that allows users to grant client\n// applications limited access to their protected resources. It does this\n// through a process of the user granting access, and the client exchanging\n// the grant for an access token.\n\n// Grant authorization codes. The callback takes the `client` requesting\n// authorization, the `redirectURI` (which is used as a verifier in the\n// subsequent exchange), the authenticated `user` granting access, and\n// their response, which contains approved scope, duration, etc. as parsed by\n// the application. The application issues a code, which is bound to these\n// values, and will be exchanged for an access token.\n\nserver.grant(\n oauth2orize.grant.code(async (client, redirectUrl, user, ares, areq) => {\n const { email, appKey, subdomain, scopes, state } = ares\n\n return Application.generateAuthCode(email, appKey, subdomain, scopes, state)\n })\n)\n\n// Exchange authorization codes for access tokens. The callback accepts the\n// `client`, which is exchanging `code` and any `redirectURI` from the\n// authorization request for verification. If these values are validated, the\n// application issues an access token on behalf of the user who authorized the\n// code.\n\nserver.exchange(\n oauth2orize.exchange.code(async (client, code, redirectUrl) => {\n try {\n /* authorization code */\n var decoded: any = Application.verifyAuthCode(code)\n } catch (e) {\n return false\n }\n let { email, appKey, subdomain, scopes } = decoded\n\n const application: Application = await getRepository(Application).findOne({\n appKey\n })\n\n if (!application) {\n return false\n }\n\n /* DONT-FORGET uncomment after test */\n // if (redirectUrl !== application.redirectUrl && redirectUrl.indexOf(application.redirectUrl) != 0) {\n // logger.error(\n // 'oauth2 exchange error - redirectUrl should begins with the application setting',\n // redirectUrl,\n // application.redirectUrl\n // )\n // // return false\n // throw new TypeError(\n // `oauth2 exchange error - redirectUrl should begins with the application setting : '${redirectUrl}':'${application.redirectUrl}'`\n // )\n // }\n\n const domain: Domain = await getRepository(Domain).findOne({\n subdomain\n })\n\n const creator: User = await getRepository(User).findOne({ email })\n\n const appuserEmail = `${crypto.randomUUID()}@${subdomain}`\n\n var appuser: User = await getRepository(User).findOne(\n {\n email: appuserEmail,\n reference: application.id,\n userType: 'application'\n },\n {\n relations: ['domains', 'creator', 'updater']\n }\n )\n\n appuser = await getRepository(User).save({\n ...(appuser || {}),\n email: appuserEmail,\n name: application.name,\n userType: 'application',\n reference: application.id,\n domains: [domain],\n roles: scopes,\n status: UserStatus.ACTIVATED,\n updater: creator,\n creator\n })\n\n // appuser = await getRepository(User).findOne({\n // where: { email: appuserEmail },\n // relations: ['domains']\n // })\n\n // appuser.domains = Promise.resolve([domain])\n // await getRepository(User).save(appuser)\n // Lazy relation 필드들(domain, domains)들에 대한 업데이트. 이상의 방법으로 업데이트 해야하는 것 같다.\n // Lazy relation 업데이트 방법의 일관성이 부족하므로, Lazy relation 필드를 사용하지 않기를 권장함.\n\n var accessToken = Application.generateAccessToken(domain, appuser, appKey, scopes)\n var refreshToken = Application.generateRefreshToken(domain, appuser, appKey, scopes)\n\n await getRepository(User).save({\n ...(appuser as any),\n password: refreshToken\n })\n\n return [\n accessToken,\n refreshToken,\n {\n expires_in: 30 * 24 * 60 * 60 /* 30d */,\n token_type: 'bearer',\n centerId: subdomain\n }\n ]\n })\n)\n\nserver.exchange(\n oauth2orize.exchange.refreshToken(async (client, refreshToken, scope) => {\n try {\n /* refresh token */\n var decoded: any = Application.verifyAuthCode(refreshToken)\n } catch (e) {\n logger.error(e)\n return false\n }\n const {\n id,\n userType,\n email,\n application: { appKey },\n domain: { subdomain },\n scope: originalScope,\n exp: expires_in\n } = decoded\n\n const application: Application = await getRepository(Application).findOne({\n appKey\n })\n\n if (!application) {\n logger.error('application is not exist')\n return false\n }\n\n if (Date.now() > expires_in * 1000) {\n logger.error('refresh token is expired')\n return false\n }\n\n const domain: Domain = await getRepository(Domain).findOne({\n subdomain\n })\n\n const creator: User = await getRepository(User).findOne({\n id,\n userType\n })\n\n const appuserEmail = `${appKey}@${subdomain}`\n\n var appuser: User = await getRepository(User).findOne(\n {\n email: appuserEmail,\n reference: application.id,\n userType: 'application'\n },\n {\n relations: ['domain', 'creator', 'updater']\n }\n )\n\n if (!appuser) {\n logger.error('application is not bound')\n return false\n }\n\n /*\n * `scope` is the scope of access requested by the client, which must not include any scope not originally granted.\n */\n\n scope = scope || originalScope\n\n const scopes: string[] = scope.split(',')\n const originalScopes = (originalScope || '').split(',')\n const additionalScope = scopes.find(scope => originalScopes.indexOf(scope) === -1)\n if (additionalScope) {\n logger.error(`additional scope(${additionalScope}) required`)\n return false\n }\n\n const roles = await getRepository(Role).find({\n name: In(scopes),\n domain\n })\n\n var accessToken = Application.generateAccessToken(domain, appuser, appKey, scope)\n var refreshToken: any = Application.generateRefreshToken(domain, appuser, appKey, scope)\n\n await getRepository(User).save({\n ...(appuser as any),\n roles,\n password: refreshToken\n })\n\n return [\n accessToken,\n refreshToken,\n {\n expires_in: 30 * 24 * 60 * 60 /* 30d */,\n token_type: 'bearer'\n }\n ]\n })\n)\n"]}
|
|
1
|
+
{"version":3,"file":"oauth2-server.js","sourceRoot":"","sources":["../../../server/router/oauth2/oauth2-server.ts"],"names":[],"mappings":";;;;AAAA,8EAAyC;AACzC,qCAA4B;AAE5B,6CAA4C;AAC5C,iDAA6D;AAE7D,uEAAmE;AACnE,kDAA8C;AAC9C,kDAA0D;AAE1D,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEnB,QAAA,QAAQ,GAAG,UAAU,CAAA;AACrB,QAAA,SAAS,GAAG;IACvB,EAAE,EAAE,gBAAQ;CACb,CAAA;AAED,0BAA0B;AACb,QAAA,MAAM,GAAG,yBAAW,CAAC,YAAY,EAAE,CAAA;AAEhD,2DAA2D;AAC3D,EAAE;AACF,oEAAoE;AACpE,4EAA4E;AAC5E,8EAA8E;AAC9E,2EAA2E;AAC3E,yBAAyB;AACzB,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,sCAAsC;AAEtC,cAAM,CAAC,eAAe,CAAC,KAAK,WAAW,MAAM;IAC3C,OAAO,MAAM,CAAC,EAAE,CAAA;AAClB,CAAC,CAAC,CAAA;AAEF,cAAM,CAAC,iBAAiB,CAAC,KAAK,WAAW,EAAE;IACzC,IAAI,EAAE,IAAI,gBAAQ,EAAE;QAClB,OAAO,EAAE,CAAA;KACV;IAED,MAAM,WAAW,GAAG,MAAM,IAAA,qBAAa,EAAC,yBAAW,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACtE,OAAO,WAAW,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,kCAAkC;AAClC,EAAE;AACF,oEAAoE;AACpE,0EAA0E;AAC1E,2EAA2E;AAC3E,iCAAiC;AAEjC,yEAAyE;AACzE,uEAAuE;AACvE,sEAAsE;AACtE,6EAA6E;AAC7E,2EAA2E;AAC3E,qDAAqD;AAErD,cAAM,CAAC,KAAK,CACV,yBAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACrE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAExD,OAAO,yBAAW,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AAC9E,CAAC,CAAC,CACH,CAAA;AAED,4EAA4E;AAC5E,sEAAsE;AACtE,8EAA8E;AAC9E,8EAA8E;AAC9E,QAAQ;AAER,cAAM,CAAC,QAAQ,CACb,yBAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;IAC5D,IAAI;QACF,wBAAwB;QACxB,IAAI,OAAO,GAAQ,yBAAW,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;KACpD;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,KAAK,CAAA;KACb;IACD,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAElD,MAAM,WAAW,GAAgB,MAAM,IAAA,qBAAa,EAAC,yBAAW,CAAC,CAAC,SAAS,CAAC;QAC1E,MAAM;KACP,CAAC,CAAA;IAEF,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,KAAK,CAAA;KACb;IAED,sCAAsC;IACtC,sGAAsG;IACtG,kBAAkB;IAClB,wFAAwF;IACxF,mBAAmB;IACnB,8BAA8B;IAC9B,MAAM;IACN,oBAAoB;IACpB,yBAAyB;IACzB,uIAAuI;IACvI,MAAM;IACN,IAAI;IAEJ,MAAM,MAAM,GAAW,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,SAAS,CAAC;QAC3D,SAAS;KACV,CAAC,CAAA;IAEF,MAAM,OAAO,GAAS,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IAEpE,MAAM,YAAY,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,SAAS,EAAE,CAAA;IAE1D,IAAI,OAAO,GAAS,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,OAAO,CAAC;QACpD,KAAK,EAAE;YACL,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,WAAW,CAAC,EAAE;YACzB,QAAQ,EAAE,aAAa;SACxB;QAED,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;KAC7C,CAAC,CAAA;IAEF,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,IAAI,iCACnC,CAAC,OAAO,IAAI,EAAE,CAAC,KAClB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,WAAW,CAAC,IAAI,EACtB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,WAAW,CAAC,EAAE,EACzB,OAAO,EAAE,CAAC,MAAM,CAAC,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,iBAAU,CAAC,SAAS,EAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,IACP,CAAA;IAEF,gDAAgD;IAChD,oCAAoC;IACpC,2BAA2B;IAC3B,KAAK;IAEL,8CAA8C;IAC9C,0CAA0C;IAC1C,yEAAyE;IACzE,qEAAqE;IAErE,IAAI,WAAW,GAAG,yBAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClF,IAAI,YAAY,GAAG,yBAAW,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAEpF,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,IAAI,iCACxB,OAAe,KACnB,QAAQ,EAAE,YAAY,IACtB,CAAA;IAEF,OAAO;QACL,WAAW;QACX,YAAY;QACZ;YACE,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;YACvC,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,SAAS;SACpB;KACF,CAAA;AACH,CAAC,CAAC,CACH,CAAA;AAED,cAAM,CAAC,QAAQ,CACb,yBAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE;IACtE,IAAI;QACF,mBAAmB;QACnB,IAAI,OAAO,GAAQ,yBAAW,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;KAC5D;IAAC,OAAO,CAAC,EAAE;QACV,YAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACf,OAAO,KAAK,CAAA;KACb;IACD,MAAM,EACJ,EAAE,EACF,QAAQ,EACR,KAAK,EACL,WAAW,EAAE,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,EAAE,SAAS,EAAE,EACrB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,UAAU,EAChB,GAAG,OAAO,CAAA;IAEX,MAAM,WAAW,GAAgB,MAAM,IAAA,qBAAa,EAAC,yBAAW,CAAC,CAAC,SAAS,CAAC;QAC1E,MAAM;KACP,CAAC,CAAA;IAEF,IAAI,CAAC,WAAW,EAAE;QAChB,YAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACxC,OAAO,KAAK,CAAA;KACb;IAED,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,EAAE;QAClC,YAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACxC,OAAO,KAAK,CAAA;KACb;IAED,MAAM,MAAM,GAAW,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,SAAS,CAAC;QAC3D,SAAS;KACV,CAAC,CAAA;IAEF,MAAM,OAAO,GAAS,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,SAAS,CAAC;QACxD,EAAE;QACF,QAAQ;KACT,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE,CAAA;IAE7C,IAAI,OAAO,GAAS,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,OAAO,CAAC;QACpD,KAAK,EAAE;YACL,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,WAAW,CAAC,EAAE;YACzB,QAAQ,EAAE,aAAa;SACxB;QACD,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;KAC5C,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,EAAE;QACZ,YAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACxC,OAAO,KAAK,CAAA;KACb;IAED;;OAEG;IAEH,KAAK,GAAG,KAAK,IAAI,aAAa,CAAA;IAE9B,MAAM,MAAM,GAAa,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzC,MAAM,cAAc,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACvD,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClF,IAAI,eAAe,EAAE;QACnB,YAAM,CAAC,KAAK,CAAC,oBAAoB,eAAe,YAAY,CAAC,CAAA;QAC7D,OAAO,KAAK,CAAA;KACb;IAED,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,MAAM,CAAC;QAC7C,IAAI,EAAE,IAAA,YAAE,EAAC,MAAM,CAAC;QAChB,MAAM;KACP,CAAC,CAAA;IAEF,IAAI,WAAW,GAAG,yBAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACjF,IAAI,YAAY,GAAQ,yBAAW,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAExF,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,IAAI,iCACxB,OAAe,KACnB,KAAK,EACL,QAAQ,EAAE,YAAY,IACtB,CAAA;IAEF,OAAO;QACL,WAAW;QACX,YAAY;QACZ;YACE,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;YACvC,UAAU,EAAE,QAAQ;SACrB;KACF,CAAA;AACH,CAAC,CAAC,CACH,CAAA","sourcesContent":["import oauth2orize from 'oauth2orize-koa'\nimport { In } from 'typeorm'\n\nimport { logger } from '@things-factory/env'\nimport { Domain, getRepository } from '@things-factory/shell'\n\nimport { Application } from '../../service/application/application'\nimport { Role } from '../../service/role/role'\nimport { User, UserStatus } from '../../service/user/user'\n\nconst crypto = require('crypto')\n\nexport const NOTFOUND = 'NOTFOUND'\nexport const NonClient = {\n id: NOTFOUND\n}\n\n// create OAuth 2.0 server\nexport const server = oauth2orize.createServer()\n\n// Register serialialization and deserialization functions.\n//\n// When a client redirects a user to user authorization endpoint, an\n// authorization transaction is initiated. To complete the transaction, the\n// user must authenticate and approve the authorization request. Because this\n// may involve multiple HTTP request/response exchanges, the transaction is\n// stored in the session.\n//\n// An application must supply serialization functions, which determine how the\n// client object is serialized into the session. Typically this will be a\n// simple matter of serializing the client's ID, and deserializing by finding\n// the client by ID from the database.\n\nserver.serializeClient(async function (client) {\n return client.id\n})\n\nserver.deserializeClient(async function (id) {\n if (id == NOTFOUND) {\n return {}\n }\n\n const application = await getRepository(Application).findOneBy({ id })\n return application\n})\n\n// Register supported grant types.\n//\n// OAuth 2.0 specifies a framework that allows users to grant client\n// applications limited access to their protected resources. It does this\n// through a process of the user granting access, and the client exchanging\n// the grant for an access token.\n\n// Grant authorization codes. The callback takes the `client` requesting\n// authorization, the `redirectURI` (which is used as a verifier in the\n// subsequent exchange), the authenticated `user` granting access, and\n// their response, which contains approved scope, duration, etc. as parsed by\n// the application. The application issues a code, which is bound to these\n// values, and will be exchanged for an access token.\n\nserver.grant(\n oauth2orize.grant.code(async (client, redirectUrl, user, ares, areq) => {\n const { email, appKey, subdomain, scopes, state } = ares\n\n return Application.generateAuthCode(email, appKey, subdomain, scopes, state)\n })\n)\n\n// Exchange authorization codes for access tokens. The callback accepts the\n// `client`, which is exchanging `code` and any `redirectURI` from the\n// authorization request for verification. If these values are validated, the\n// application issues an access token on behalf of the user who authorized the\n// code.\n\nserver.exchange(\n oauth2orize.exchange.code(async (client, code, redirectUrl) => {\n try {\n /* authorization code */\n var decoded: any = Application.verifyAuthCode(code)\n } catch (e) {\n return false\n }\n let { email, appKey, subdomain, scopes } = decoded\n\n const application: Application = await getRepository(Application).findOneBy({\n appKey\n })\n\n if (!application) {\n return false\n }\n\n /* DONT-FORGET uncomment after test */\n // if (redirectUrl !== application.redirectUrl && redirectUrl.indexOf(application.redirectUrl) != 0) {\n // logger.error(\n // 'oauth2 exchange error - redirectUrl should begins with the application setting',\n // redirectUrl,\n // application.redirectUrl\n // )\n // // return false\n // throw new TypeError(\n // `oauth2 exchange error - redirectUrl should begins with the application setting : '${redirectUrl}':'${application.redirectUrl}'`\n // )\n // }\n\n const domain: Domain = await getRepository(Domain).findOneBy({\n subdomain\n })\n\n const creator: User = await getRepository(User).findOneBy({ email })\n\n const appuserEmail = `${crypto.randomUUID()}@${subdomain}`\n\n var appuser: User = await getRepository(User).findOne({\n where: {\n email: appuserEmail,\n reference: application.id,\n userType: 'application'\n },\n\n relations: ['domains', 'creator', 'updater']\n })\n\n appuser = await getRepository(User).save({\n ...(appuser || {}),\n email: appuserEmail,\n name: application.name,\n userType: 'application',\n reference: application.id,\n domains: [domain],\n roles: scopes,\n status: UserStatus.ACTIVATED,\n updater: creator,\n creator\n })\n\n // appuser = await getRepository(User).findOne({\n // where: { email: appuserEmail },\n // relations: ['domains']\n // })\n\n // appuser.domains = Promise.resolve([domain])\n // await getRepository(User).save(appuser)\n // Lazy relation 필드들(domain, domains)들에 대한 업데이트. 이상의 방법으로 업데이트 해야하는 것 같다.\n // Lazy relation 업데이트 방법의 일관성이 부족하므로, Lazy relation 필드를 사용하지 않기를 권장함.\n\n var accessToken = Application.generateAccessToken(domain, appuser, appKey, scopes)\n var refreshToken = Application.generateRefreshToken(domain, appuser, appKey, scopes)\n\n await getRepository(User).save({\n ...(appuser as any),\n password: refreshToken\n })\n\n return [\n accessToken,\n refreshToken,\n {\n expires_in: 30 * 24 * 60 * 60 /* 30d */,\n token_type: 'bearer',\n centerId: subdomain\n }\n ]\n })\n)\n\nserver.exchange(\n oauth2orize.exchange.refreshToken(async (client, refreshToken, scope) => {\n try {\n /* refresh token */\n var decoded: any = Application.verifyAuthCode(refreshToken)\n } catch (e) {\n logger.error(e)\n return false\n }\n const {\n id,\n userType,\n email,\n application: { appKey },\n domain: { subdomain },\n scope: originalScope,\n exp: expires_in\n } = decoded\n\n const application: Application = await getRepository(Application).findOneBy({\n appKey\n })\n\n if (!application) {\n logger.error('application is not exist')\n return false\n }\n\n if (Date.now() > expires_in * 1000) {\n logger.error('refresh token is expired')\n return false\n }\n\n const domain: Domain = await getRepository(Domain).findOneBy({\n subdomain\n })\n\n const creator: User = await getRepository(User).findOneBy({\n id,\n userType\n })\n\n const appuserEmail = `${appKey}@${subdomain}`\n\n var appuser: User = await getRepository(User).findOne({\n where: {\n email: appuserEmail,\n reference: application.id,\n userType: 'application'\n },\n relations: ['domain', 'creator', 'updater']\n })\n\n if (!appuser) {\n logger.error('application is not bound')\n return false\n }\n\n /*\n * `scope` is the scope of access requested by the client, which must not include any scope not originally granted.\n */\n\n scope = scope || originalScope\n\n const scopes: string[] = scope.split(',')\n const originalScopes = (originalScope || '').split(',')\n const additionalScope = scopes.find(scope => originalScopes.indexOf(scope) === -1)\n if (additionalScope) {\n logger.error(`additional scope(${additionalScope}) required`)\n return false\n }\n\n const roles = await getRepository(Role).findBy({\n name: In(scopes),\n domain\n })\n\n var accessToken = Application.generateAccessToken(domain, appuser, appKey, scope)\n var refreshToken: any = Application.generateRefreshToken(domain, appuser, appKey, scope)\n\n await getRepository(User).save({\n ...(appuser as any),\n roles,\n password: refreshToken\n })\n\n return [\n accessToken,\n refreshToken,\n {\n expires_in: 30 * 24 * 60 * 60 /* 30d */,\n token_type: 'bearer'\n }\n ]\n })\n)\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const pathBaseDomainRouter: any;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const siteRootRouter: any;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AppBindingMutation = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
|
-
const
|
|
6
|
+
const shell_1 = require("@things-factory/shell");
|
|
7
7
|
const user_1 = require("../user/user");
|
|
8
8
|
const app_binding_1 = require("./app-binding");
|
|
9
9
|
let AppBindingMutation = class AppBindingMutation {
|
|
@@ -11,7 +11,7 @@ let AppBindingMutation = class AppBindingMutation {
|
|
|
11
11
|
const { domain } = context.state;
|
|
12
12
|
// TODO 이 사용자가 이 도메인에 속한 사용자인지 확인해야함.
|
|
13
13
|
// TODO 다른 도메인에도 포함되어있다면, domains-users 관게와 해당 도메인 관련 정보만 삭제해야 함.
|
|
14
|
-
await (0,
|
|
14
|
+
await (0, shell_1.getRepository)(user_1.User).delete({
|
|
15
15
|
id
|
|
16
16
|
});
|
|
17
17
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-binding-mutation.js","sourceRoot":"","sources":["../../../server/service/app-binding/app-binding-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAA2D;
|
|
1
|
+
{"version":3,"file":"app-binding-mutation.js","sourceRoot":"","sources":["../../../server/service/app-binding/app-binding-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAA2D;AAE3D,iDAAqD;AAErD,uCAAmC;AACnC,+CAA0C;AAG1C,IAAa,kBAAkB,GAA/B,MAAa,kBAAkB;IAE7B,KAAK,CAAC,gBAAgB,CAAY,EAAU,EAAS,OAAwB;QAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,qCAAqC;QACrC,iEAAiE;QACjE,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,MAAM,CAAC;YAC/B,EAAE;SACH,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AAXC;IADC,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;IACL,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0DAUnD;AAZU,kBAAkB;IAD9B,IAAA,uBAAQ,EAAC,wBAAU,CAAC;GACR,kBAAkB,CAa9B;AAbY,gDAAkB","sourcesContent":["import { Arg, Ctx, Mutation, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { User } from '../user/user'\nimport { AppBinding } from './app-binding'\n\n@Resolver(AppBinding)\nexport class AppBindingMutation {\n @Mutation(returns => Boolean)\n async deleteAppBinding(@Arg('id') id: string, @Ctx() context: ResolverContext) {\n const { domain } = context.state\n\n // TODO 이 사용자가 이 도메인에 속한 사용자인지 확인해야함.\n // TODO 다른 도메인에도 포함되어있다면, domains-users 관게와 해당 도메인 관련 정보만 삭제해야 함.\n await getRepository(User).delete({\n id\n })\n\n return true\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ListParam } from '@things-factory/shell';
|
|
2
|
+
import { Application } from '../application/application';
|
|
3
|
+
import { User } from '../user/user';
|
|
4
|
+
import { UserList } from '../user/user-types';
|
|
5
|
+
import { AppBinding } from './app-binding';
|
|
6
|
+
export declare class AppBindingQuery {
|
|
7
|
+
appBinding(id: string, context: ResolverContext): Promise<User>;
|
|
8
|
+
appBindings(params: ListParam, context: ResolverContext): Promise<UserList>;
|
|
9
|
+
application(appBinding: AppBinding): Promise<Application>;
|
|
10
|
+
scope(appBinding: AppBinding): Promise<string>;
|
|
11
|
+
refreshToken(appBinding: AppBinding): Promise<string>;
|
|
12
|
+
updater(appBinding: AppBinding): Promise<User>;
|
|
13
|
+
creator(appBinding: AppBinding): Promise<User>;
|
|
14
|
+
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var _a;
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
3
|
exports.AppBindingQuery = void 0;
|
|
5
4
|
const tslib_1 = require("tslib");
|
|
6
5
|
const type_graphql_1 = require("type-graphql");
|
|
7
|
-
const typeorm_1 = require("typeorm");
|
|
8
6
|
const shell_1 = require("@things-factory/shell");
|
|
9
7
|
const get_domain_users_1 = require("../../utils/get-domain-users");
|
|
10
8
|
const application_1 = require("../application/application");
|
|
@@ -15,7 +13,7 @@ let AppBindingQuery = class AppBindingQuery {
|
|
|
15
13
|
async appBinding(id, context) {
|
|
16
14
|
const { domain } = context.state;
|
|
17
15
|
// TODO should check domain is available
|
|
18
|
-
return await (0,
|
|
16
|
+
return await (0, shell_1.getRepository)(user_1.User).findOneBy({ id, userType: 'application' });
|
|
19
17
|
}
|
|
20
18
|
/* TODO optimize query */
|
|
21
19
|
async appBindings(params, context) {
|
|
@@ -40,7 +38,7 @@ let AppBindingQuery = class AppBindingQuery {
|
|
|
40
38
|
// .map(async (user: User) => {
|
|
41
39
|
// const email = user.email
|
|
42
40
|
// const appKey = email.substr(0, email.lastIndexOf('@'))
|
|
43
|
-
// const application = await getRepository(Application).
|
|
41
|
+
// const application = await getRepository(Application).findOneBy({
|
|
44
42
|
// appKey
|
|
45
43
|
// })
|
|
46
44
|
// return {
|
|
@@ -54,20 +52,20 @@ let AppBindingQuery = class AppBindingQuery {
|
|
|
54
52
|
return { items, total: items.length };
|
|
55
53
|
}
|
|
56
54
|
async application(appBinding) {
|
|
57
|
-
return await (0,
|
|
55
|
+
return await (0, shell_1.getRepository)(application_1.Application).findOneBy({ id: appBinding.reference });
|
|
58
56
|
}
|
|
59
57
|
async scope(appBinding) {
|
|
60
|
-
const u = await (0,
|
|
58
|
+
const u = await (0, shell_1.getRepository)(user_1.User).findOne({ where: { reference: appBinding.reference }, relations: ['roles'] });
|
|
61
59
|
return u.roles.map(role => role.name).join(',');
|
|
62
60
|
}
|
|
63
61
|
async refreshToken(appBinding) {
|
|
64
62
|
return appBinding.password;
|
|
65
63
|
}
|
|
66
64
|
async updater(appBinding) {
|
|
67
|
-
return await (0,
|
|
65
|
+
return await (0, shell_1.getRepository)(user_1.User).findOneBy({ id: appBinding.updaterId });
|
|
68
66
|
}
|
|
69
67
|
async creator(appBinding) {
|
|
70
|
-
return await (0,
|
|
68
|
+
return await (0, shell_1.getRepository)(user_1.User).findOneBy({ id: appBinding.creatorId });
|
|
71
69
|
}
|
|
72
70
|
};
|
|
73
71
|
tslib_1.__decorate([
|
|
@@ -83,7 +81,7 @@ tslib_1.__decorate([
|
|
|
83
81
|
tslib_1.__param(0, (0, type_graphql_1.Args)()),
|
|
84
82
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
85
83
|
tslib_1.__metadata("design:type", Function),
|
|
86
|
-
tslib_1.__metadata("design:paramtypes", [
|
|
84
|
+
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
87
85
|
tslib_1.__metadata("design:returntype", Promise)
|
|
88
86
|
], AppBindingQuery.prototype, "appBindings", null);
|
|
89
87
|
tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-binding-query.js","sourceRoot":"","sources":["../../../server/service/app-binding/app-binding-query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-binding-query.js","sourceRoot":"","sources":["../../../server/service/app-binding/app-binding-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { SelectQueryBuilder } from 'typeorm'\n\nimport { buildQuery, getRepository, ListParam } from '@things-factory/shell'\n\nimport { buildDomainUsersQueryBuilder } from '../../utils/get-domain-users'\nimport { Application } from '../application/application'\nimport { User } from '../user/user'\nimport { UserList } from '../user/user-types'\nimport { AppBinding } from './app-binding'\nimport { AppBindingList } from './app-binding-types'\n\n@Resolver(AppBinding)\nexport class AppBindingQuery {\n @Query(returns => AppBinding)\n async appBinding(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<User> {\n const { domain } = context.state\n\n // TODO should check domain is available\n return await getRepository(User).findOneBy({ id, userType: 'application' })\n }\n\n /* TODO optimize query */\n @Query(returns => AppBindingList)\n async appBindings(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<UserList> {\n const { domain } = context.state\n\n // const convertedParams = convertListParams(params)\n // convertedParams.where = {\n // ...convertedParams.where,\n // userType: 'application'\n // } as any\n\n const alias: string = 'USER'\n const qb: SelectQueryBuilder<User> = buildDomainUsersQueryBuilder(domain.id, alias)\n buildQuery(qb, params, null, { domainRef: false })\n var [items] = await qb\n // .leftJoinAndSelect(`${alias}.roles`, 'ROLES')\n // .leftJoinAndSelect(`${alias}.creator`, 'CREATOR')\n // .leftJoinAndSelect(`${alias}.updater`, 'UPDATER')\n .getManyAndCount()\n\n items = items.filter((user: User) => user.userType == 'application')\n\n // var boundApps = await Promise.all(\n // items\n // .filter((user: User) => user.userType == 'application')\n // .map(async (user: User) => {\n // const email = user.email\n // const appKey = email.substr(0, email.lastIndexOf('@'))\n // const application = await getRepository(Application).findOneBy({\n // appKey\n // })\n\n // return {\n // ...user,\n // application,\n // scope: user.roles.map(role => role.name).join(','),\n // refreshToken: user.password\n // }\n // })\n // )\n\n return { items, total: items.length }\n }\n\n @FieldResolver(type => Application)\n async application(@Root() appBinding: AppBinding): Promise<Application> {\n return await getRepository(Application).findOneBy({ id: appBinding.reference })\n }\n\n @FieldResolver(type => String)\n async scope(@Root() appBinding: AppBinding): Promise<string> {\n const u = await getRepository(User).findOne({ where: { reference: appBinding.reference }, relations: ['roles'] })\n return u.roles.map(role => role.name).join(',')\n }\n\n @FieldResolver(type => String)\n async refreshToken(@Root() appBinding: AppBinding): Promise<string> {\n return appBinding.password\n }\n\n @FieldResolver(type => User)\n async updater(@Root() appBinding: AppBinding): Promise<User> {\n return await getRepository(User).findOneBy({ id: appBinding.updaterId })\n }\n\n @FieldResolver(type => User)\n async creator(@Root() appBinding: AppBinding): Promise<User> {\n return await getRepository(User).findOneBy({ id: appBinding.creatorId })\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Appliance } from './appliance';
|
|
2
|
+
import { AppliancePatch, NewAppliance } from './appliance-types';
|
|
3
|
+
export declare class ApplianceMutation {
|
|
4
|
+
createAppliance(appliance: NewAppliance, context: ResolverContext): Promise<Appliance>;
|
|
5
|
+
deleteAppliance(id: string, context: ResolverContext): Promise<Boolean>;
|
|
6
|
+
generateApplianceSecret(id: string, context: ResolverContext): Promise<Appliance>;
|
|
7
|
+
updateAppliance(id: string, patch: AppliancePatch, context: ResolverContext): Promise<Appliance>;
|
|
8
|
+
}
|
|
@@ -3,31 +3,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ApplianceMutation = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
|
-
const
|
|
6
|
+
const shell_1 = require("@things-factory/shell");
|
|
7
7
|
const user_1 = require("../user/user");
|
|
8
8
|
const appliance_1 = require("./appliance");
|
|
9
9
|
const appliance_types_1 = require("./appliance-types");
|
|
10
10
|
const crypto = require('crypto');
|
|
11
11
|
let ApplianceMutation = class ApplianceMutation {
|
|
12
12
|
async createAppliance(appliance, context) {
|
|
13
|
-
return await (0,
|
|
13
|
+
return await (0, shell_1.getRepository)(appliance_1.Appliance).save(Object.assign({ domain: context.state.domain, creator: context.state.user, updater: context.state.user }, appliance));
|
|
14
14
|
}
|
|
15
15
|
async deleteAppliance(id, context) {
|
|
16
16
|
const { domain } = context.state;
|
|
17
17
|
// TODO 이 사용자가 이 도메인에 속한 사용자인지 확인해야함.
|
|
18
18
|
// TODO 다른 도메인에도 포함되어있다면, domains-users 관게와 해당 도메인 관련 정보만 삭제해야 함.
|
|
19
|
-
await (0,
|
|
19
|
+
await (0, shell_1.getRepository)(user_1.User).delete({
|
|
20
20
|
reference: id,
|
|
21
21
|
userType: 'appliance'
|
|
22
22
|
});
|
|
23
|
-
await (0,
|
|
23
|
+
await (0, shell_1.getRepository)(appliance_1.Appliance).delete({ domain: { id: domain.id }, id });
|
|
24
24
|
return true;
|
|
25
25
|
}
|
|
26
26
|
async generateApplianceSecret(id, context) {
|
|
27
27
|
const { domain, user } = context.state;
|
|
28
|
-
const appliance = await (0,
|
|
28
|
+
const appliance = await (0, shell_1.getRepository)(appliance_1.Appliance).findOneBy({ domain: { id: domain.id }, id });
|
|
29
29
|
const appuserEmail = `${crypto.randomUUID()}@${domain === null || domain === void 0 ? void 0 : domain.subdomain}`;
|
|
30
|
-
let appuser = await (0,
|
|
30
|
+
let appuser = await (0, shell_1.getRepository)(user_1.User).findOne({
|
|
31
31
|
where: {
|
|
32
32
|
reference: id,
|
|
33
33
|
userType: 'appliance'
|
|
@@ -36,7 +36,7 @@ let ApplianceMutation = class ApplianceMutation {
|
|
|
36
36
|
});
|
|
37
37
|
if (!appuser) {
|
|
38
38
|
/* newly create appuser */
|
|
39
|
-
appuser = await (0,
|
|
39
|
+
appuser = await (0, shell_1.getRepository)(user_1.User).save({
|
|
40
40
|
email: appuserEmail,
|
|
41
41
|
name: appliance.name,
|
|
42
42
|
userType: 'appliance',
|
|
@@ -51,13 +51,14 @@ let ApplianceMutation = class ApplianceMutation {
|
|
|
51
51
|
context.throw(401, 'appliance is not allowed for this domain');
|
|
52
52
|
}
|
|
53
53
|
appuser.password = appliance_1.Appliance.generateAccessToken(domain, appuser, appliance);
|
|
54
|
-
await (0,
|
|
55
|
-
return await (0,
|
|
54
|
+
await (0, shell_1.getRepository)(user_1.User).save(appuser);
|
|
55
|
+
return await (0, shell_1.getRepository)(appliance_1.Appliance).save(Object.assign(Object.assign({}, appliance), { accessToken: appuser.password, updater: user }));
|
|
56
56
|
}
|
|
57
57
|
async updateAppliance(id, patch, context) {
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const
|
|
58
|
+
const { domain } = context.state;
|
|
59
|
+
const applianceRepository = (0, shell_1.getRepository)(appliance_1.Appliance);
|
|
60
|
+
const userRepository = (0, shell_1.getRepository)(user_1.User);
|
|
61
|
+
const appliance = await applianceRepository.findOne({ where: { domain: { id: domain.id }, id } });
|
|
61
62
|
const user = await userRepository.findOne({ where: { reference: id, userType: 'appliance' } });
|
|
62
63
|
userRepository.save(Object.assign(Object.assign({}, user), { name: (patch === null || patch === void 0 ? void 0 : patch.name) || user.name }));
|
|
63
64
|
return await applianceRepository.save(Object.assign(Object.assign(Object.assign({}, appliance), patch), { updater: context.state.user }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appliance-mutation.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAA2D;
|
|
1
|
+
{"version":3,"file":"appliance-mutation.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAA2D;AAE3D,iDAAqD;AAErD,uCAA+C;AAC/C,2CAAuC;AACvC,uDAAgE;AAEhE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAGhC,IAAa,iBAAiB,GAA9B,MAAa,iBAAiB;IAE5B,KAAK,CAAC,eAAe,CACD,SAAuB,EAClC,OAAwB;QAE/B,OAAO,MAAM,IAAA,qBAAa,EAAC,qBAAS,CAAC,CAAC,IAAI,iBACxC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAC5B,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAC3B,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,IACxB,SAAS,EACZ,CAAA;IACJ,CAAC;IAGD,KAAK,CAAC,eAAe,CAAY,EAAU,EAAS,OAAwB;QAC1E,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,qCAAqC;QACrC,iEAAiE;QACjE,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,MAAM,CAAC;YAC/B,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,WAAW;SACtB,CAAC,CAAA;QAEF,MAAM,IAAA,qBAAa,EAAC,qBAAS,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAExE,OAAO,IAAI,CAAA;IACb,CAAC;IAGD,KAAK,CAAC,uBAAuB,CAAY,EAAU,EAAS,OAAwB;QAClF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEtC,MAAM,SAAS,GAAc,MAAM,IAAA,qBAAa,EAAC,qBAAS,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAExG,MAAM,YAAY,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,EAAE,CAAA;QAClE,IAAI,OAAO,GAAS,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,OAAO,CAAC;YACpD,KAAK,EAAE;gBACL,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,WAAW;aACtB;YACD,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,EAAE;YACZ,0BAA0B;YAC1B,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,IAAI,CAAC;gBACvC,KAAK,EAAE,YAAY;gBACnB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,QAAQ,EAAE,WAAW;gBACrB,SAAS,EAAE,EAAE;gBACb,MAAM,EAAE,iBAAU,CAAC,SAAS;gBAC5B,OAAO,EAAE,CAAC,MAAM,CAAC;gBACjB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;aACd,CAAC,CAAA;SACH;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,EAAE;YAClD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAA;SAC/D;QAED,OAAO,CAAC,QAAQ,GAAG,qBAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QAE5E,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAEvC,OAAO,MAAM,IAAA,qBAAa,EAAC,qBAAS,CAAC,CAAC,IAAI,iCACrC,SAAS,KACZ,WAAW,EAAE,OAAO,CAAC,QAAQ,EAC7B,OAAO,EAAE,IAAI,IACb,CAAA;IACJ,CAAC;IAGD,KAAK,CAAC,eAAe,CACR,EAAU,EACP,KAAqB,EAC5B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,mBAAmB,GAAG,IAAA,qBAAa,EAAC,qBAAS,CAAC,CAAA;QACpD,MAAM,cAAc,GAAG,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAA;QAC1C,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACjG,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QAE9F,cAAc,CAAC,IAAI,iCACd,IAAI,KACP,IAAI,EAAE,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,KAAI,IAAI,CAAC,IAAI,IAC9B,CAAA;QAEF,OAAO,MAAM,mBAAmB,CAAC,IAAI,+CAChC,SAAS,GACT,KAAK,KACR,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,IAC3B,CAAA;IACJ,CAAC;CACF,CAAA;AA/FC;IADC,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,qBAAS,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;IAExE,mBAAA,IAAA,kBAAG,EAAC,WAAW,CAAC,CAAA;IAChB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CADuB,8BAAY;;wDAS1C;AAGD;IADC,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IAC9C,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;wDAYlD;AAGD;IADC,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,qBAAS,CAAC;IACA,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gEAyC1D;AAGD;IADC,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,qBAAS,CAAC;IAE5B,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IACT,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IACZ,mBAAA,IAAA,kBAAG,GAAE,CAAA;;qDADe,gCAAc;;wDAoBpC;AAhGU,iBAAiB;IAD7B,IAAA,uBAAQ,EAAC,qBAAS,CAAC;GACP,iBAAiB,CAiG7B;AAjGY,8CAAiB","sourcesContent":["import { Arg, Ctx, Mutation, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { User, UserStatus } from '../user/user'\nimport { Appliance } from './appliance'\nimport { AppliancePatch, NewAppliance } from './appliance-types'\n\nconst crypto = require('crypto')\n\n@Resolver(Appliance)\nexport class ApplianceMutation {\n @Mutation(returns => Appliance, { description: 'To create new appliance' })\n async createAppliance(\n @Arg('appliance') appliance: NewAppliance,\n @Ctx() context: ResolverContext\n ): Promise<Appliance> {\n return await getRepository(Appliance).save({\n domain: context.state.domain,\n creator: context.state.user,\n updater: context.state.user,\n ...appliance\n })\n }\n\n @Mutation(returns => Boolean, { description: 'To delete appliance' })\n async deleteAppliance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Boolean> {\n const { domain } = context.state\n // TODO 이 사용자가 이 도메인에 속한 사용자인지 확인해야함.\n // TODO 다른 도메인에도 포함되어있다면, domains-users 관게와 해당 도메인 관련 정보만 삭제해야 함.\n await getRepository(User).delete({\n reference: id,\n userType: 'appliance'\n })\n\n await getRepository(Appliance).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Mutation(returns => Appliance)\n async generateApplianceSecret(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Appliance> {\n const { domain, user } = context.state\n\n const appliance: Appliance = await getRepository(Appliance).findOneBy({ domain: { id: domain.id }, id })\n\n const appuserEmail = `${crypto.randomUUID()}@${domain?.subdomain}`\n let appuser: User = await getRepository(User).findOne({\n where: {\n reference: id,\n userType: 'appliance'\n },\n relations: ['domains']\n })\n\n if (!appuser) {\n /* newly create appuser */\n appuser = await getRepository(User).save({\n email: appuserEmail,\n name: appliance.name,\n userType: 'appliance',\n reference: id,\n status: UserStatus.ACTIVATED,\n domains: [domain],\n updater: user,\n creator: user\n })\n }\n\n if (!appuser.domains.find(d => d.id === domain.id)) {\n context.throw(401, 'appliance is not allowed for this domain')\n }\n\n appuser.password = Appliance.generateAccessToken(domain, appuser, appliance)\n\n await getRepository(User).save(appuser)\n\n return await getRepository(Appliance).save({\n ...appliance,\n accessToken: appuser.password,\n updater: user\n })\n }\n\n @Mutation(returns => Appliance)\n async updateAppliance(\n @Arg('id') id: string,\n @Arg('patch') patch: AppliancePatch,\n @Ctx() context: ResolverContext\n ): Promise<Appliance> {\n const { domain } = context.state\n\n const applianceRepository = getRepository(Appliance)\n const userRepository = getRepository(User)\n const appliance = await applianceRepository.findOne({ where: { domain: { id: domain.id }, id } })\n const user = await userRepository.findOne({ where: { reference: id, userType: 'appliance' } })\n\n userRepository.save({\n ...user,\n name: patch?.name || user.name\n })\n\n return await applianceRepository.save({\n ...appliance,\n ...patch,\n updater: context.state.user\n })\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Domain, ListParam } from '@things-factory/shell';
|
|
2
|
+
import { Appliance } from '../appliance/appliance';
|
|
3
|
+
import { User } from '../user/user';
|
|
4
|
+
import { ApplianceList } from './appliance-types';
|
|
5
|
+
export declare class ApplianceQuery {
|
|
6
|
+
appliance(id: string, context: ResolverContext): Promise<Appliance>;
|
|
7
|
+
appliances(params: ListParam, context: ResolverContext): Promise<ApplianceList>;
|
|
8
|
+
domain(context: ResolverContext): Promise<Domain>;
|
|
9
|
+
updater(appliance: Appliance): Promise<User>;
|
|
10
|
+
creator(appliance: Appliance): Promise<User>;
|
|
11
|
+
}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var _a;
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
3
|
exports.ApplianceQuery = void 0;
|
|
5
4
|
const tslib_1 = require("tslib");
|
|
6
5
|
const type_graphql_1 = require("type-graphql");
|
|
7
|
-
const user_1 = require("../user/user");
|
|
8
|
-
const appliance_1 = require("../appliance/appliance");
|
|
9
6
|
const shell_1 = require("@things-factory/shell");
|
|
10
|
-
const
|
|
7
|
+
const appliance_1 = require("../appliance/appliance");
|
|
8
|
+
const user_1 = require("../user/user");
|
|
11
9
|
const appliance_types_1 = require("./appliance-types");
|
|
12
10
|
let ApplianceQuery = class ApplianceQuery {
|
|
13
11
|
async appliance(id, context) {
|
|
14
12
|
const { domain } = context.state;
|
|
15
|
-
return await (0,
|
|
13
|
+
return await (0, shell_1.getRepository)(appliance_1.Appliance).findOneBy({ domain: { id: domain.id }, id });
|
|
16
14
|
}
|
|
17
15
|
async appliances(params, context) {
|
|
18
|
-
const queryBuilder = (0,
|
|
16
|
+
const queryBuilder = (0, shell_1.getRepository)(appliance_1.Appliance).createQueryBuilder();
|
|
19
17
|
(0, shell_1.buildQuery)(queryBuilder, params, context);
|
|
20
18
|
const [items, total] = await queryBuilder.getManyAndCount();
|
|
21
19
|
return { items, total };
|
|
@@ -24,10 +22,10 @@ let ApplianceQuery = class ApplianceQuery {
|
|
|
24
22
|
return context.state.domain;
|
|
25
23
|
}
|
|
26
24
|
async updater(appliance) {
|
|
27
|
-
return await (0,
|
|
25
|
+
return await (0, shell_1.getRepository)(user_1.User).findOneBy({ id: appliance.updaterId });
|
|
28
26
|
}
|
|
29
27
|
async creator(appliance) {
|
|
30
|
-
return await (0,
|
|
28
|
+
return await (0, shell_1.getRepository)(user_1.User).findOneBy({ id: appliance.creatorId });
|
|
31
29
|
}
|
|
32
30
|
};
|
|
33
31
|
tslib_1.__decorate([
|
|
@@ -43,7 +41,7 @@ tslib_1.__decorate([
|
|
|
43
41
|
tslib_1.__param(0, (0, type_graphql_1.Args)()),
|
|
44
42
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
45
43
|
tslib_1.__metadata("design:type", Function),
|
|
46
|
-
tslib_1.__metadata("design:paramtypes", [
|
|
44
|
+
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
47
45
|
tslib_1.__metadata("design:returntype", Promise)
|
|
48
46
|
], ApplianceQuery.prototype, "appliances", null);
|
|
49
47
|
tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appliance-query.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance-query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"appliance-query.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAmF;AAEnF,iDAAoF;AAEpF,sDAAkD;AAClD,uCAAmC;AACnC,uDAAiD;AAGjD,IAAa,cAAc,GAA3B,MAAa,cAAc;IAEzB,KAAK,CAAC,SAAS,CAAY,EAAU,EAAS,OAAwB;QACpE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,OAAO,MAAM,IAAA,qBAAa,EAAC,qBAAS,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACpF,CAAC;IAGD,KAAK,CAAC,UAAU,CAAS,MAAiB,EAAS,OAAwB;QACzE,MAAM,YAAY,GAAG,IAAA,qBAAa,EAAC,qBAAS,CAAC,CAAC,kBAAkB,EAAE,CAAA;QAClE,IAAA,kBAAU,EAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAEzC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAA;QAE3D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;IAGD,KAAK,CAAC,MAAM,CAAQ,OAAwB;QAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,CAAA;IAC7B,CAAC;IAGD,KAAK,CAAC,OAAO,CAAS,SAAoB;QACxC,OAAO,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAA;IACzE,CAAC;IAGD,KAAK,CAAC,OAAO,CAAS,SAAoB;QACxC,OAAO,MAAM,IAAA,qBAAa,EAAC,WAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAA;IACzE,CAAC;CACF,CAAA;AA7BC;IADC,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,qBAAS,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IACnD,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;+CAG5C;AAGD;IADC,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,+BAAa,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;IAC9D,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;gDAOzC;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IAChB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;4CAElB;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,WAAI,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;6CAEzC;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,WAAI,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;6CAEzC;AA9BU,cAAc;IAD1B,IAAA,uBAAQ,EAAC,qBAAS,CAAC;GACP,cAAc,CA+B1B;AA/BY,wCAAc","sourcesContent":["import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { buildQuery, Domain, getRepository, ListParam } from '@things-factory/shell'\n\nimport { Appliance } from '../appliance/appliance'\nimport { User } from '../user/user'\nimport { ApplianceList } from './appliance-types'\n\n@Resolver(Appliance)\nexport class ApplianceQuery {\n @Query(returns => Appliance, { description: ' To fetch appliance' })\n async appliance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Appliance> {\n const { domain } = context.state\n return await getRepository(Appliance).findOneBy({ domain: { id: domain.id }, id })\n }\n\n @Query(returns => ApplianceList, { description: 'To fetch multiple appliance' })\n async appliances(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<ApplianceList> {\n const queryBuilder = getRepository(Appliance).createQueryBuilder()\n buildQuery(queryBuilder, params, context)\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Ctx() context: ResolverContext) {\n return context.state.domain\n }\n\n @FieldResolver(type => User)\n async updater(@Root() appliance: Appliance): Promise<User> {\n return await getRepository(User).findOneBy({ id: appliance.updaterId })\n }\n\n @FieldResolver(type => User)\n async creator(@Root() appliance: Appliance): Promise<User> {\n return await getRepository(User).findOneBy({ id: appliance.creatorId })\n }\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Appliance } from './appliance';
|
|
2
|
+
export declare class ApplianceList {
|
|
3
|
+
items?: Appliance[];
|
|
4
|
+
total?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class AppliancePatch {
|
|
7
|
+
id?: string;
|
|
8
|
+
serialNo?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
brand?: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
netmask?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class NewAppliance {
|
|
16
|
+
serialNo: string;
|
|
17
|
+
name: string;
|
|
18
|
+
brand: string;
|
|
19
|
+
model: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
netmask?: string;
|
|
22
|
+
}
|