@things-factory/auth-base 9.0.0-beta.8 → 9.0.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.
Files changed (168) hide show
  1. package/config/config.development.js +1 -0
  2. package/dist-client/auth.js +2 -7
  3. package/dist-client/auth.js.map +1 -1
  4. package/dist-client/reducers/auth.js +9 -2
  5. package/dist-client/reducers/auth.js.map +1 -1
  6. package/dist-client/tsconfig.tsbuildinfo +1 -1
  7. package/dist-server/controllers/change-pwd.js +5 -2
  8. package/dist-server/controllers/change-pwd.js.map +1 -1
  9. package/dist-server/controllers/checkin.js +1 -1
  10. package/dist-server/controllers/checkin.js.map +1 -1
  11. package/dist-server/controllers/delete-user.js +2 -2
  12. package/dist-server/controllers/delete-user.js.map +1 -1
  13. package/dist-server/controllers/profile.js +4 -1
  14. package/dist-server/controllers/profile.js.map +1 -1
  15. package/dist-server/controllers/reset-password.js +5 -2
  16. package/dist-server/controllers/reset-password.js.map +1 -1
  17. package/dist-server/controllers/signin.js +2 -2
  18. package/dist-server/controllers/signin.js.map +1 -1
  19. package/dist-server/controllers/signup.js +8 -1
  20. package/dist-server/controllers/signup.js.map +1 -1
  21. package/dist-server/errors/auth-error.js +3 -1
  22. package/dist-server/errors/auth-error.js.map +1 -1
  23. package/dist-server/middlewares/authenticate-401-middleware.js +22 -9
  24. package/dist-server/middlewares/authenticate-401-middleware.js.map +1 -1
  25. package/dist-server/middlewares/bypass-signin-middleware.d.ts +1 -0
  26. package/dist-server/middlewares/bypass-signin-middleware.js +20 -0
  27. package/dist-server/middlewares/bypass-signin-middleware.js.map +1 -0
  28. package/dist-server/middlewares/domain-authenticate-middleware.js +1 -5
  29. package/dist-server/middlewares/domain-authenticate-middleware.js.map +1 -1
  30. package/dist-server/middlewares/index.js +6 -1
  31. package/dist-server/middlewares/index.js.map +1 -1
  32. package/dist-server/middlewares/jwt-authenticate-middleware.js +1 -1
  33. package/dist-server/middlewares/jwt-authenticate-middleware.js.map +1 -1
  34. package/dist-server/migrations/1548206416130-SeedUser.js +11 -3
  35. package/dist-server/migrations/1548206416130-SeedUser.js.map +1 -1
  36. package/dist-server/router/auth-checkin-router.js +11 -13
  37. package/dist-server/router/auth-checkin-router.js.map +1 -1
  38. package/dist-server/router/auth-private-process-router.js +10 -4
  39. package/dist-server/router/auth-private-process-router.js.map +1 -1
  40. package/dist-server/router/auth-signup-router.js +5 -2
  41. package/dist-server/router/auth-signup-router.js.map +1 -1
  42. package/dist-server/router/oauth2/oauth2-authorize-router.js +5 -2
  43. package/dist-server/router/oauth2/oauth2-authorize-router.js.map +1 -1
  44. package/dist-server/router/oauth2/oauth2-router.js +1 -2
  45. package/dist-server/router/oauth2/oauth2-router.js.map +1 -1
  46. package/dist-server/router/oauth2/oauth2-server.js +21 -3
  47. package/dist-server/router/oauth2/oauth2-server.js.map +1 -1
  48. package/dist-server/router/site-root-router.js +1 -1
  49. package/dist-server/router/site-root-router.js.map +1 -1
  50. package/dist-server/router/webauthn-router.js +1 -1
  51. package/dist-server/router/webauthn-router.js.map +1 -1
  52. package/dist-server/routes.js +74 -48
  53. package/dist-server/routes.js.map +1 -1
  54. package/dist-server/service/app-binding/app-binding-types.js +3 -3
  55. package/dist-server/service/app-binding/app-binding-types.js.map +1 -1
  56. package/dist-server/service/app-binding/app-binding.js +6 -4
  57. package/dist-server/service/app-binding/app-binding.js.map +1 -1
  58. package/dist-server/service/appliance/appliance-mutation.js +37 -34
  59. package/dist-server/service/appliance/appliance-mutation.js.map +1 -1
  60. package/dist-server/service/appliance/appliance-types.js +18 -18
  61. package/dist-server/service/appliance/appliance-types.js.map +1 -1
  62. package/dist-server/service/appliance/appliance.d.ts +2 -0
  63. package/dist-server/service/appliance/appliance.js +61 -14
  64. package/dist-server/service/appliance/appliance.js.map +1 -1
  65. package/dist-server/service/application/application-mutation.js +22 -4
  66. package/dist-server/service/application/application-mutation.js.map +1 -1
  67. package/dist-server/service/application/application-types.js +24 -24
  68. package/dist-server/service/application/application-types.js.map +1 -1
  69. package/dist-server/service/application/application.d.ts +6 -6
  70. package/dist-server/service/application/application.js +22 -22
  71. package/dist-server/service/application/application.js.map +1 -1
  72. package/dist-server/service/auth-provider/auth-provider-mutation.js +29 -7
  73. package/dist-server/service/auth-provider/auth-provider-mutation.js.map +1 -1
  74. package/dist-server/service/auth-provider/auth-provider-parameter-spec.js +12 -7
  75. package/dist-server/service/auth-provider/auth-provider-parameter-spec.js.map +1 -1
  76. package/dist-server/service/auth-provider/auth-provider-type.js +24 -21
  77. package/dist-server/service/auth-provider/auth-provider-type.js.map +1 -1
  78. package/dist-server/service/auth-provider/auth-provider.js +35 -25
  79. package/dist-server/service/auth-provider/auth-provider.js.map +1 -1
  80. package/dist-server/service/domain-generator/domain-generator-mutation.js +1 -2
  81. package/dist-server/service/domain-generator/domain-generator-mutation.js.map +1 -1
  82. package/dist-server/service/domain-generator/domain-generator-types.js +17 -14
  83. package/dist-server/service/domain-generator/domain-generator-types.js.map +1 -1
  84. package/dist-server/service/domain-link/domain-link-mutation.d.ts +9 -0
  85. package/dist-server/service/domain-link/domain-link-mutation.js +133 -0
  86. package/dist-server/service/domain-link/domain-link-mutation.js.map +1 -0
  87. package/dist-server/service/domain-link/domain-link-query.d.ts +11 -0
  88. package/dist-server/service/domain-link/domain-link-query.js +75 -0
  89. package/dist-server/service/domain-link/domain-link-query.js.map +1 -0
  90. package/dist-server/service/domain-link/domain-link-types.d.ts +18 -0
  91. package/dist-server/service/domain-link/domain-link-types.js +66 -0
  92. package/dist-server/service/domain-link/domain-link-types.js.map +1 -0
  93. package/dist-server/service/domain-link/domain-link.d.ts +28 -0
  94. package/dist-server/service/domain-link/domain-link.js +105 -0
  95. package/dist-server/service/domain-link/domain-link.js.map +1 -0
  96. package/dist-server/service/domain-link/index.d.ts +6 -0
  97. package/dist-server/service/domain-link/index.js +10 -0
  98. package/dist-server/service/domain-link/index.js.map +1 -0
  99. package/dist-server/service/granted-role/granted-role-mutation.js +7 -7
  100. package/dist-server/service/granted-role/granted-role-mutation.js.map +1 -1
  101. package/dist-server/service/granted-role/granted-role.js +4 -4
  102. package/dist-server/service/granted-role/granted-role.js.map +1 -1
  103. package/dist-server/service/index.d.ts +3 -1
  104. package/dist-server/service/index.js +7 -2
  105. package/dist-server/service/index.js.map +1 -1
  106. package/dist-server/service/invitation/invitation-mutation.js +6 -2
  107. package/dist-server/service/invitation/invitation-mutation.js.map +1 -1
  108. package/dist-server/service/invitation/invitation-types.js +3 -3
  109. package/dist-server/service/invitation/invitation-types.js.map +1 -1
  110. package/dist-server/service/invitation/invitation.js +10 -10
  111. package/dist-server/service/invitation/invitation.js.map +1 -1
  112. package/dist-server/service/login-history/login-history-type.js +3 -3
  113. package/dist-server/service/login-history/login-history-type.js.map +1 -1
  114. package/dist-server/service/login-history/login-history.js +6 -6
  115. package/dist-server/service/login-history/login-history.js.map +1 -1
  116. package/dist-server/service/partner/partner-types.js +3 -3
  117. package/dist-server/service/partner/partner-types.js.map +1 -1
  118. package/dist-server/service/partner/partner.js +8 -8
  119. package/dist-server/service/partner/partner.js.map +1 -1
  120. package/dist-server/service/password-history/password-history.js +3 -3
  121. package/dist-server/service/password-history/password-history.js.map +1 -1
  122. package/dist-server/service/privilege/privilege-directive.js +1 -2
  123. package/dist-server/service/privilege/privilege-directive.js.map +1 -1
  124. package/dist-server/service/privilege/privilege-mutation.js +11 -2
  125. package/dist-server/service/privilege/privilege-mutation.js.map +1 -1
  126. package/dist-server/service/privilege/privilege.js +20 -20
  127. package/dist-server/service/privilege/privilege.js.map +1 -1
  128. package/dist-server/service/role/role-mutation.js +12 -2
  129. package/dist-server/service/role/role-mutation.js.map +1 -1
  130. package/dist-server/service/role/role-query.d.ts +7 -3
  131. package/dist-server/service/role/role-query.js +18 -10
  132. package/dist-server/service/role/role-query.js.map +1 -1
  133. package/dist-server/service/role/role-types.d.ts +4 -0
  134. package/dist-server/service/role/role-types.js +41 -27
  135. package/dist-server/service/role/role-types.js.map +1 -1
  136. package/dist-server/service/role/role.js +11 -11
  137. package/dist-server/service/role/role.js.map +1 -1
  138. package/dist-server/service/user/user-mutation.js +89 -41
  139. package/dist-server/service/user/user-mutation.js.map +1 -1
  140. package/dist-server/service/user/user-query.d.ts +1 -0
  141. package/dist-server/service/user/user-query.js +25 -9
  142. package/dist-server/service/user/user-query.js.map +1 -1
  143. package/dist-server/service/user/user-types.js +33 -32
  144. package/dist-server/service/user/user-types.js.map +1 -1
  145. package/dist-server/service/user/user.d.ts +5 -5
  146. package/dist-server/service/user/user.js +25 -22
  147. package/dist-server/service/user/user.js.map +1 -1
  148. package/dist-server/service/users-auth-providers/users-auth-providers.js +11 -8
  149. package/dist-server/service/users-auth-providers/users-auth-providers.js.map +1 -1
  150. package/dist-server/service/verification-token/verification-token.d.ts +3 -3
  151. package/dist-server/service/verification-token/verification-token.js +8 -8
  152. package/dist-server/service/verification-token/verification-token.js.map +1 -1
  153. package/dist-server/service/web-auth-credential/web-auth-credential.js +11 -10
  154. package/dist-server/service/web-auth-credential/web-auth-credential.js.map +1 -1
  155. package/dist-server/tsconfig.tsbuildinfo +1 -1
  156. package/dist-server/utils/access-token-cookie.js +1 -11
  157. package/dist-server/utils/access-token-cookie.js.map +1 -1
  158. package/dist-server/utils/check-user-belongs-domain.js +1 -2
  159. package/dist-server/utils/check-user-belongs-domain.js.map +1 -1
  160. package/dist-server/utils/get-domain-users.js +2 -2
  161. package/dist-server/utils/get-domain-users.js.map +1 -1
  162. package/dist-server/utils/get-user-domains.d.ts +0 -1
  163. package/dist-server/utils/get-user-domains.js +28 -22
  164. package/dist-server/utils/get-user-domains.js.map +1 -1
  165. package/package.json +6 -6
  166. package/dist-server/utils/get-domain-from-hostname.d.ts +0 -1
  167. package/dist-server/utils/get-domain-from-hostname.js +0 -9
  168. package/dist-server/utils/get-domain-from-hostname.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"app-binding-types.js","sourceRoot":"","sources":["../../../server/service/app-binding/app-binding-types.ts"],"names":[],"mappings":";;;;AAAA,+CAAqD;AACrD,qDAA6C;AAGtC,IAAM,cAAc,GAApB,MAAM,cAAc;CAM1B,CAAA;AANY,wCAAc;AAEzB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,2BAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CAC5B;AAGpB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACzB;yBALH,cAAc;IAD1B,IAAA,yBAAU,GAAE;GACA,cAAc,CAM1B","sourcesContent":["import { Field, Int, ObjectType } from 'type-graphql'\nimport { AppBinding } from './app-binding.js'\n\n@ObjectType()\nexport class AppBindingList {\n @Field(type => [AppBinding], { nullable: true })\n items?: [AppBinding]\n\n @Field(type => Int, { nullable: true })\n total?: number\n}\n"]}
1
+ {"version":3,"file":"app-binding-types.js","sourceRoot":"","sources":["../../../server/service/app-binding/app-binding-types.ts"],"names":[],"mappings":";;;;AAAA,+CAAqD;AACrD,qDAA6C;AAGtC,IAAM,cAAc,GAApB,MAAM,cAAc;CAM1B,CAAA;AANY,wCAAc;AAEzB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,2BAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;;6CACnF;AAGpB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;;6CACnF;yBALH,cAAc;IAD1B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;GAC5D,cAAc,CAM1B","sourcesContent":["import { Field, Int, ObjectType } from 'type-graphql'\nimport { AppBinding } from './app-binding.js'\n\n@ObjectType({ description: 'A paginated list of application bindings.' })\nexport class AppBindingList {\n @Field(type => [AppBinding], { nullable: true, description: 'The list of application binding items.' })\n items?: [AppBinding]\n\n @Field(type => Int, { nullable: true, description: 'The total number of application bindings.' })\n total?: number\n}\n"]}
@@ -9,19 +9,21 @@ let AppBinding = class AppBinding extends user_js_1.User {
9
9
  };
10
10
  exports.AppBinding = AppBinding;
11
11
  tslib_1.__decorate([
12
- (0, type_graphql_1.Field)({ nullable: true }),
12
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The application to which the user is bound.' }),
13
13
  tslib_1.__metadata("design:type", application_js_1.Application)
14
14
  ], AppBinding.prototype, "application", void 0);
15
15
  tslib_1.__decorate([
16
- (0, type_graphql_1.Field)({ nullable: true }),
16
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The scope of access granted to the application.' }),
17
17
  tslib_1.__metadata("design:type", String)
18
18
  ], AppBinding.prototype, "scope", void 0);
19
19
  tslib_1.__decorate([
20
- (0, type_graphql_1.Field)({ nullable: true }),
20
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The refresh token for the application.' }),
21
21
  (0, type_graphql_1.Directive)('@privilege(category: "security", privilege: "query", domainOwnerGranted: true)'),
22
22
  tslib_1.__metadata("design:type", String)
23
23
  ], AppBinding.prototype, "refreshToken", void 0);
24
24
  exports.AppBinding = AppBinding = tslib_1.__decorate([
25
- (0, type_graphql_1.ObjectType)()
25
+ (0, type_graphql_1.ObjectType)({
26
+ description: 'Represents a user that is bound to a specific application, with an associated scope and refresh token.'
27
+ })
26
28
  ], AppBinding);
27
29
  //# sourceMappingURL=app-binding.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-binding.js","sourceRoot":"","sources":["../../../server/service/app-binding/app-binding.ts"],"names":[],"mappings":";;;;AAAA,+CAA2D;AAC3D,kEAA2D;AAC3D,6CAAsC;AAG/B,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,cAAI;CAUnC,CAAA;AAVY,gCAAU;AAErB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACb,4BAAW;+CAAA;AAGxB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCACb;AAIb;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzB,IAAA,wBAAS,EAAC,gFAAgF,CAAC;;gDACxE;qBATT,UAAU;IADtB,IAAA,yBAAU,GAAE;GACA,UAAU,CAUtB","sourcesContent":["import { ObjectType, Field, Directive } from 'type-graphql'\nimport { Application } from '../application/application.js'\nimport { User } from '../user/user.js'\n\n@ObjectType()\nexport class AppBinding extends User {\n @Field({ nullable: true })\n application: Application\n\n @Field({ nullable: true })\n scope: string\n\n @Field({ nullable: true })\n @Directive('@privilege(category: \"security\", privilege: \"query\", domainOwnerGranted: true)')\n refreshToken: string\n}\n"]}
1
+ {"version":3,"file":"app-binding.js","sourceRoot":"","sources":["../../../server/service/app-binding/app-binding.ts"],"names":[],"mappings":";;;;AAAA,+CAA2D;AAC3D,kEAA2D;AAC3D,6CAAsC;AAK/B,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,cAAI;CAUnC,CAAA;AAVY,gCAAU;AAErB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC;sCACzE,4BAAW;+CAAA;AAGxB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;;yCAC7E;AAIb;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;IAChF,IAAA,wBAAS,EAAC,gFAAgF,CAAC;;gDACxE;qBATT,UAAU;IAHtB,IAAA,yBAAU,EAAC;QACV,WAAW,EAAE,wGAAwG;KACtH,CAAC;GACW,UAAU,CAUtB","sourcesContent":["import { ObjectType, Field, Directive } from 'type-graphql'\nimport { Application } from '../application/application.js'\nimport { User } from '../user/user.js'\n\n@ObjectType({\n description: 'Represents a user that is bound to a specific application, with an associated scope and refresh token.'\n})\nexport class AppBinding extends User {\n @Field({ nullable: true, description: 'The application to which the user is bound.' })\n application: Application\n\n @Field({ nullable: true, description: 'The scope of access granted to the application.' })\n scope: string\n\n @Field({ nullable: true, description: 'The refresh token for the application.' })\n @Directive('@privilege(category: \"security\", privilege: \"query\", domainOwnerGranted: true)')\n refreshToken: string\n}\n"]}
@@ -10,63 +10,63 @@ const appliance_types_js_1 = require("./appliance-types.js");
10
10
  const crypto = require('crypto');
11
11
  let ApplianceMutation = class ApplianceMutation {
12
12
  async createAppliance(appliance, context) {
13
- return await (0, shell_1.getRepository)(appliance_js_1.Appliance).save(Object.assign({ domain: context.state.domain, creator: context.state.user, updater: context.state.user }, appliance));
13
+ const { domain, user, tx } = context.state;
14
+ const newAppliance = await (0, shell_1.getRepository)(appliance_js_1.Appliance, tx).save({
15
+ domain: domain,
16
+ creator: user,
17
+ updater: user,
18
+ ...appliance
19
+ });
20
+ await appliance_js_1.Appliance.ensureApplianceUser(newAppliance, user, tx);
21
+ return newAppliance;
14
22
  }
15
23
  async deleteAppliance(id, context) {
16
- const { domain } = context.state;
24
+ const { domain, tx } = context.state;
17
25
  // TODO 이 사용자가 이 도메인에 속한 사용자인지 확인해야함.
18
26
  // TODO 다른 도메인에도 포함되어있다면, domains-users 관게와 해당 도메인 관련 정보만 삭제해야 함.
19
- await (0, shell_1.getRepository)(user_js_1.User).delete({
27
+ await (0, shell_1.getRepository)(user_js_1.User, tx).delete({
20
28
  reference: id,
21
29
  userType: 'appliance'
22
30
  });
23
- await (0, shell_1.getRepository)(appliance_js_1.Appliance).delete({ domain: { id: domain.id }, id });
31
+ await (0, shell_1.getRepository)(appliance_js_1.Appliance, tx).delete({ domain: { id: domain.id }, id });
24
32
  return true;
25
33
  }
26
34
  async generateApplianceSecret(id, context) {
27
- const { domain, user } = context.state;
28
- const appliance = await (0, shell_1.getRepository)(appliance_js_1.Appliance).findOneBy({ domain: { id: domain.id }, id });
29
- const appuserEmail = `${crypto.randomUUID()}@${domain === null || domain === void 0 ? void 0 : domain.subdomain}`;
30
- let appuser = await (0, shell_1.getRepository)(user_js_1.User).findOne({
31
- where: {
32
- reference: id,
33
- userType: 'appliance'
34
- },
35
- relations: ['domains']
36
- });
37
- if (!appuser) {
38
- /* newly create appuser */
39
- appuser = await (0, shell_1.getRepository)(user_js_1.User).save({
40
- email: appuserEmail,
41
- name: appliance.name,
42
- userType: 'appliance',
43
- reference: id,
44
- status: user_js_1.UserStatus.ACTIVATED,
45
- domains: [domain],
46
- updater: user,
47
- creator: user
48
- });
49
- }
35
+ const { domain, user, tx } = context.state;
36
+ const appliance = await (0, shell_1.getRepository)(appliance_js_1.Appliance, tx).findOneBy({ domain: { id: domain.id }, id });
37
+ const appuser = await appliance_js_1.Appliance.ensureApplianceUser(appliance, user, tx);
50
38
  if (!appuser.domains.find(d => d.id === domain.id)) {
51
39
  context.throw(401, 'appliance is not allowed for this domain');
52
40
  }
53
41
  appuser.password = appliance_js_1.Appliance.generateAccessToken(domain, appuser, appliance);
54
42
  await (0, shell_1.getRepository)(user_js_1.User).save(appuser);
55
- return await (0, shell_1.getRepository)(appliance_js_1.Appliance).save(Object.assign(Object.assign({}, appliance), { accessToken: appuser.password, updater: user }));
43
+ return await (0, shell_1.getRepository)(appliance_js_1.Appliance, tx).save({
44
+ ...appliance,
45
+ accessToken: appuser.password,
46
+ updater: user
47
+ });
56
48
  }
57
49
  async updateAppliance(id, patch, context) {
58
- const { domain } = context.state;
59
- const applianceRepository = (0, shell_1.getRepository)(appliance_js_1.Appliance);
60
- const userRepository = (0, shell_1.getRepository)(user_js_1.User);
50
+ const { domain, user, tx } = context.state;
51
+ const applianceRepository = (0, shell_1.getRepository)(appliance_js_1.Appliance, tx);
52
+ const userRepository = (0, shell_1.getRepository)(user_js_1.User, tx);
61
53
  const appliance = await applianceRepository.findOne({ where: { domain: { id: domain.id }, id } });
62
- const user = await userRepository.findOne({ where: { reference: id, userType: 'appliance' } });
63
- userRepository.save(Object.assign(Object.assign({}, user), { name: (patch === null || patch === void 0 ? void 0 : patch.name) || user.name }));
64
- return await applianceRepository.save(Object.assign(Object.assign(Object.assign({}, appliance), patch), { updater: context.state.user }));
54
+ const appuser = await appliance_js_1.Appliance.ensureApplianceUser(appliance, user, tx);
55
+ await userRepository.save({
56
+ ...appuser,
57
+ name: patch?.name || user.name
58
+ });
59
+ return await applianceRepository.save({
60
+ ...appliance,
61
+ ...patch,
62
+ updater: user
63
+ });
65
64
  }
66
65
  };
67
66
  exports.ApplianceMutation = ApplianceMutation;
68
67
  tslib_1.__decorate([
69
68
  (0, type_graphql_1.Directive)('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)'),
69
+ (0, type_graphql_1.Directive)('@transaction'),
70
70
  (0, type_graphql_1.Mutation)(returns => appliance_js_1.Appliance, { description: 'To create new appliance' }),
71
71
  tslib_1.__param(0, (0, type_graphql_1.Arg)('appliance')),
72
72
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -76,6 +76,7 @@ tslib_1.__decorate([
76
76
  ], ApplianceMutation.prototype, "createAppliance", null);
77
77
  tslib_1.__decorate([
78
78
  (0, type_graphql_1.Directive)('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)'),
79
+ (0, type_graphql_1.Directive)('@transaction'),
79
80
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To delete appliance' }),
80
81
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
81
82
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -85,6 +86,7 @@ tslib_1.__decorate([
85
86
  ], ApplianceMutation.prototype, "deleteAppliance", null);
86
87
  tslib_1.__decorate([
87
88
  (0, type_graphql_1.Directive)('@privilege(category: "security", privilege: "mutation", domainOwnerGranted: true)'),
89
+ (0, type_graphql_1.Directive)('@transaction'),
88
90
  (0, type_graphql_1.Mutation)(returns => appliance_js_1.Appliance),
89
91
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
90
92
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -94,6 +96,7 @@ tslib_1.__decorate([
94
96
  ], ApplianceMutation.prototype, "generateApplianceSecret", null);
95
97
  tslib_1.__decorate([
96
98
  (0, type_graphql_1.Directive)('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)'),
99
+ (0, type_graphql_1.Directive)('@transaction'),
97
100
  (0, type_graphql_1.Mutation)(returns => appliance_js_1.Appliance),
98
101
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
99
102
  tslib_1.__param(1, (0, type_graphql_1.Arg)('patch')),
@@ -1 +1 @@
1
- {"version":3,"file":"appliance-mutation.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Directive, Arg, Ctx, Mutation, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { User, UserStatus } from '../user/user.js'\nimport { Appliance } from './appliance.js'\nimport { AppliancePatch, NewAppliance } from './appliance-types.js'\n\nconst crypto = require('crypto')\n\n@Resolver(Appliance)\nexport class ApplianceMutation {\n @Directive('@privilege(category: \"user\", privilege: \"mutation\", domainOwnerGranted: true)')\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 @Directive('@privilege(category: \"user\", privilege: \"mutation\", domainOwnerGranted: true)')\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 @Directive('@privilege(category: \"security\", privilege: \"mutation\", domainOwnerGranted: true)')\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 @Directive('@privilege(category: \"user\", privilege: \"mutation\", domainOwnerGranted: true)')\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"]}
1
+ {"version":3,"file":"appliance-mutation.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Directive, Arg, Ctx, Mutation, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { User, UserStatus } from '../user/user.js'\nimport { Appliance } from './appliance.js'\nimport { AppliancePatch, NewAppliance } from './appliance-types.js'\n\nconst crypto = require('crypto')\n\n@Resolver(Appliance)\nexport class ApplianceMutation {\n @Directive('@privilege(category: \"user\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\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 const { domain, user, tx } = context.state\n\n const newAppliance = await getRepository(Appliance, tx).save({\n domain: domain,\n creator: user,\n updater: user,\n ...appliance\n })\n\n await Appliance.ensureApplianceUser(newAppliance, user, tx)\n\n return newAppliance\n }\n\n @Directive('@privilege(category: \"user\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete appliance' })\n async deleteAppliance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Boolean> {\n const { domain, tx } = context.state\n // TODO 이 사용자가 이 도메인에 속한 사용자인지 확인해야함.\n // TODO 다른 도메인에도 포함되어있다면, domains-users 관게와 해당 도메인 관련 정보만 삭제해야 함.\n await getRepository(User, tx).delete({\n reference: id,\n userType: 'appliance'\n })\n\n await getRepository(Appliance, tx).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@privilege(category: \"security\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => Appliance)\n async generateApplianceSecret(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Appliance> {\n const { domain, user, tx } = context.state\n\n const appliance: Appliance = await getRepository(Appliance, tx).findOneBy({ domain: { id: domain.id }, id })\n const appuser = await Appliance.ensureApplianceUser(appliance, user, tx)\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, tx).save({\n ...appliance,\n accessToken: appuser.password,\n updater: user\n })\n }\n\n @Directive('@privilege(category: \"user\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\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, user, tx } = context.state\n\n const applianceRepository = getRepository(Appliance, tx)\n const userRepository = getRepository(User, tx)\n\n const appliance = await applianceRepository.findOne({ where: { domain: { id: domain.id }, id } })\n const appuser = await Appliance.ensureApplianceUser(appliance, user, tx)\n\n await userRepository.save({\n ...appuser,\n name: patch?.name || user.name\n })\n\n return await applianceRepository.save({\n ...appliance,\n ...patch,\n updater: user\n })\n }\n}\n"]}
@@ -8,78 +8,78 @@ let ApplianceList = class ApplianceList {
8
8
  };
9
9
  exports.ApplianceList = ApplianceList;
10
10
  tslib_1.__decorate([
11
- (0, type_graphql_1.Field)(type => [appliance_js_1.Appliance], { nullable: true }),
11
+ (0, type_graphql_1.Field)(type => [appliance_js_1.Appliance], { nullable: true, description: 'The list of appliance items.' }),
12
12
  tslib_1.__metadata("design:type", Array)
13
13
  ], ApplianceList.prototype, "items", void 0);
14
14
  tslib_1.__decorate([
15
- (0, type_graphql_1.Field)(type => type_graphql_1.Int, { nullable: true }),
15
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int, { nullable: true, description: 'The total number of appliances.' }),
16
16
  tslib_1.__metadata("design:type", Number)
17
17
  ], ApplianceList.prototype, "total", void 0);
18
18
  exports.ApplianceList = ApplianceList = tslib_1.__decorate([
19
- (0, type_graphql_1.ObjectType)()
19
+ (0, type_graphql_1.ObjectType)({ description: 'A paginated list of appliances.' })
20
20
  ], ApplianceList);
21
21
  let AppliancePatch = class AppliancePatch {
22
22
  };
23
23
  exports.AppliancePatch = AppliancePatch;
24
24
  tslib_1.__decorate([
25
- (0, type_graphql_1.Field)(type => type_graphql_1.ID, { nullable: true }),
25
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID, { nullable: true, description: 'The unique identifier of the appliance to update.' }),
26
26
  tslib_1.__metadata("design:type", String)
27
27
  ], AppliancePatch.prototype, "id", void 0);
28
28
  tslib_1.__decorate([
29
- (0, type_graphql_1.Field)({ nullable: true }),
29
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The new serial number for the appliance.' }),
30
30
  tslib_1.__metadata("design:type", String)
31
31
  ], AppliancePatch.prototype, "serialNo", void 0);
32
32
  tslib_1.__decorate([
33
- (0, type_graphql_1.Field)({ nullable: true }),
33
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The new name for the appliance.' }),
34
34
  tslib_1.__metadata("design:type", String)
35
35
  ], AppliancePatch.prototype, "name", void 0);
36
36
  tslib_1.__decorate([
37
- (0, type_graphql_1.Field)({ nullable: true }),
37
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The new brand for the appliance.' }),
38
38
  tslib_1.__metadata("design:type", String)
39
39
  ], AppliancePatch.prototype, "brand", void 0);
40
40
  tslib_1.__decorate([
41
- (0, type_graphql_1.Field)({ nullable: true }),
41
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The new model for the appliance.' }),
42
42
  tslib_1.__metadata("design:type", String)
43
43
  ], AppliancePatch.prototype, "model", void 0);
44
44
  tslib_1.__decorate([
45
- (0, type_graphql_1.Field)({ nullable: true }),
45
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The new description for the appliance.' }),
46
46
  tslib_1.__metadata("design:type", String)
47
47
  ], AppliancePatch.prototype, "description", void 0);
48
48
  tslib_1.__decorate([
49
- (0, type_graphql_1.Field)({ nullable: true }),
49
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The new network mask for the appliance.' }),
50
50
  tslib_1.__metadata("design:type", String)
51
51
  ], AppliancePatch.prototype, "netmask", void 0);
52
52
  exports.AppliancePatch = AppliancePatch = tslib_1.__decorate([
53
- (0, type_graphql_1.InputType)()
53
+ (0, type_graphql_1.InputType)({ description: 'Input for updating (patching) an existing appliance.' })
54
54
  ], AppliancePatch);
55
55
  let NewAppliance = class NewAppliance {
56
56
  };
57
57
  exports.NewAppliance = NewAppliance;
58
58
  tslib_1.__decorate([
59
- (0, type_graphql_1.Field)(),
59
+ (0, type_graphql_1.Field)({ description: 'The serial number of the new appliance.' }),
60
60
  tslib_1.__metadata("design:type", String)
61
61
  ], NewAppliance.prototype, "serialNo", void 0);
62
62
  tslib_1.__decorate([
63
- (0, type_graphql_1.Field)(),
63
+ (0, type_graphql_1.Field)({ description: 'The name of the new appliance.' }),
64
64
  tslib_1.__metadata("design:type", String)
65
65
  ], NewAppliance.prototype, "name", void 0);
66
66
  tslib_1.__decorate([
67
- (0, type_graphql_1.Field)(),
67
+ (0, type_graphql_1.Field)({ description: 'The brand of the new appliance.' }),
68
68
  tslib_1.__metadata("design:type", String)
69
69
  ], NewAppliance.prototype, "brand", void 0);
70
70
  tslib_1.__decorate([
71
- (0, type_graphql_1.Field)(),
71
+ (0, type_graphql_1.Field)({ description: 'The model of the new appliance.' }),
72
72
  tslib_1.__metadata("design:type", String)
73
73
  ], NewAppliance.prototype, "model", void 0);
74
74
  tslib_1.__decorate([
75
- (0, type_graphql_1.Field)({ nullable: true }),
75
+ (0, type_graphql_1.Field)({ nullable: true, description: 'A description for the new appliance.' }),
76
76
  tslib_1.__metadata("design:type", String)
77
77
  ], NewAppliance.prototype, "description", void 0);
78
78
  tslib_1.__decorate([
79
- (0, type_graphql_1.Field)({ nullable: true }),
79
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The network mask for the new appliance.' }),
80
80
  tslib_1.__metadata("design:type", String)
81
81
  ], NewAppliance.prototype, "netmask", void 0);
82
82
  exports.NewAppliance = NewAppliance = tslib_1.__decorate([
83
- (0, type_graphql_1.InputType)()
83
+ (0, type_graphql_1.InputType)({ description: 'Input for creating a new appliance.' })
84
84
  ], NewAppliance);
85
85
  //# sourceMappingURL=appliance-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appliance-types.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance-types.ts"],"names":[],"mappings":";;;;AAAA,+CAAoE;AACpE,iDAA0C;AAGnC,IAAM,aAAa,GAAnB,MAAM,aAAa;CAMzB,CAAA;AANY,sCAAa;AAExB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,wBAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CAC5B;AAGnB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACzB;wBALH,aAAa;IADzB,IAAA,yBAAU,GAAE;GACA,aAAa,CAMzB;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;CAqB1B,CAAA;AArBY,wCAAc;AAEzB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CAC3B;AAGX;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;gDACT;AAGjB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACb;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACZ;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACZ;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACN;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACV;yBApBL,cAAc;IAD1B,IAAA,wBAAS,GAAE;GACC,cAAc,CAqB1B;AAGM,IAAM,YAAY,GAAlB,MAAM,YAAY;CAkBxB,CAAA;AAlBY,oCAAY;AAEvB;IADC,IAAA,oBAAK,GAAE;;8CACQ;AAGhB;IADC,IAAA,oBAAK,GAAE;;0CACI;AAGZ;IADC,IAAA,oBAAK,GAAE;;2CACK;AAGb;IADC,IAAA,oBAAK,GAAE;;2CACK;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDACN;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACV;uBAjBL,YAAY;IADxB,IAAA,wBAAS,GAAE;GACC,YAAY,CAkBxB","sourcesContent":["import { ObjectType, InputType, Field, ID, Int } from 'type-graphql'\nimport { Appliance } from './appliance.js'\n\n@ObjectType()\nexport class ApplianceList {\n @Field(type => [Appliance], { nullable: true })\n items?: Appliance[]\n\n @Field(type => Int, { nullable: true })\n total?: number\n}\n\n@InputType()\nexport class AppliancePatch {\n @Field(type => ID, { nullable: true })\n id?: string\n\n @Field({ nullable: true })\n serialNo?: string\n\n @Field({ nullable: true })\n name?: string\n\n @Field({ nullable: true })\n brand?: string\n\n @Field({ nullable: true })\n model?: string\n\n @Field({ nullable: true })\n description?: string\n\n @Field({ nullable: true })\n netmask?: string\n}\n\n@InputType()\nexport class NewAppliance {\n @Field()\n serialNo: string\n\n @Field()\n name: string\n\n @Field()\n brand: string\n\n @Field()\n model: string\n\n @Field({ nullable: true })\n description?: string\n\n @Field({ nullable: true })\n netmask?: string\n}\n"]}
1
+ {"version":3,"file":"appliance-types.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance-types.ts"],"names":[],"mappings":";;;;AAAA,+CAAoE;AACpE,iDAA0C;AAGnC,IAAM,aAAa,GAAnB,MAAM,aAAa;CAMzB,CAAA;AANY,sCAAa;AAExB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,wBAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;;4CACzE;AAGnB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;;4CACzE;wBALH,aAAa;IADzB,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;GAClD,aAAa,CAMzB;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;CAqB1B,CAAA;AArBY,wCAAc;AAEzB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;;0CAC7F;AAGX;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;;gDAClE;AAGjB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;;4CAC7D;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;;6CAC7D;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;;6CAC7D;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;;mDAC7D;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;;+CAClE;yBApBL,cAAc;IAD1B,IAAA,wBAAS,EAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC;GACtE,cAAc,CAqB1B;AAGM,IAAM,YAAY,GAAlB,MAAM,YAAY;CAkBxB,CAAA;AAlBY,oCAAY;AAEvB;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;;8CAClD;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;;0CAC7C;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;;2CAC7C;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;;2CAC7C;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;;iDAC3D;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;;6CAClE;uBAjBL,YAAY;IADxB,IAAA,wBAAS,EAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;GACrD,YAAY,CAkBxB","sourcesContent":["import { ObjectType, InputType, Field, ID, Int } from 'type-graphql'\nimport { Appliance } from './appliance.js'\n\n@ObjectType({ description: 'A paginated list of appliances.' })\nexport class ApplianceList {\n @Field(type => [Appliance], { nullable: true, description: 'The list of appliance items.' })\n items?: Appliance[]\n\n @Field(type => Int, { nullable: true, description: 'The total number of appliances.' })\n total?: number\n}\n\n@InputType({ description: 'Input for updating (patching) an existing appliance.' })\nexport class AppliancePatch {\n @Field(type => ID, { nullable: true, description: 'The unique identifier of the appliance to update.' })\n id?: string\n\n @Field({ nullable: true, description: 'The new serial number for the appliance.' })\n serialNo?: string\n\n @Field({ nullable: true, description: 'The new name for the appliance.' })\n name?: string\n\n @Field({ nullable: true, description: 'The new brand for the appliance.' })\n brand?: string\n\n @Field({ nullable: true, description: 'The new model for the appliance.' })\n model?: string\n\n @Field({ nullable: true, description: 'The new description for the appliance.' })\n description?: string\n\n @Field({ nullable: true, description: 'The new network mask for the appliance.' })\n netmask?: string\n}\n\n@InputType({ description: 'Input for creating a new appliance.' })\nexport class NewAppliance {\n @Field({ description: 'The serial number of the new appliance.' })\n serialNo: string\n\n @Field({ description: 'The name of the new appliance.' })\n name: string\n\n @Field({ description: 'The brand of the new appliance.' })\n brand: string\n\n @Field({ description: 'The model of the new appliance.' })\n model: string\n\n @Field({ nullable: true, description: 'A description for the new appliance.' })\n description?: string\n\n @Field({ nullable: true, description: 'The network mask for the new appliance.' })\n netmask?: string\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { EntityManager } from 'typeorm';
1
2
  import { Domain } from '@things-factory/shell';
2
3
  import { User } from '../user/user.js';
3
4
  export declare class Appliance {
@@ -19,4 +20,5 @@ export declare class Appliance {
19
20
  updatedAt: Date;
20
21
  static sign(subject: any, expiresIn: any, domain: any, user: any, appliance: any): string;
21
22
  static generateAccessToken(domain: any, user: any, appliance: any): string;
23
+ static ensureApplianceUser(appliance: Appliance, user: User, tx: EntityManager): Promise<User>;
22
24
  }
@@ -36,16 +36,63 @@ let Appliance = class Appliance {
36
36
  let expiresIn = env_1.config.get('applianceJwtExpiresIn', '1y');
37
37
  return this.sign('access-token', expiresIn, domain, user, appliance);
38
38
  }
39
+ static async ensureApplianceUser(appliance, user, tx) {
40
+ const { id, domain } = appliance;
41
+ const userRepository = (0, shell_1.getRepository)(user_js_1.User, tx);
42
+ let appuser = await userRepository.findOne({
43
+ where: {
44
+ reference: id,
45
+ userType: 'appliance'
46
+ },
47
+ relations: ['domains']
48
+ });
49
+ if (!appuser) {
50
+ const username = appuser?.username || `${appliance.id}@${domain?.subdomain}.z`;
51
+ appuser = await userRepository.save({
52
+ username,
53
+ email: username,
54
+ name: appliance.name,
55
+ userType: 'appliance',
56
+ reference: id,
57
+ status: user_js_1.UserStatus.ACTIVATED,
58
+ domains: [domain],
59
+ updater: user,
60
+ creator: appuser?.creator || user
61
+ });
62
+ return await userRepository.findOne({
63
+ where: {
64
+ id: appuser.id
65
+ },
66
+ relations: ['domains']
67
+ });
68
+ }
69
+ else if (!appuser.username) {
70
+ /* username을 사용하지 않았던 하위버전에서 생성된 데이타를 자동으로 수정하기 위한 로직임. */
71
+ const username = appuser.email || `${appliance.id}@${domain?.subdomain}.z`;
72
+ appuser = await userRepository.save({
73
+ ...appuser,
74
+ username: appuser.username || username,
75
+ updater: user
76
+ });
77
+ return await userRepository.findOne({
78
+ where: {
79
+ id: appuser.id
80
+ },
81
+ relations: ['domains']
82
+ });
83
+ }
84
+ return appuser;
85
+ }
39
86
  };
40
87
  exports.Appliance = Appliance;
41
88
  tslib_1.__decorate([
42
89
  (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
43
- (0, type_graphql_1.Field)(type => type_graphql_1.ID),
90
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID, { description: 'Unique identifier for the appliance.' }),
44
91
  tslib_1.__metadata("design:type", String)
45
92
  ], Appliance.prototype, "id", void 0);
46
93
  tslib_1.__decorate([
47
94
  (0, typeorm_1.ManyToOne)(type => shell_1.Domain),
48
- (0, type_graphql_1.Field)(type => shell_1.Domain),
95
+ (0, type_graphql_1.Field)(type => shell_1.Domain, { description: 'The domain to which the appliance belongs.' }),
49
96
  tslib_1.__metadata("design:type", shell_1.Domain)
50
97
  ], Appliance.prototype, "domain", void 0);
51
98
  tslib_1.__decorate([
@@ -56,36 +103,36 @@ tslib_1.__decorate([
56
103
  (0, typeorm_1.Column)({
57
104
  nullable: true
58
105
  }),
59
- (0, type_graphql_1.Field)({ nullable: true }),
106
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The serial number of the appliance.' }),
60
107
  tslib_1.__metadata("design:type", String)
61
108
  ], Appliance.prototype, "serialNo", void 0);
62
109
  tslib_1.__decorate([
63
110
  (0, typeorm_1.Column)(),
64
- (0, type_graphql_1.Field)(),
111
+ (0, type_graphql_1.Field)({ description: 'The name of the appliance.' }),
65
112
  tslib_1.__metadata("design:type", String)
66
113
  ], Appliance.prototype, "name", void 0);
67
114
  tslib_1.__decorate([
68
115
  (0, typeorm_1.Column)(),
69
- (0, type_graphql_1.Field)({ nullable: true }),
116
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The brand or manufacturer of the appliance.' }),
70
117
  tslib_1.__metadata("design:type", String)
71
118
  ], Appliance.prototype, "brand", void 0);
72
119
  tslib_1.__decorate([
73
120
  (0, typeorm_1.Column)(),
74
- (0, type_graphql_1.Field)({ nullable: true }),
121
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The model of the appliance.' }),
75
122
  tslib_1.__metadata("design:type", String)
76
123
  ], Appliance.prototype, "model", void 0);
77
124
  tslib_1.__decorate([
78
125
  (0, typeorm_1.Column)({
79
126
  nullable: true
80
127
  }),
81
- (0, type_graphql_1.Field)({ nullable: true }),
128
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The network mask of the appliance.' }),
82
129
  tslib_1.__metadata("design:type", String)
83
130
  ], Appliance.prototype, "netmask", void 0);
84
131
  tslib_1.__decorate([
85
132
  (0, typeorm_1.Column)({
86
133
  nullable: true
87
134
  }),
88
- (0, type_graphql_1.Field)({ nullable: true }),
135
+ (0, type_graphql_1.Field)({ nullable: true, description: 'A description of the appliance.' }),
89
136
  tslib_1.__metadata("design:type", String)
90
137
  ], Appliance.prototype, "description", void 0);
91
138
  tslib_1.__decorate([
@@ -100,13 +147,13 @@ tslib_1.__decorate([
100
147
  : 'varchar',
101
148
  length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined
102
149
  }),
103
- (0, type_graphql_1.Field)({ nullable: true }),
150
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The access token for the appliance.' }),
104
151
  (0, type_graphql_1.Directive)('@privilege(category: "security", privilege: "query", domainOwnerGranted: true)'),
105
152
  tslib_1.__metadata("design:type", String)
106
153
  ], Appliance.prototype, "accessToken", void 0);
107
154
  tslib_1.__decorate([
108
155
  (0, typeorm_1.ManyToOne)(type => user_js_1.User, { nullable: true }),
109
- (0, type_graphql_1.Field)({ nullable: true }),
156
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The user who created the appliance.' }),
110
157
  tslib_1.__metadata("design:type", user_js_1.User)
111
158
  ], Appliance.prototype, "creator", void 0);
112
159
  tslib_1.__decorate([
@@ -115,7 +162,7 @@ tslib_1.__decorate([
115
162
  ], Appliance.prototype, "creatorId", void 0);
116
163
  tslib_1.__decorate([
117
164
  (0, typeorm_1.ManyToOne)(type => user_js_1.User, { nullable: true }),
118
- (0, type_graphql_1.Field)({ nullable: true }),
165
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The user who last updated the appliance.' }),
119
166
  tslib_1.__metadata("design:type", user_js_1.User)
120
167
  ], Appliance.prototype, "updater", void 0);
121
168
  tslib_1.__decorate([
@@ -124,12 +171,12 @@ tslib_1.__decorate([
124
171
  ], Appliance.prototype, "updaterId", void 0);
125
172
  tslib_1.__decorate([
126
173
  (0, typeorm_1.CreateDateColumn)(),
127
- (0, type_graphql_1.Field)({ nullable: true }),
174
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The timestamp when the appliance was created.' }),
128
175
  tslib_1.__metadata("design:type", Date)
129
176
  ], Appliance.prototype, "createdAt", void 0);
130
177
  tslib_1.__decorate([
131
178
  (0, typeorm_1.UpdateDateColumn)(),
132
- (0, type_graphql_1.Field)({ nullable: true }),
179
+ (0, type_graphql_1.Field)({ nullable: true, description: 'The timestamp when the appliance was last updated.' }),
133
180
  tslib_1.__metadata("design:type", Date
134
181
  /* signing for jsonwebtoken */
135
182
  )
@@ -139,6 +186,6 @@ exports.Appliance = Appliance = tslib_1.__decorate([
139
186
  (0, typeorm_1.Index)('ix_appliance_0', (appliance) => [appliance.domain, appliance.name], {
140
187
  unique: true
141
188
  }),
142
- (0, type_graphql_1.ObjectType)()
189
+ (0, type_graphql_1.ObjectType)({ description: 'Represents a physical or virtual appliance that can be managed by the system.' })
143
190
  ], Appliance);
144
191
  //# sourceMappingURL=appliance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appliance.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Directive, Field, ID, ObjectType } from 'type-graphql'\nimport { Domain } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\n\nimport { User, UserStatus } from '../user/user.js'\nimport { SECRET } from '../../utils/get-secret.js'\nimport jwt from 'jsonwebtoken'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Entity()\n@Index('ix_appliance_0', (appliance: Appliance) => [appliance.domain, appliance.name], {\n unique: true\n})\n@ObjectType()\nexport class Appliance {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((appliance: Appliance) => appliance.domain)\n domainId: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true })\n serialNo: string\n\n @Column()\n @Field()\n name: string\n\n @Column()\n @Field({ nullable: true })\n brand: string\n\n @Column()\n @Field({ nullable: true })\n model: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true })\n netmask: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true })\n description: string\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({ nullable: true })\n @Directive('@privilege(category: \"security\", privilege: \"query\", domainOwnerGranted: true)')\n accessToken: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field({ nullable: true })\n creator: User\n\n @RelationId((appliance: Appliance) => appliance.creator)\n creatorId: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field({ nullable: true })\n updater: User\n\n @RelationId((appliance: Appliance) => appliance.updater)\n updaterId: string\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt: Date\n\n /* signing for jsonwebtoken */\n static sign(subject, expiresIn, domain, user, appliance) {\n var credential = {\n id: user.id,\n userType: 'appliance',\n appliance: {\n id: appliance.id\n },\n status: UserStatus.ACTIVATED,\n domain: {\n subdomain: domain.subdomain\n }\n }\n\n return jwt.sign(credential, SECRET, {\n expiresIn,\n issuer: 'hatiolab.com',\n subject\n })\n }\n\n static generateAccessToken(domain, user, appliance) {\n /* how to set expiresIn https://github.com/vercel/ms */\n let expiresIn = config.get('applianceJwtExpiresIn', '1y')\n return this.sign('access-token', expiresIn, domain, user, appliance)\n }\n}\n"]}
1
+ {"version":3,"file":"appliance.js","sourceRoot":"","sources":["../../../server/service/appliance/appliance.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n EntityManager,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Directive, Field, ID, ObjectType } from 'type-graphql'\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\n\nimport { User, UserStatus } from '../user/user.js'\nimport { SECRET } from '../../utils/get-secret.js'\nimport jwt from 'jsonwebtoken'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Entity()\n@Index('ix_appliance_0', (appliance: Appliance) => [appliance.domain, appliance.name], {\n unique: true\n})\n@ObjectType({ description: 'Represents a physical or virtual appliance that can be managed by the system.' })\nexport class Appliance {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier for the appliance.' })\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { description: 'The domain to which the appliance belongs.' })\n domain?: Domain\n\n @RelationId((appliance: Appliance) => appliance.domain)\n domainId: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true, description: 'The serial number of the appliance.' })\n serialNo: string\n\n @Column()\n @Field({ description: 'The name of the appliance.' })\n name: string\n\n @Column()\n @Field({ nullable: true, description: 'The brand or manufacturer of the appliance.' })\n brand: string\n\n @Column()\n @Field({ nullable: true, description: 'The model of the appliance.' })\n model: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true, description: 'The network mask of the appliance.' })\n netmask: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true, description: 'A description of the appliance.' })\n description: string\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({ nullable: true, description: 'The access token for the appliance.' })\n @Directive('@privilege(category: \"security\", privilege: \"query\", domainOwnerGranted: true)')\n accessToken: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field({ nullable: true, description: 'The user who created the appliance.' })\n creator: User\n\n @RelationId((appliance: Appliance) => appliance.creator)\n creatorId: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field({ nullable: true, description: 'The user who last updated the appliance.' })\n updater: User\n\n @RelationId((appliance: Appliance) => appliance.updater)\n updaterId: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'The timestamp when the appliance was created.' })\n createdAt: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'The timestamp when the appliance was last updated.' })\n updatedAt: Date\n\n /* signing for jsonwebtoken */\n static sign(subject, expiresIn, domain, user, appliance) {\n var credential = {\n id: user.id,\n userType: 'appliance',\n appliance: {\n id: appliance.id\n },\n status: UserStatus.ACTIVATED,\n domain: {\n subdomain: domain.subdomain\n }\n }\n\n return jwt.sign(credential, SECRET, {\n expiresIn,\n issuer: 'hatiolab.com',\n subject\n })\n }\n\n static generateAccessToken(domain, user, appliance) {\n /* how to set expiresIn https://github.com/vercel/ms */\n let expiresIn = config.get('applianceJwtExpiresIn', '1y')\n return this.sign('access-token', expiresIn, domain, user, appliance)\n }\n\n static async ensureApplianceUser(appliance: Appliance, user: User, tx: EntityManager) {\n const { id, domain } = appliance\n const userRepository = getRepository(User, tx)\n\n let appuser: User = await userRepository.findOne({\n where: {\n reference: id,\n userType: 'appliance'\n },\n relations: ['domains']\n })\n\n if (!appuser) {\n const username = appuser?.username || `${appliance.id}@${domain?.subdomain}.z`\n\n appuser = await userRepository.save({\n username,\n email: username,\n name: appliance.name,\n userType: 'appliance',\n reference: id,\n status: UserStatus.ACTIVATED,\n domains: [domain],\n updater: user,\n creator: appuser?.creator || user\n })\n\n return await userRepository.findOne({\n where: {\n id: appuser.id\n },\n relations: ['domains']\n })\n } else if (!appuser.username) {\n /* username을 사용하지 않았던 하위버전에서 생성된 데이타를 자동으로 수정하기 위한 로직임. */\n const username = appuser.email || `${appliance.id}@${domain?.subdomain}.z`\n\n appuser = await userRepository.save({\n ...appuser,\n username: appuser.username || username,\n updater: user\n })\n\n return await userRepository.findOne({\n where: {\n id: appuser.id\n },\n relations: ['domains']\n })\n }\n\n return appuser\n }\n}\n"]}
@@ -10,7 +10,14 @@ const application_types_js_1 = require("./application-types.js");
10
10
  let ApplicationMutation = class ApplicationMutation {
11
11
  async createApplication(application, context) {
12
12
  const { domain } = context.state;
13
- return await (0, shell_1.getRepository)(application_js_1.Application).save(Object.assign(Object.assign({}, application), { domain, appKey: application_js_1.Application.generateAppKey(), appSecret: application_js_1.Application.generateAppSecret(), creator: context.state.user, updater: context.state.user }));
13
+ return await (0, shell_1.getRepository)(application_js_1.Application).save({
14
+ ...application,
15
+ domain,
16
+ appKey: application_js_1.Application.generateAppKey(),
17
+ appSecret: application_js_1.Application.generateAppSecret(),
18
+ creator: context.state.user,
19
+ updater: context.state.user
20
+ });
14
21
  }
15
22
  async deleteApplication(id, context) {
16
23
  const { domain } = context.state;
@@ -24,7 +31,11 @@ let ApplicationMutation = class ApplicationMutation {
24
31
  const { domain } = context.state;
25
32
  const repository = (0, shell_1.getRepository)(application_js_1.Application);
26
33
  const application = await repository.findOneBy({ domain: { id: domain.id }, id });
27
- return await repository.save(Object.assign(Object.assign({}, application), { appSecret: application_js_1.Application.generateAppSecret(), updater: context.state.user }));
34
+ return await repository.save({
35
+ ...application,
36
+ appSecret: application_js_1.Application.generateAppSecret(),
37
+ updater: context.state.user
38
+ });
28
39
  }
29
40
  async renewApplicationAccessToken(id, context, scope) {
30
41
  const { domain } = context.state;
@@ -42,7 +53,10 @@ let ApplicationMutation = class ApplicationMutation {
42
53
  }
43
54
  var accessToken = application_js_1.Application.generateAccessToken(domain, appuser, application.appSecret, scope || '');
44
55
  var refreshToken = application_js_1.Application.generateRefreshToken(domain, appuser, application.appSecret, scope || '');
45
- await (0, shell_1.getRepository)(user_js_1.User).save(Object.assign(Object.assign({}, appuser), { password: refreshToken }));
56
+ await (0, shell_1.getRepository)(user_js_1.User).save({
57
+ ...appuser,
58
+ password: refreshToken
59
+ });
46
60
  return {
47
61
  accessToken,
48
62
  refreshToken
@@ -51,7 +65,11 @@ let ApplicationMutation = class ApplicationMutation {
51
65
  async updateApplication(id, patch, context) {
52
66
  const repository = (0, shell_1.getRepository)(application_js_1.Application);
53
67
  const application = await repository.findOneBy({ id });
54
- return await repository.save(Object.assign(Object.assign(Object.assign({}, application), patch), { updater: context.state.user }));
68
+ return await repository.save({
69
+ ...application,
70
+ ...patch,
71
+ updater: context.state.user
72
+ });
55
73
  }
56
74
  };
57
75
  exports.ApplicationMutation = ApplicationMutation;