digitaltwin-core 0.14.2 → 1.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.
- package/LICENSE +20 -20
- package/README.md +494 -359
- package/dist/auth/apisix_parser.d.ts +141 -0
- package/dist/auth/apisix_parser.d.ts.map +1 -0
- package/dist/auth/apisix_parser.js +161 -0
- package/dist/auth/apisix_parser.js.map +1 -0
- package/dist/auth/auth_config.d.ts +126 -0
- package/dist/auth/auth_config.d.ts.map +1 -0
- package/dist/auth/auth_config.js +169 -0
- package/dist/auth/auth_config.js.map +1 -0
- package/dist/auth/auth_provider.d.ts +118 -0
- package/dist/auth/auth_provider.d.ts.map +1 -0
- package/dist/auth/auth_provider.js +8 -0
- package/dist/auth/auth_provider.js.map +1 -0
- package/dist/auth/auth_provider_factory.d.ts +91 -0
- package/dist/auth/auth_provider_factory.d.ts.map +1 -0
- package/dist/auth/auth_provider_factory.js +146 -0
- package/dist/auth/auth_provider_factory.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/providers/gateway_auth_provider.d.ts +78 -0
- package/dist/auth/providers/gateway_auth_provider.d.ts.map +1 -0
- package/dist/auth/providers/gateway_auth_provider.js +109 -0
- package/dist/auth/providers/gateway_auth_provider.js.map +1 -0
- package/dist/auth/providers/index.d.ts +4 -0
- package/dist/auth/providers/index.d.ts.map +1 -0
- package/dist/auth/providers/index.js +4 -0
- package/dist/auth/providers/index.js.map +1 -0
- package/dist/auth/providers/jwt_auth_provider.d.ts +91 -0
- package/dist/auth/providers/jwt_auth_provider.d.ts.map +1 -0
- package/dist/auth/providers/jwt_auth_provider.js +204 -0
- package/dist/auth/providers/jwt_auth_provider.js.map +1 -0
- package/dist/auth/providers/no_auth_provider.d.ts +61 -0
- package/dist/auth/providers/no_auth_provider.d.ts.map +1 -0
- package/dist/auth/providers/no_auth_provider.js +76 -0
- package/dist/auth/providers/no_auth_provider.js.map +1 -0
- package/dist/auth/types.d.ts +100 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user_service.d.ts +86 -0
- package/dist/auth/user_service.d.ts.map +1 -0
- package/dist/auth/user_service.js +237 -0
- package/dist/auth/user_service.js.map +1 -0
- package/dist/components/assets_manager.d.ts +662 -0
- package/dist/components/assets_manager.d.ts.map +1 -0
- package/dist/components/assets_manager.js +1537 -0
- package/dist/components/assets_manager.js.map +1 -0
- package/dist/components/async_upload.d.ts +20 -0
- package/dist/components/async_upload.d.ts.map +1 -0
- package/dist/components/async_upload.js +10 -0
- package/dist/components/async_upload.js.map +1 -0
- package/dist/components/collector.d.ts +203 -0
- package/dist/components/collector.d.ts.map +1 -0
- package/dist/components/collector.js +214 -0
- package/dist/components/collector.js.map +1 -0
- package/dist/components/custom_table_manager.d.ts +503 -0
- package/dist/components/custom_table_manager.d.ts.map +1 -0
- package/dist/components/custom_table_manager.js +1023 -0
- package/dist/components/custom_table_manager.js.map +1 -0
- package/dist/components/global_assets_handler.d.ts +63 -0
- package/dist/components/global_assets_handler.d.ts.map +1 -0
- package/dist/components/global_assets_handler.js +127 -0
- package/dist/components/global_assets_handler.js.map +1 -0
- package/dist/components/handler.d.ts +104 -0
- package/dist/components/handler.d.ts.map +1 -0
- package/dist/components/handler.js +110 -0
- package/dist/components/handler.js.map +1 -0
- package/dist/components/harvester.d.ts +182 -0
- package/dist/components/harvester.d.ts.map +1 -0
- package/dist/components/harvester.js +406 -0
- package/dist/components/harvester.js.map +1 -0
- package/dist/components/index.d.ts +11 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +9 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/interfaces.d.ts +126 -0
- package/dist/components/interfaces.d.ts.map +1 -0
- package/dist/components/interfaces.js +8 -0
- package/dist/components/interfaces.js.map +1 -0
- package/dist/components/map_manager.d.ts +61 -0
- package/dist/components/map_manager.d.ts.map +1 -0
- package/dist/components/map_manager.js +242 -0
- package/dist/components/map_manager.js.map +1 -0
- package/dist/components/tileset_manager.d.ts +125 -0
- package/dist/components/tileset_manager.d.ts.map +1 -0
- package/dist/components/tileset_manager.js +623 -0
- package/dist/components/tileset_manager.js.map +1 -0
- package/dist/components/types.d.ts +226 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +8 -0
- package/dist/components/types.js.map +1 -0
- package/dist/database/adapters/knex_database_adapter.d.ts +97 -0
- package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -0
- package/dist/database/adapters/knex_database_adapter.js +729 -0
- package/dist/database/adapters/knex_database_adapter.js.map +1 -0
- package/dist/database/database_adapter.d.ts +262 -0
- package/dist/database/database_adapter.d.ts.map +1 -0
- package/dist/database/database_adapter.js +46 -0
- package/dist/database/database_adapter.js.map +1 -0
- package/dist/engine/digital_twin_engine.d.ts +295 -0
- package/dist/engine/digital_twin_engine.d.ts.map +1 -0
- package/dist/engine/digital_twin_engine.js +907 -0
- package/dist/engine/digital_twin_engine.js.map +1 -0
- package/dist/engine/endpoints.d.ts +47 -0
- package/dist/engine/endpoints.d.ts.map +1 -0
- package/dist/engine/endpoints.js +88 -0
- package/dist/engine/endpoints.js.map +1 -0
- package/dist/engine/error_handler.d.ts +20 -0
- package/dist/engine/error_handler.d.ts.map +1 -0
- package/dist/engine/error_handler.js +69 -0
- package/dist/engine/error_handler.js.map +1 -0
- package/dist/engine/events.d.ts +93 -0
- package/dist/engine/events.d.ts.map +1 -0
- package/dist/engine/events.js +71 -0
- package/dist/engine/events.js.map +1 -0
- package/dist/engine/health.d.ts +112 -0
- package/dist/engine/health.d.ts.map +1 -0
- package/dist/engine/health.js +190 -0
- package/dist/engine/health.js.map +1 -0
- package/dist/engine/initializer.d.ts +62 -0
- package/dist/engine/initializer.d.ts.map +1 -0
- package/dist/engine/initializer.js +108 -0
- package/dist/engine/initializer.js.map +1 -0
- package/dist/engine/queue_manager.d.ts +87 -0
- package/dist/engine/queue_manager.d.ts.map +1 -0
- package/dist/engine/queue_manager.js +196 -0
- package/dist/engine/queue_manager.js.map +1 -0
- package/dist/engine/scheduler.d.ts +30 -0
- package/dist/engine/scheduler.d.ts.map +1 -0
- package/dist/engine/scheduler.js +378 -0
- package/dist/engine/scheduler.js.map +1 -0
- package/dist/engine/upload_processor.d.ts +36 -0
- package/dist/engine/upload_processor.d.ts.map +1 -0
- package/dist/engine/upload_processor.js +113 -0
- package/dist/engine/upload_processor.js.map +1 -0
- package/dist/env/env.d.ts +134 -0
- package/dist/env/env.d.ts.map +1 -0
- package/dist/env/env.js +177 -0
- package/dist/env/env.js.map +1 -0
- package/dist/errors/index.d.ts +94 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +149 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/openapi/generator.d.ts +93 -0
- package/dist/openapi/generator.d.ts.map +1 -0
- package/dist/openapi/generator.js +293 -0
- package/dist/openapi/generator.js.map +1 -0
- package/dist/openapi/index.d.ts +9 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +9 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/types.d.ts +182 -0
- package/dist/openapi/types.d.ts.map +1 -0
- package/dist/openapi/types.js +16 -0
- package/dist/openapi/types.js.map +1 -0
- package/dist/storage/adapters/local_storage_service.d.ts +57 -0
- package/dist/storage/adapters/local_storage_service.d.ts.map +1 -0
- package/dist/storage/adapters/local_storage_service.js +132 -0
- package/dist/storage/adapters/local_storage_service.js.map +1 -0
- package/dist/storage/adapters/ovh_storage_service.d.ts +72 -0
- package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -0
- package/dist/storage/adapters/ovh_storage_service.js +205 -0
- package/dist/storage/adapters/ovh_storage_service.js.map +1 -0
- package/dist/storage/storage_factory.d.ts +14 -0
- package/dist/storage/storage_factory.d.ts.map +1 -0
- package/dist/storage/storage_factory.js +43 -0
- package/dist/storage/storage_factory.js.map +1 -0
- package/dist/storage/storage_service.d.ts +163 -0
- package/dist/storage/storage_service.d.ts.map +1 -0
- package/dist/storage/storage_service.js +58 -0
- package/dist/storage/storage_service.js.map +1 -0
- package/dist/types/data_record.d.ts +123 -0
- package/dist/types/data_record.d.ts.map +1 -0
- package/dist/types/data_record.js +8 -0
- package/dist/types/data_record.js.map +1 -0
- package/dist/utils/graceful_shutdown.d.ts +44 -0
- package/dist/utils/graceful_shutdown.d.ts.map +1 -0
- package/dist/utils/graceful_shutdown.js +79 -0
- package/dist/utils/graceful_shutdown.js.map +1 -0
- package/dist/utils/http_responses.d.ts +175 -0
- package/dist/utils/http_responses.d.ts.map +1 -0
- package/dist/utils/http_responses.js +216 -0
- package/dist/utils/http_responses.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +74 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/map_to_data_record.d.ts +10 -0
- package/dist/utils/map_to_data_record.d.ts.map +1 -0
- package/dist/utils/map_to_data_record.js +36 -0
- package/dist/utils/map_to_data_record.js.map +1 -0
- package/dist/utils/safe_async.d.ts +50 -0
- package/dist/utils/safe_async.d.ts.map +1 -0
- package/dist/utils/safe_async.js +90 -0
- package/dist/utils/safe_async.js.map +1 -0
- package/dist/utils/servable_endpoint.d.ts +63 -0
- package/dist/utils/servable_endpoint.d.ts.map +1 -0
- package/dist/utils/servable_endpoint.js +67 -0
- package/dist/utils/servable_endpoint.js.map +1 -0
- package/dist/utils/zip_utils.d.ts +66 -0
- package/dist/utils/zip_utils.d.ts.map +1 -0
- package/dist/utils/zip_utils.js +169 -0
- package/dist/utils/zip_utils.js.map +1 -0
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +7 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schemas.d.ts +273 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +82 -0
- package/dist/validation/schemas.js.map +1 -0
- package/dist/validation/validate.d.ts +49 -0
- package/dist/validation/validate.d.ts.map +1 -0
- package/dist/validation/validate.js +110 -0
- package/dist/validation/validate.js.map +1 -0
- package/package.json +23 -13
|
@@ -0,0 +1,237 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user_service.js","sourceRoot":"","sources":["../../src/auth/user_service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,OAAO,WAAW;IAMpB,YAAY,EAAmB;QAJd,eAAU,GAAG,OAAO,CAAA;QACpB,eAAU,GAAG,OAAO,CAAA;QACpB,mBAAc,GAAG,YAAY,CAAA;QAG1C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAE3B,wBAAwB;QACxB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;gBACnD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;gBAChC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAA;gBAChD,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;gBAEtD,4CAA4C;gBAC5C,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;QACN,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;gBACnD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;gBAChC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAA;gBACvD,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;gBACtD,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;gBAEtD,mDAAmD;gBACnD,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAA;gBACnD,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAA;YACrD,CAAC,CAAC,CAAA;QACN,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE;gBACvD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAA;gBACjD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAA;gBACjD,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;gBAEtD,yBAAyB;gBACzB,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;gBAErC,kBAAkB;gBAClB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;gBACtF,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;gBAEtF,oEAAoE;gBACpE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAA;gBAChD,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAA;YACpD,CAAC,CAAC,CAAA;QACN,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAA2B;QAC9C,2DAA2D;QAC3D,IAAI,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;YAC9B,OAAO;gBACH,EAAE,EAAE,CAAC,EAAE,yCAAyC;gBAChD,WAAW,EAAE,QAAQ,CAAC,EAAE;gBACxB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU,EAAE,IAAI,IAAI,EAAE;gBACtB,UAAU,EAAE,IAAI,IAAI,EAAE;aACzB,CAAA;QACL,CAAC;QAED,yBAAyB;QACzB,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAE7D,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAChD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;QAC/E,CAAC;QAED,uBAAuB;QACvB,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAEvD,oCAAoC;QACpC,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,UAAU,CAAA;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QACxB,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,UAAkB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAE3B,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,CAEtE,CAAA;QAEf,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAA;QAE9B,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAClD,CAAC;IAED;;OAEG;IACK,OAAO;QACX,IAAI,SAAS,IAAI,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChE,OAAQ,IAAI,CAAC,EAAU,CAAC,OAAO,EAAE,CAAA;QACrC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACvE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAAC,UAAkB;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAE3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,CAAA;QAEhF,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAA;QAE1B,OAAO;YACH,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,KAAK,EAAE,EAAE,EAAE,wCAAwC;YACnD,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YACpC,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;SACvC,CAAA;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,QAA2B;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QAEtB,MAAM,QAAQ,GAAG;YACb,WAAW,EAAE,QAAQ,CAAC,EAAE;YACxB,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,GAAG;SAClB,CAAA;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACjF,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,EAAE,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAE,UAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAA;QAE1F,OAAO;YACH,EAAE;YACF,WAAW,EAAE,QAAQ,CAAC,EAAE;YACxB,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,GAAG;SAClB,CAAA;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,QAAkB;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAE3B,wCAAwC;QACxC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;YAC/B,2CAA2C;YAC3C,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA,CAAC,sCAAsC;YAC5H,CAAC;YAED,kBAAkB;YAClB,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAGxF,CAAA;YAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAEvC,kCAAkC;YAClC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;YAEhE,+BAA+B;YAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;oBAClD,OAAO,EAAE,MAAM;oBACf,OAAO,EAAE,MAAM;iBAClB,CAAC,CAAC,CAAA;gBAEH,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;YACvD,CAAC;YAED,wCAAwC;YACxC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAA;QACrF,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAE3B,iCAAiC;QACjC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;aACtC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,UAAU,KAAK,EAAE,GAAG,IAAI,CAAC,cAAc,UAAU,CAAC;aACxF,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,cAAc,UAAU,EAAE,GAAG,IAAI,CAAC,UAAU,KAAK,CAAC;aACpF,MAAM,CACH,GAAG,IAAI,CAAC,UAAU,KAAK,EACvB,GAAG,IAAI,CAAC,UAAU,cAAc,EAChC,GAAG,IAAI,CAAC,UAAU,aAAa,EAC/B,GAAG,IAAI,CAAC,UAAU,aAAa,EAC/B,GAAG,IAAI,CAAC,UAAU,oBAAoB,CACzC;aACA,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,KAAK,EAAE,MAAM,CAAC,CAMxC,CAAA;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;QAEzC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,KAAK,GAAG,MAAM;aACf,MAAM,CAAC,CAAC,GAAG,EAA6C,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;aAClF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAE9B,OAAO;YACH,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACxC,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;SAC3C,CAAA;IACL,CAAC;CACJ"}
|