digitaltwin-core 0.14.0 → 0.14.1

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 (169) hide show
  1. package/package.json +101 -106
  2. package/dist/auth/apisix_parser.d.ts +0 -146
  3. package/dist/auth/apisix_parser.d.ts.map +0 -1
  4. package/dist/auth/apisix_parser.js +0 -185
  5. package/dist/auth/apisix_parser.js.map +0 -1
  6. package/dist/auth/auth_config.d.ts +0 -126
  7. package/dist/auth/auth_config.d.ts.map +0 -1
  8. package/dist/auth/auth_config.js +0 -169
  9. package/dist/auth/auth_config.js.map +0 -1
  10. package/dist/auth/index.d.ts +0 -5
  11. package/dist/auth/index.d.ts.map +0 -1
  12. package/dist/auth/index.js +0 -4
  13. package/dist/auth/index.js.map +0 -1
  14. package/dist/auth/types.d.ts +0 -100
  15. package/dist/auth/types.d.ts.map +0 -1
  16. package/dist/auth/types.js +0 -2
  17. package/dist/auth/types.js.map +0 -1
  18. package/dist/auth/user_service.d.ts +0 -86
  19. package/dist/auth/user_service.d.ts.map +0 -1
  20. package/dist/auth/user_service.js +0 -237
  21. package/dist/auth/user_service.js.map +0 -1
  22. package/dist/components/assets_manager.d.ts +0 -662
  23. package/dist/components/assets_manager.d.ts.map +0 -1
  24. package/dist/components/assets_manager.js +0 -1529
  25. package/dist/components/assets_manager.js.map +0 -1
  26. package/dist/components/async_upload.d.ts +0 -20
  27. package/dist/components/async_upload.d.ts.map +0 -1
  28. package/dist/components/async_upload.js +0 -10
  29. package/dist/components/async_upload.js.map +0 -1
  30. package/dist/components/collector.d.ts +0 -203
  31. package/dist/components/collector.d.ts.map +0 -1
  32. package/dist/components/collector.js +0 -202
  33. package/dist/components/collector.js.map +0 -1
  34. package/dist/components/custom_table_manager.d.ts +0 -503
  35. package/dist/components/custom_table_manager.d.ts.map +0 -1
  36. package/dist/components/custom_table_manager.js +0 -1052
  37. package/dist/components/custom_table_manager.js.map +0 -1
  38. package/dist/components/global_assets_handler.d.ts +0 -63
  39. package/dist/components/global_assets_handler.d.ts.map +0 -1
  40. package/dist/components/global_assets_handler.js +0 -127
  41. package/dist/components/global_assets_handler.js.map +0 -1
  42. package/dist/components/handler.d.ts +0 -104
  43. package/dist/components/handler.d.ts.map +0 -1
  44. package/dist/components/handler.js +0 -110
  45. package/dist/components/handler.js.map +0 -1
  46. package/dist/components/harvester.d.ts +0 -182
  47. package/dist/components/harvester.d.ts.map +0 -1
  48. package/dist/components/harvester.js +0 -393
  49. package/dist/components/harvester.js.map +0 -1
  50. package/dist/components/index.d.ts +0 -11
  51. package/dist/components/index.d.ts.map +0 -1
  52. package/dist/components/index.js +0 -9
  53. package/dist/components/index.js.map +0 -1
  54. package/dist/components/interfaces.d.ts +0 -126
  55. package/dist/components/interfaces.d.ts.map +0 -1
  56. package/dist/components/interfaces.js +0 -8
  57. package/dist/components/interfaces.js.map +0 -1
  58. package/dist/components/map_manager.d.ts +0 -61
  59. package/dist/components/map_manager.d.ts.map +0 -1
  60. package/dist/components/map_manager.js +0 -242
  61. package/dist/components/map_manager.js.map +0 -1
  62. package/dist/components/tileset_manager.d.ts +0 -125
  63. package/dist/components/tileset_manager.d.ts.map +0 -1
  64. package/dist/components/tileset_manager.js +0 -618
  65. package/dist/components/tileset_manager.js.map +0 -1
  66. package/dist/components/types.d.ts +0 -226
  67. package/dist/components/types.d.ts.map +0 -1
  68. package/dist/components/types.js +0 -8
  69. package/dist/components/types.js.map +0 -1
  70. package/dist/database/adapters/knex_database_adapter.d.ts +0 -92
  71. package/dist/database/adapters/knex_database_adapter.d.ts.map +0 -1
  72. package/dist/database/adapters/knex_database_adapter.js +0 -647
  73. package/dist/database/adapters/knex_database_adapter.js.map +0 -1
  74. package/dist/database/database_adapter.d.ts +0 -251
  75. package/dist/database/database_adapter.d.ts.map +0 -1
  76. package/dist/database/database_adapter.js +0 -46
  77. package/dist/database/database_adapter.js.map +0 -1
  78. package/dist/engine/digital_twin_engine.d.ts +0 -253
  79. package/dist/engine/digital_twin_engine.d.ts.map +0 -1
  80. package/dist/engine/digital_twin_engine.js +0 -790
  81. package/dist/engine/digital_twin_engine.js.map +0 -1
  82. package/dist/engine/endpoints.d.ts +0 -47
  83. package/dist/engine/endpoints.d.ts.map +0 -1
  84. package/dist/engine/endpoints.js +0 -56
  85. package/dist/engine/endpoints.js.map +0 -1
  86. package/dist/engine/events.d.ts +0 -93
  87. package/dist/engine/events.d.ts.map +0 -1
  88. package/dist/engine/events.js +0 -71
  89. package/dist/engine/events.js.map +0 -1
  90. package/dist/engine/initializer.d.ts +0 -62
  91. package/dist/engine/initializer.d.ts.map +0 -1
  92. package/dist/engine/initializer.js +0 -108
  93. package/dist/engine/initializer.js.map +0 -1
  94. package/dist/engine/queue_manager.d.ts +0 -87
  95. package/dist/engine/queue_manager.d.ts.map +0 -1
  96. package/dist/engine/queue_manager.js +0 -196
  97. package/dist/engine/queue_manager.js.map +0 -1
  98. package/dist/engine/scheduler.d.ts +0 -30
  99. package/dist/engine/scheduler.d.ts.map +0 -1
  100. package/dist/engine/scheduler.js +0 -370
  101. package/dist/engine/scheduler.js.map +0 -1
  102. package/dist/engine/upload_processor.d.ts +0 -36
  103. package/dist/engine/upload_processor.d.ts.map +0 -1
  104. package/dist/engine/upload_processor.js +0 -101
  105. package/dist/engine/upload_processor.js.map +0 -1
  106. package/dist/env/env.d.ts +0 -134
  107. package/dist/env/env.d.ts.map +0 -1
  108. package/dist/env/env.js +0 -177
  109. package/dist/env/env.js.map +0 -1
  110. package/dist/index.d.ts +0 -49
  111. package/dist/index.d.ts.map +0 -1
  112. package/dist/index.js +0 -57
  113. package/dist/index.js.map +0 -1
  114. package/dist/openapi/generator.d.ts +0 -93
  115. package/dist/openapi/generator.d.ts.map +0 -1
  116. package/dist/openapi/generator.js +0 -293
  117. package/dist/openapi/generator.js.map +0 -1
  118. package/dist/openapi/index.d.ts +0 -9
  119. package/dist/openapi/index.d.ts.map +0 -1
  120. package/dist/openapi/index.js +0 -9
  121. package/dist/openapi/index.js.map +0 -1
  122. package/dist/openapi/types.d.ts +0 -182
  123. package/dist/openapi/types.d.ts.map +0 -1
  124. package/dist/openapi/types.js +0 -16
  125. package/dist/openapi/types.js.map +0 -1
  126. package/dist/storage/adapters/local_storage_service.d.ts +0 -51
  127. package/dist/storage/adapters/local_storage_service.d.ts.map +0 -1
  128. package/dist/storage/adapters/local_storage_service.js +0 -110
  129. package/dist/storage/adapters/local_storage_service.js.map +0 -1
  130. package/dist/storage/adapters/ovh_storage_service.d.ts +0 -72
  131. package/dist/storage/adapters/ovh_storage_service.d.ts.map +0 -1
  132. package/dist/storage/adapters/ovh_storage_service.js +0 -206
  133. package/dist/storage/adapters/ovh_storage_service.js.map +0 -1
  134. package/dist/storage/storage_factory.d.ts +0 -14
  135. package/dist/storage/storage_factory.d.ts.map +0 -1
  136. package/dist/storage/storage_factory.js +0 -40
  137. package/dist/storage/storage_factory.js.map +0 -1
  138. package/dist/storage/storage_service.d.ts +0 -163
  139. package/dist/storage/storage_service.d.ts.map +0 -1
  140. package/dist/storage/storage_service.js +0 -54
  141. package/dist/storage/storage_service.js.map +0 -1
  142. package/dist/types/data_record.d.ts +0 -123
  143. package/dist/types/data_record.d.ts.map +0 -1
  144. package/dist/types/data_record.js +0 -8
  145. package/dist/types/data_record.js.map +0 -1
  146. package/dist/utils/http_responses.d.ts +0 -155
  147. package/dist/utils/http_responses.d.ts.map +0 -1
  148. package/dist/utils/http_responses.js +0 -190
  149. package/dist/utils/http_responses.js.map +0 -1
  150. package/dist/utils/index.d.ts +0 -8
  151. package/dist/utils/index.d.ts.map +0 -1
  152. package/dist/utils/index.js +0 -6
  153. package/dist/utils/index.js.map +0 -1
  154. package/dist/utils/logger.d.ts +0 -74
  155. package/dist/utils/logger.d.ts.map +0 -1
  156. package/dist/utils/logger.js +0 -92
  157. package/dist/utils/logger.js.map +0 -1
  158. package/dist/utils/map_to_data_record.d.ts +0 -10
  159. package/dist/utils/map_to_data_record.d.ts.map +0 -1
  160. package/dist/utils/map_to_data_record.js +0 -36
  161. package/dist/utils/map_to_data_record.js.map +0 -1
  162. package/dist/utils/servable_endpoint.d.ts +0 -63
  163. package/dist/utils/servable_endpoint.d.ts.map +0 -1
  164. package/dist/utils/servable_endpoint.js +0 -67
  165. package/dist/utils/servable_endpoint.js.map +0 -1
  166. package/dist/utils/zip_utils.d.ts +0 -66
  167. package/dist/utils/zip_utils.d.ts.map +0 -1
  168. package/dist/utils/zip_utils.js +0 -169
  169. package/dist/utils/zip_utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth_config.d.ts","sourceRoot":"","sources":["../../src/auth/auth_config.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,MAAM,CAAC,OAAO,CAIP;IAEf;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAqCzB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAQxB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,cAAc,IAAI,OAAO;IAIhC;;;;OAIG;IACH,MAAM,CAAC,aAAa,IAAI,OAAO;IAI/B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,kBAAkB,IAAI,MAAM;IAInC;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB;;;;IAOvB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,gBAAgB,IAAI,MAAM;IAIjC;;;;OAIG;IACH,MAAM,CAAC,YAAY;CAGtB"}
@@ -1,169 +0,0 @@
1
- import { Env } from '../env/env.js';
2
- /**
3
- * Authentication configuration for Digital Twin framework.
4
- *
5
- * Controls whether authentication is required for components that support it.
6
- * When authentication is disabled, all requests are treated as authenticated
7
- * with a default anonymous user.
8
- *
9
- * Environment variables:
10
- * - DIGITALTWIN_DISABLE_AUTH: Set to "true" or "1" to disable authentication (default: false)
11
- * - DIGITALTWIN_ANONYMOUS_USER_ID: User ID to use when auth is disabled (default: "anonymous")
12
- * - DIGITALTWIN_ADMIN_ROLE_NAME: Name of the admin role in Keycloak (default: "admin")
13
- *
14
- * @example
15
- * ```bash
16
- * # Disable authentication for development
17
- * export DIGITALTWIN_DISABLE_AUTH=true
18
- * export DIGITALTWIN_ANONYMOUS_USER_ID=dev-user-123
19
- *
20
- * # Configure admin role name
21
- * export DIGITALTWIN_ADMIN_ROLE_NAME=administrator
22
- *
23
- * # Enable authentication (default)
24
- * export DIGITALTWIN_DISABLE_AUTH=false
25
- * ```
26
- *
27
- * @example
28
- * ```typescript
29
- * import { AuthConfig } from './auth_config.js'
30
- *
31
- * if (AuthConfig.isAuthDisabled()) {
32
- * console.log('Authentication is disabled')
33
- * const anonymousUser = AuthConfig.getAnonymousUser()
34
- * console.log(`Using anonymous user: ${anonymousUser.id}`)
35
- * }
36
- *
37
- * const adminRole = AuthConfig.getAdminRoleName()
38
- * console.log(`Admin role is: ${adminRole}`)
39
- * ```
40
- */
41
- export class AuthConfig {
42
- static { this._config = null; }
43
- /**
44
- * Loads and validates authentication configuration from environment variables.
45
- * This is called automatically the first time any method is used.
46
- */
47
- static loadConfig() {
48
- if (this._config !== null)
49
- return;
50
- const config = Env.validate({
51
- DIGITALTWIN_DISABLE_AUTH: Env.schema.boolean({
52
- optional: true,
53
- default: false
54
- }),
55
- DIGITALTWIN_ANONYMOUS_USER_ID: Env.schema.string({
56
- optional: true
57
- }),
58
- DIGITALTWIN_ADMIN_ROLE_NAME: Env.schema.string({
59
- optional: true
60
- })
61
- });
62
- // Set default anonymous user ID if not provided
63
- if (!config.DIGITALTWIN_ANONYMOUS_USER_ID) {
64
- config.DIGITALTWIN_ANONYMOUS_USER_ID = 'anonymous';
65
- }
66
- // Set default admin role name if not provided
67
- if (!config.DIGITALTWIN_ADMIN_ROLE_NAME) {
68
- config.DIGITALTWIN_ADMIN_ROLE_NAME = 'admin';
69
- }
70
- this._config = config;
71
- }
72
- /**
73
- * Gets the loaded configuration, ensuring it's initialized.
74
- * @private
75
- */
76
- static getConfig() {
77
- this.loadConfig();
78
- if (this._config === null) {
79
- throw new Error('Failed to load authentication configuration');
80
- }
81
- return this._config;
82
- }
83
- /**
84
- * Checks if authentication is disabled via environment variables.
85
- *
86
- * @returns true if DIGITALTWIN_DISABLE_AUTH is set to "true" or "1", false otherwise
87
- *
88
- * @example
89
- * ```typescript
90
- * if (AuthConfig.isAuthDisabled()) {
91
- * console.log('Running in no-auth mode')
92
- * }
93
- * ```
94
- */
95
- static isAuthDisabled() {
96
- return this.getConfig().DIGITALTWIN_DISABLE_AUTH;
97
- }
98
- /**
99
- * Checks if authentication is enabled (opposite of isAuthDisabled).
100
- *
101
- * @returns true if authentication should be enforced, false otherwise
102
- */
103
- static isAuthEnabled() {
104
- return !this.isAuthDisabled();
105
- }
106
- /**
107
- * Gets the anonymous user ID to use when authentication is disabled.
108
- *
109
- * @returns The user ID configured for anonymous access
110
- *
111
- * @example
112
- * ```typescript
113
- * const userId = AuthConfig.getAnonymousUserId()
114
- * console.log(`Anonymous user ID: ${userId}`) // "anonymous" by default
115
- * ```
116
- */
117
- static getAnonymousUserId() {
118
- return this.getConfig().DIGITALTWIN_ANONYMOUS_USER_ID;
119
- }
120
- /**
121
- * Gets a fake authenticated user object for anonymous access.
122
- *
123
- * @returns An AuthenticatedUser object representing the anonymous user
124
- *
125
- * @example
126
- * ```typescript
127
- * import type { AuthenticatedUser } from './types.js'
128
- *
129
- * const anonymousUser: AuthenticatedUser = AuthConfig.getAnonymousUser()
130
- * console.log(anonymousUser) // { id: "anonymous", roles: ["anonymous"] }
131
- * ```
132
- */
133
- static getAnonymousUser() {
134
- return {
135
- id: this.getAnonymousUserId(),
136
- roles: ['anonymous']
137
- };
138
- }
139
- /**
140
- * Gets the name of the admin role configured for the system.
141
- *
142
- * This role name is used to determine if a user has full administrative
143
- * access to all resources, including private assets owned by other users.
144
- *
145
- * @returns The admin role name (default: "admin")
146
- *
147
- * @example
148
- * ```typescript
149
- * const adminRole = AuthConfig.getAdminRoleName()
150
- * console.log(`Admin role: ${adminRole}`) // "admin" by default
151
- *
152
- * // Check if user has admin role
153
- * const userRoles = ['user', 'admin', 'moderator']
154
- * const isAdmin = userRoles.includes(adminRole)
155
- * ```
156
- */
157
- static getAdminRoleName() {
158
- return this.getConfig().DIGITALTWIN_ADMIN_ROLE_NAME;
159
- }
160
- /**
161
- * Resets the cached configuration (useful for testing).
162
- *
163
- * @private
164
- */
165
- static _resetConfig() {
166
- this._config = null;
167
- }
168
- }
169
- //# sourceMappingURL=auth_config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth_config.js","sourceRoot":"","sources":["../../src/auth/auth_config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,OAAO,UAAU;aACJ,YAAO,GAIX,IAAI,CAAA;IAEf;;;OAGG;IACK,MAAM,CAAC,UAAU;QACrB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YAAE,OAAM;QAEjC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC;YACxB,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBACzC,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,KAAK;aACjB,CAAC;YACF,6BAA6B,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7C,QAAQ,EAAE,IAAI;aACjB,CAAC;YACF,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC3C,QAAQ,EAAE,IAAI;aACjB,CAAC;SACL,CAIA,CAAA;QAED,gDAAgD;QAChD,IAAI,CAAC,MAAM,CAAC,6BAA6B,EAAE,CAAC;YACxC,MAAM,CAAC,6BAA6B,GAAG,WAAW,CAAA;QACtD,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACtC,MAAM,CAAC,2BAA2B,GAAG,OAAO,CAAA;QAChD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,MAId,CAAA;IACL,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,SAAS;QACpB,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,cAAc;QACjB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,wBAAwB,CAAA;IACpD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,aAAa;QAChB,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,CAAA;IACjC,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,kBAAkB;QACrB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,6BAA6B,CAAA;IACzD,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB;QACnB,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE;YAC7B,KAAK,EAAE,CAAC,WAAW,CAAC;SACvB,CAAA;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,gBAAgB;QACnB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,2BAA2B,CAAA;IACvD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,YAAY;QACf,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACvB,CAAC"}
@@ -1,5 +0,0 @@
1
- export { ApisixAuthParser } from './apisix_parser.js';
2
- export { UserService } from './user_service.js';
3
- export { AuthConfig } from './auth_config.js';
4
- export type { AuthenticatedUser, UserRecord, AuthContext, AuthenticatedRequest } from './types.js';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA"}
@@ -1,4 +0,0 @@
1
- export { ApisixAuthParser } from './apisix_parser.js';
2
- export { UserService } from './user_service.js';
3
- export { AuthConfig } from './auth_config.js';
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
@@ -1,100 +0,0 @@
1
- /**
2
- * User information extracted from Keycloak JWT via Apache APISIX headers.
3
- *
4
- * This interface represents the authenticated user data parsed from APISIX
5
- * headers after Keycloak authentication. APISIX forwards these headers:
6
- * - `x-user-id`: The Keycloak user UUID
7
- * - `x-user-roles`: Comma-separated list of user roles
8
- *
9
- * @example
10
- * ```typescript
11
- * const authUser = ApisixAuthParser.parseAuthHeaders(req.headers)
12
- * if (authUser) {
13
- * console.log(`User ${authUser.id} has roles: ${authUser.roles.join(', ')}`)
14
- * }
15
- * ```
16
- */
17
- export interface AuthenticatedUser {
18
- /** User ID from Keycloak (x-user-id header) - UUID format */
19
- id: string;
20
- /** User roles from Keycloak (x-user-roles header, parsed from comma-separated string) */
21
- roles: string[];
22
- }
23
- /**
24
- * User record stored in the database.
25
- *
26
- * Represents a user stored in the normalized user management system.
27
- * Users are created automatically when they first access the system
28
- * after being authenticated by Keycloak via APISIX.
29
- *
30
- * @example
31
- * ```typescript
32
- * const userService = new UserService(database)
33
- * const userRecord = await userService.findOrCreateUser(authenticatedUser)
34
- * console.log(`User ${userRecord.keycloak_id} has ${userRecord.roles.length} roles`)
35
- * ```
36
- */
37
- export interface UserRecord {
38
- /** Primary key (auto-increment) */
39
- id?: number;
40
- /** Keycloak user ID (UUID, unique across system) */
41
- keycloak_id: string;
42
- /** User roles (populated from user_roles junction table) */
43
- roles: string[];
44
- /** First time the user was seen in the system */
45
- created_at: Date;
46
- /** Last time the user's roles were updated */
47
- updated_at: Date;
48
- }
49
- /**
50
- * Authentication context passed to handlers.
51
- *
52
- * Contains both the raw authentication data from APISIX headers
53
- * and the corresponding database user record. Used internally
54
- * by components that need full user context.
55
- *
56
- * @example
57
- * ```typescript
58
- * const authContext: AuthContext = {
59
- * user: authUser,
60
- * userRecord: await userService.findOrCreateUser(authUser)
61
- * }
62
- * ```
63
- */
64
- export interface AuthContext {
65
- /** Authenticated user information from APISIX headers */
66
- user: AuthenticatedUser;
67
- /** Database user record with full role information */
68
- userRecord: UserRecord;
69
- }
70
- /**
71
- * Request object extended with authentication context.
72
- *
73
- * Represents an HTTP request that has been augmented with
74
- * authentication information. Used by handlers that need
75
- * access to both request data and user context.
76
- *
77
- * @example
78
- * ```typescript
79
- * async function handleRequest(req: AuthenticatedRequest) {
80
- * if (req.auth) {
81
- * console.log(`Request from user: ${req.auth.user.id}`)
82
- * }
83
- * }
84
- * ```
85
- */
86
- export interface AuthenticatedRequest {
87
- /** Original Express request object */
88
- originalRequest: any;
89
- /** Authentication context (undefined if not authenticated) */
90
- auth?: AuthContext;
91
- /** Request headers (including APISIX authentication headers) */
92
- headers: Record<string, string>;
93
- /** URL parameters */
94
- params?: Record<string, string>;
95
- /** Request body */
96
- body?: any;
97
- /** File upload (for multipart requests with assets) */
98
- file?: any;
99
- }
100
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,iBAAiB;IAC9B,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAA;IACV,yFAAyF;IACzF,KAAK,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAU;IACvB,mCAAmC;IACnC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAA;IACnB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,iDAAiD;IACjD,UAAU,EAAE,IAAI,CAAA;IAChB,8CAA8C;IAC9C,UAAU,EAAE,IAAI,CAAA;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,WAAW;IACxB,yDAAyD;IACzD,IAAI,EAAE,iBAAiB,CAAA;IACvB,sDAAsD;IACtD,UAAU,EAAE,UAAU,CAAA;CACzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,oBAAoB;IACjC,sCAAsC;IACtC,eAAe,EAAE,GAAG,CAAA;IACpB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,mBAAmB;IACnB,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,uDAAuD;IACvD,IAAI,CAAC,EAAE,GAAG,CAAA;CACb"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""}
@@ -1,86 +0,0 @@
1
- import type { DatabaseAdapter } from '../database/database_adapter.js';
2
- import type { AuthenticatedUser, UserRecord } from './types.js';
3
- /**
4
- * Service for managing users in the Digital Twin framework.
5
- *
6
- * This service handles the complete user lifecycle in a Digital Twin application
7
- * with Keycloak authentication via Apache APISIX. It manages a normalized database
8
- * schema with three tables:
9
- *
10
- * - `users`: Core user records linked to Keycloak IDs
11
- * - `roles`: Master list of available roles
12
- * - `user_roles`: Many-to-many relationship between users and roles
13
- *
14
- * Key features:
15
- * - Automatic user creation on first authentication
16
- * - Role synchronization with Keycloak
17
- * - Optimized queries with proper indexing
18
- * - Transaction-safe role updates
19
- *
20
- * @example
21
- * ```typescript
22
- * // Initialize in your Digital Twin engine
23
- * const userService = new UserService(databaseAdapter)
24
- * await userService.initializeTables()
25
- *
26
- * // Use in AssetsManager handlers
27
- * const authUser = ApisixAuthParser.parseAuthHeaders(req.headers)
28
- * const userRecord = await userService.findOrCreateUser(authUser!)
29
- *
30
- * // Link assets to users
31
- * await this.uploadAsset({
32
- * description: 'My file',
33
- * source: 'upload',
34
- * owner_id: userRecord.id!.toString(),
35
- * filename: 'document.pdf',
36
- * file: buffer
37
- * })
38
- * ```
39
- */
40
- export declare class UserService {
41
- private db;
42
- private readonly usersTable;
43
- private readonly rolesTable;
44
- private readonly userRolesTable;
45
- constructor(db: DatabaseAdapter);
46
- /**
47
- * Ensures all user-related tables exist in the database
48
- */
49
- initializeTables(): Promise<void>;
50
- /**
51
- * Finds or creates a user and synchronizes their roles.
52
- *
53
- * When authentication is disabled, returns a mock user record
54
- * without touching the database.
55
- */
56
- findOrCreateUser(authUser: AuthenticatedUser): Promise<UserRecord>;
57
- /**
58
- * Gets a user by their database ID
59
- */
60
- getUserById(id: number): Promise<UserRecord | undefined>;
61
- /**
62
- * Gets a user by their Keycloak ID with roles
63
- */
64
- getUserByKeycloakId(keycloakId: string): Promise<UserRecord | undefined>;
65
- /**
66
- * Gets the underlying Knex instance from the database adapter
67
- */
68
- private getKnex;
69
- /**
70
- * Finds a user by their Keycloak ID
71
- */
72
- private findUserByKeycloakId;
73
- /**
74
- * Creates a new user record
75
- */
76
- private createUser;
77
- /**
78
- * Synchronizes user roles with what's provided by Keycloak
79
- */
80
- private syncUserRoles;
81
- /**
82
- * Gets a user with their roles populated
83
- */
84
- private getUserWithRoles;
85
- }
86
- //# sourceMappingURL=user_service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user_service.d.ts","sourceRoot":"","sources":["../../src/auth/user_service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAI/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;gBAElC,EAAE,EAAE,eAAe;IAI/B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkDvC;;;;;OAKG;IACG,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IA8BxE;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAI9D;;OAEG;IACG,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAY9E;;OAEG;IACH,OAAO,CAAC,OAAO;IAOf;;OAEG;YACW,oBAAoB;IAgBlC;;OAEG;YACW,UAAU;IAuBxB;;OAEG;YACW,aAAa;IAoC3B;;OAEG;YACW,gBAAgB;CAqCjC"}
@@ -1,237 +0,0 @@
1
- import { AuthConfig } from './auth_config.js';
2
- /**
3
- * Service for managing users in the Digital Twin framework.
4
- *
5
- * This service handles the complete user lifecycle in a Digital Twin application
6
- * with Keycloak authentication via Apache APISIX. It manages a normalized database
7
- * schema with three tables:
8
- *
9
- * - `users`: Core user records linked to Keycloak IDs
10
- * - `roles`: Master list of available roles
11
- * - `user_roles`: Many-to-many relationship between users and roles
12
- *
13
- * Key features:
14
- * - Automatic user creation on first authentication
15
- * - Role synchronization with Keycloak
16
- * - Optimized queries with proper indexing
17
- * - Transaction-safe role updates
18
- *
19
- * @example
20
- * ```typescript
21
- * // Initialize in your Digital Twin engine
22
- * const userService = new UserService(databaseAdapter)
23
- * await userService.initializeTables()
24
- *
25
- * // Use in AssetsManager handlers
26
- * const authUser = ApisixAuthParser.parseAuthHeaders(req.headers)
27
- * const userRecord = await userService.findOrCreateUser(authUser!)
28
- *
29
- * // Link assets to users
30
- * await this.uploadAsset({
31
- * description: 'My file',
32
- * source: 'upload',
33
- * owner_id: userRecord.id!.toString(),
34
- * filename: 'document.pdf',
35
- * file: buffer
36
- * })
37
- * ```
38
- */
39
- export class UserService {
40
- constructor(db) {
41
- this.usersTable = 'users';
42
- this.rolesTable = 'roles';
43
- this.userRolesTable = 'user_roles';
44
- this.db = db;
45
- }
46
- /**
47
- * Ensures all user-related tables exist in the database
48
- */
49
- async initializeTables() {
50
- const knex = this.getKnex();
51
- // 1. Create roles table
52
- if (!(await knex.schema.hasTable(this.rolesTable))) {
53
- await knex.schema.createTable(this.rolesTable, table => {
54
- table.increments('id').primary();
55
- table.string('name', 100).notNullable().unique();
56
- table.timestamp('created_at').defaultTo(knex.fn.now());
57
- // Index pour les recherches par nom de rôle
58
- table.index('name', 'roles_idx_name');
59
- });
60
- }
61
- // 2. Create users table
62
- if (!(await knex.schema.hasTable(this.usersTable))) {
63
- await knex.schema.createTable(this.usersTable, table => {
64
- table.increments('id').primary();
65
- table.string('keycloak_id', 255).notNullable().unique();
66
- table.timestamp('created_at').defaultTo(knex.fn.now());
67
- table.timestamp('updated_at').defaultTo(knex.fn.now());
68
- // Index principal pour les lookups par keycloak_id
69
- table.index('keycloak_id', 'users_idx_keycloak_id');
70
- table.index('created_at', 'users_idx_created_at');
71
- });
72
- }
73
- // 3. Create user_roles junction table
74
- if (!(await knex.schema.hasTable(this.userRolesTable))) {
75
- await knex.schema.createTable(this.userRolesTable, table => {
76
- table.integer('user_id').unsigned().notNullable();
77
- table.integer('role_id').unsigned().notNullable();
78
- table.timestamp('created_at').defaultTo(knex.fn.now());
79
- // Clé primaire composite
80
- table.primary(['user_id', 'role_id']);
81
- // Clés étrangères
82
- table.foreign('user_id').references('id').inTable(this.usersTable).onDelete('CASCADE');
83
- table.foreign('role_id').references('id').inTable(this.rolesTable).onDelete('CASCADE');
84
- // Index pour les requêtes inverses (quels utilisateurs ont ce rôle)
85
- table.index('role_id', 'user_roles_idx_role_id');
86
- table.index('user_id', 'user_roles_idx_user_id');
87
- });
88
- }
89
- }
90
- /**
91
- * Finds or creates a user and synchronizes their roles.
92
- *
93
- * When authentication is disabled, returns a mock user record
94
- * without touching the database.
95
- */
96
- async findOrCreateUser(authUser) {
97
- // If authentication is disabled, return a mock user record
98
- if (AuthConfig.isAuthDisabled()) {
99
- return {
100
- id: 1, // Use a consistent ID for anonymous user
101
- keycloak_id: authUser.id,
102
- roles: authUser.roles,
103
- created_at: new Date(),
104
- updated_at: new Date()
105
- };
106
- }
107
- // 1. Find or create user
108
- let userRecord = await this.findUserByKeycloakId(authUser.id);
109
- if (!userRecord) {
110
- userRecord = await this.createUser(authUser);
111
- }
112
- if (!userRecord.id) {
113
- throw new Error('User record does not have an ID after creation/retrieval');
114
- }
115
- // 2. Synchronize roles
116
- await this.syncUserRoles(userRecord.id, authUser.roles);
117
- // 3. Return user with current roles
118
- return (await this.getUserWithRoles(userRecord.id)) || userRecord;
119
- }
120
- /**
121
- * Gets a user by their database ID
122
- */
123
- async getUserById(id) {
124
- return await this.getUserWithRoles(id);
125
- }
126
- /**
127
- * Gets a user by their Keycloak ID with roles
128
- */
129
- async getUserByKeycloakId(keycloakId) {
130
- const knex = this.getKnex();
131
- const userRow = (await knex(this.usersTable).where('keycloak_id', keycloakId).first());
132
- if (!userRow)
133
- return undefined;
134
- return await this.getUserWithRoles(userRow.id);
135
- }
136
- /**
137
- * Gets the underlying Knex instance from the database adapter
138
- */
139
- getKnex() {
140
- if ('getKnex' in this.db && typeof this.db.getKnex === 'function') {
141
- return this.db.getKnex();
142
- }
143
- throw new Error('Cannot access Knex instance from DatabaseAdapter');
144
- }
145
- /**
146
- * Finds a user by their Keycloak ID
147
- */
148
- async findUserByKeycloakId(keycloakId) {
149
- const knex = this.getKnex();
150
- const row = await knex(this.usersTable).where('keycloak_id', keycloakId).first();
151
- if (!row)
152
- return undefined;
153
- return {
154
- id: row.id,
155
- keycloak_id: row.keycloak_id,
156
- roles: [], // Will be populated by getUserWithRoles
157
- created_at: new Date(row.created_at),
158
- updated_at: new Date(row.updated_at)
159
- };
160
- }
161
- /**
162
- * Creates a new user record
163
- */
164
- async createUser(authUser) {
165
- const knex = this.getKnex();
166
- const now = new Date();
167
- const userData = {
168
- keycloak_id: authUser.id,
169
- created_at: now,
170
- updated_at: now
171
- };
172
- const insertResult = await knex(this.usersTable).insert(userData).returning('id');
173
- const insertedId = insertResult[0];
174
- const id = typeof insertedId === 'object' ? insertedId.id : insertedId;
175
- return {
176
- id,
177
- keycloak_id: authUser.id,
178
- roles: [],
179
- created_at: now,
180
- updated_at: now
181
- };
182
- }
183
- /**
184
- * Synchronizes user roles with what's provided by Keycloak
185
- */
186
- async syncUserRoles(userId, newRoles) {
187
- const knex = this.getKnex();
188
- // Transaction pour assurer la cohérence
189
- await knex.transaction(async (trx) => {
190
- // 1. Ensure all roles exist in roles table
191
- for (const roleName of newRoles) {
192
- await trx(this.rolesTable).insert({ name: roleName }).onConflict('name').ignore(); // Si le rôle existe déjà, on l'ignore
193
- }
194
- // 2. Get role IDs
195
- const roleRows = (await trx(this.rolesTable).select('id', 'name').whereIn('name', newRoles));
196
- const roleIds = roleRows.map(r => r.id);
197
- // 3. Remove old role associations
198
- await trx(this.userRolesTable).where('user_id', userId).delete();
199
- // 4. Add new role associations
200
- if (roleIds.length > 0) {
201
- const userRoleData = roleIds.map((roleId) => ({
202
- user_id: userId,
203
- role_id: roleId
204
- }));
205
- await trx(this.userRolesTable).insert(userRoleData);
206
- }
207
- // 5. Update user's updated_at timestamp
208
- await trx(this.usersTable).where('id', userId).update({ updated_at: new Date() });
209
- });
210
- }
211
- /**
212
- * Gets a user with their roles populated
213
- */
214
- async getUserWithRoles(userId) {
215
- const knex = this.getKnex();
216
- // Join query to get user + roles
217
- const result = (await knex(this.usersTable)
218
- .leftJoin(this.userRolesTable, `${this.usersTable}.id`, `${this.userRolesTable}.user_id`)
219
- .leftJoin(this.rolesTable, `${this.userRolesTable}.role_id`, `${this.rolesTable}.id`)
220
- .select(`${this.usersTable}.id`, `${this.usersTable}.keycloak_id`, `${this.usersTable}.created_at`, `${this.usersTable}.updated_at`, `${this.rolesTable}.name as role_name`)
221
- .where(`${this.usersTable}.id`, userId));
222
- if (result.length === 0)
223
- return undefined;
224
- const userRow = result[0];
225
- const roles = result
226
- .filter((row) => row.role_name !== null)
227
- .map(row => row.role_name);
228
- return {
229
- id: userRow.id,
230
- keycloak_id: userRow.keycloak_id,
231
- roles: roles,
232
- created_at: new Date(userRow.created_at),
233
- updated_at: new Date(userRow.updated_at)
234
- };
235
- }
236
- }
237
- //# sourceMappingURL=user_service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user_service.js","sourceRoot":"","sources":["../../src/auth/user_service.ts"],"names":[],"mappings":"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"}