@adminide-stack/marketplace-module-server 12.0.4-alpha.95 → 13.0.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/lib/containers/module.d.ts +4 -4
  2. package/lib/containers/module.d.ts.map +1 -1
  3. package/lib/containers/module.js +12 -7
  4. package/lib/containers/module.js.map +1 -1
  5. package/lib/dataloaders/index.d.ts +1 -1
  6. package/lib/dataloaders/index.d.ts.map +1 -1
  7. package/lib/dataloaders/publisher-data-loader.d.ts +6 -0
  8. package/lib/dataloaders/publisher-data-loader.d.ts.map +1 -0
  9. package/lib/demo/test-graphql-examples.d.ts +73 -0
  10. package/lib/demo/test-graphql-examples.d.ts.map +1 -0
  11. package/lib/graphql/resolvers/form-templates-resolver.d.ts +220 -0
  12. package/lib/graphql/resolvers/form-templates-resolver.d.ts.map +1 -0
  13. package/lib/graphql/resolvers/form-templates-resolver.js +170 -0
  14. package/lib/graphql/resolvers/form-templates-resolver.js.map +1 -0
  15. package/lib/graphql/resolvers/gallery-resolver.d.ts +15 -0
  16. package/lib/graphql/resolvers/gallery-resolver.d.ts.map +1 -0
  17. package/lib/graphql/resolvers/gallery-resolver.js +35 -0
  18. package/lib/graphql/resolvers/gallery-resolver.js.map +1 -0
  19. package/lib/graphql/resolvers/index.d.ts +247 -1
  20. package/lib/graphql/resolvers/index.d.ts.map +1 -1
  21. package/lib/graphql/resolvers/index.js +1 -1
  22. package/lib/graphql/resolvers/installed-extension-resolver.d.ts.map +1 -1
  23. package/lib/graphql/resolvers/installed-extension-resolver.js +161 -35
  24. package/lib/graphql/resolvers/installed-extension-resolver.js.map +1 -1
  25. package/lib/graphql/resolvers/marketplace-form-resolver.d.ts +13 -0
  26. package/lib/graphql/resolvers/marketplace-form-resolver.d.ts.map +1 -0
  27. package/lib/graphql/resolvers/marketplace-form-resolver.js +90 -0
  28. package/lib/graphql/resolvers/marketplace-form-resolver.js.map +1 -0
  29. package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts +14 -0
  30. package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts.map +1 -0
  31. package/lib/graphql/resolvers/publisher-analytics-resolver.js +221 -0
  32. package/lib/graphql/resolvers/publisher-analytics-resolver.js.map +1 -0
  33. package/lib/graphql/resolvers/publisher-resolver.d.ts +5 -0
  34. package/lib/graphql/resolvers/publisher-resolver.d.ts.map +1 -0
  35. package/lib/graphql/resolvers/publisher-resolver.js +183 -0
  36. package/lib/graphql/resolvers/publisher-resolver.js.map +1 -0
  37. package/lib/graphql/resolvers/registry-extension-resolver.d.ts.map +1 -1
  38. package/lib/graphql/resolvers/registry-extension-resolver.js +34 -167
  39. package/lib/graphql/resolvers/registry-extension-resolver.js.map +1 -1
  40. package/lib/graphql/schemas/extension-pricing.graphql +546 -0
  41. package/lib/graphql/schemas/extension-pricing.graphql.js +1 -0
  42. package/lib/graphql/schemas/extension-pricing.graphql.js.map +1 -0
  43. package/lib/graphql/schemas/extension-registry.graphql +91 -58
  44. package/lib/graphql/schemas/extension-registry.graphql.js +1 -1
  45. package/lib/graphql/schemas/form-templates.graphql +269 -0
  46. package/lib/graphql/schemas/form-templates.graphql.js +1 -0
  47. package/lib/graphql/schemas/form-templates.graphql.js.map +1 -0
  48. package/lib/graphql/schemas/gallery-schema.graphql +247 -0
  49. package/lib/graphql/schemas/gallery-schema.graphql.js +1 -0
  50. package/lib/graphql/schemas/gallery-schema.graphql.js.map +1 -0
  51. package/lib/graphql/schemas/index.d.ts.map +1 -1
  52. package/lib/graphql/schemas/index.js +3 -1
  53. package/lib/graphql/schemas/index.js.map +1 -1
  54. package/lib/graphql/schemas/installed-extension.graphql +37 -7
  55. package/lib/graphql/schemas/installed-extension.graphql.js +1 -1
  56. package/lib/graphql/schemas/publisher-analytics.graphql +305 -0
  57. package/lib/graphql/schemas/publisher-analytics.graphql.js +1 -0
  58. package/lib/graphql/schemas/publisher-analytics.graphql.js.map +1 -0
  59. package/lib/graphql/schemas/publisher.graphql +584 -0
  60. package/lib/graphql/schemas/publisher.graphql.js +1 -0
  61. package/lib/graphql/schemas/publisher.graphql.js.map +1 -0
  62. package/lib/graphql/schemas/service.graphql +15 -0
  63. package/lib/index.d.ts +1 -1
  64. package/lib/index.js +1 -1
  65. package/lib/index.js.map +1 -1
  66. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts +20 -0
  67. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts.map +1 -0
  68. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js +61 -0
  69. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js.map +1 -0
  70. package/lib/migrations/index.d.ts +2 -0
  71. package/lib/migrations/index.d.ts.map +1 -0
  72. package/lib/module.d.ts +1 -1
  73. package/lib/module.d.ts.map +1 -1
  74. package/lib/module.js +11 -26
  75. package/lib/module.js.map +1 -1
  76. package/lib/services/extension-gallery-repository.d.ts +17 -0
  77. package/lib/services/extension-gallery-repository.d.ts.map +1 -0
  78. package/lib/services/extension-gallery-repository.js +192 -0
  79. package/lib/services/extension-gallery-repository.js.map +1 -0
  80. package/lib/services/extension-gallery-service-new.d.ts +39 -0
  81. package/lib/services/extension-gallery-service-new.d.ts.map +1 -0
  82. package/lib/services/extension-gallery-service.d.ts +30 -0
  83. package/lib/services/extension-gallery-service.d.ts.map +1 -0
  84. package/lib/services/extension-gallery-service.js +334 -0
  85. package/lib/services/extension-gallery-service.js.map +1 -0
  86. package/lib/services/index.d.ts +4 -1
  87. package/lib/services/index.d.ts.map +1 -1
  88. package/lib/services/installed-extension-service-ext.d.ts +5 -2
  89. package/lib/services/installed-extension-service-ext.d.ts.map +1 -1
  90. package/lib/services/installed-extension-service-ext.js +364 -117
  91. package/lib/services/installed-extension-service-ext.js.map +1 -1
  92. package/lib/services/installed-extension-service.d.ts +30 -13
  93. package/lib/services/installed-extension-service.d.ts.map +1 -1
  94. package/lib/services/installed-extension-service.js +301 -68
  95. package/lib/services/installed-extension-service.js.map +1 -1
  96. package/lib/services/installed-extension-service.test.d.ts +0 -1
  97. package/lib/services/publisher-analytics-service.d.ts +128 -0
  98. package/lib/services/publisher-analytics-service.d.ts.map +1 -0
  99. package/lib/services/publisher-event-service.d.ts +48 -0
  100. package/lib/services/publisher-event-service.d.ts.map +1 -0
  101. package/lib/services/publisher-event-service.js +296 -0
  102. package/lib/services/publisher-event-service.js.map +1 -0
  103. package/lib/services/publisher-service-context.d.ts +1 -0
  104. package/lib/services/publisher-service-context.d.ts.map +1 -0
  105. package/lib/services/publisher-service.d.ts +62 -0
  106. package/lib/services/publisher-service.d.ts.map +1 -0
  107. package/lib/services/publisher-service.js +135 -0
  108. package/lib/services/publisher-service.js.map +1 -0
  109. package/lib/store/models/index.d.ts +1 -1
  110. package/lib/store/models/index.d.ts.map +1 -1
  111. package/lib/store/models/installed-extension-model.d.ts.map +1 -1
  112. package/lib/store/models/installed-extension-model.js +17 -45
  113. package/lib/store/models/installed-extension-model.js.map +1 -1
  114. package/lib/store/models/publisher-event-model.d.ts +11 -0
  115. package/lib/store/models/publisher-event-model.d.ts.map +1 -0
  116. package/lib/store/models/publisher-model.d.ts +5 -0
  117. package/lib/store/models/publisher-model.d.ts.map +1 -0
  118. package/lib/store/models/publisher-model.js +117 -0
  119. package/lib/store/models/publisher-model.js.map +1 -0
  120. package/lib/store/models/publisher-stats-model.d.ts +1 -0
  121. package/lib/store/models/publisher-stats-model.d.ts.map +1 -0
  122. package/lib/store/repositories/index.d.ts +1 -1
  123. package/lib/store/repositories/index.d.ts.map +1 -1
  124. package/lib/store/repositories/installed-extension-repository.d.ts +17 -11
  125. package/lib/store/repositories/installed-extension-repository.d.ts.map +1 -1
  126. package/lib/store/repositories/installed-extension-repository.js +123 -75
  127. package/lib/store/repositories/installed-extension-repository.js.map +1 -1
  128. package/lib/store/repositories/publisher-analytics-repository.d.ts +1 -0
  129. package/lib/store/repositories/publisher-analytics-repository.d.ts.map +1 -0
  130. package/lib/store/repositories/publisher-repository.d.ts +19 -0
  131. package/lib/store/repositories/publisher-repository.d.ts.map +1 -0
  132. package/lib/store/repositories/publisher-repository.js +87 -0
  133. package/lib/store/repositories/publisher-repository.js.map +1 -0
  134. package/lib/templates/constants/DB_COLL_NAMES.ts.template +1 -1
  135. package/lib/templates/constants/SERVER_TYPES.ts.template +8 -5
  136. package/lib/templates/repositories/ExtensionGalleryRepository.ts.template +44 -0
  137. package/lib/templates/repositories/InstalledExtensionRepository.ts.template +19 -14
  138. package/lib/templates/repositories/MarketplacePublisherRepository.ts.template +24 -0
  139. package/lib/templates/repositories/RegistryExtensionRepository.ts.template +2 -2
  140. package/lib/templates/services/ExtensionGalleryDataLoader.ts.template +2 -0
  141. package/lib/templates/services/ExtensionGalleryService.ts.template +79 -0
  142. package/lib/templates/services/InstalledExtensionService.ts.template +63 -32
  143. package/lib/templates/services/MarketplacePublisherService.ts.template +51 -0
  144. package/lib/templates/services/PublisherDataLoader.ts.template +3 -0
  145. package/lib/templates/services/PublisherEventService.ts.template +56 -0
  146. package/lib/templates/services/RegistryExtensionService.ts.template +46 -2
  147. package/lib/tests/extension-integration.test.d.ts +0 -1
  148. package/lib/tests/install-extension-graphql.test.d.ts +2 -0
  149. package/lib/tests/install-extension-graphql.test.d.ts.map +1 -0
  150. package/lib/utils/publisherValidation.d.ts +23 -0
  151. package/lib/utils/publisherValidation.d.ts.map +1 -0
  152. package/lib/utils/publisherValidation.js +144 -0
  153. package/lib/utils/publisherValidation.js.map +1 -0
  154. package/package.json +13 -9
  155. package/lib/constants/extension-events.d.ts +0 -136
  156. package/lib/constants/extension-events.d.ts.map +0 -1
  157. package/lib/dataloaders/registry-extension-data-loader.d.ts +0 -6
  158. package/lib/dataloaders/registry-extension-data-loader.d.ts.map +0 -1
  159. package/lib/dataloaders/registry-extension-data-loader.js +0 -6
  160. package/lib/dataloaders/registry-extension-data-loader.js.map +0 -1
  161. package/lib/graphql/schemas/service.graphql.js +0 -1
  162. package/lib/graphql/schemas/service.graphql.js.map +0 -1
  163. package/lib/services/extension-service.d.ts +0 -42
  164. package/lib/services/extension-service.d.ts.map +0 -1
  165. package/lib/services/extension-service.js +0 -60
  166. package/lib/services/extension-service.js.map +0 -1
  167. package/lib/store/models/registry-extension-model.d.ts +0 -5
  168. package/lib/store/models/registry-extension-model.d.ts.map +0 -1
  169. package/lib/store/models/registry-extension-model.js +0 -83
  170. package/lib/store/models/registry-extension-model.js.map +0 -1
  171. package/lib/store/repositories/registry-extension-repository.d.ts +0 -54
  172. package/lib/store/repositories/registry-extension-repository.d.ts.map +0 -1
  173. package/lib/store/repositories/registry-extension-repository.js +0 -137
  174. package/lib/store/repositories/registry-extension-repository.js.map +0 -1
  175. package/lib/templates/services/RegistryExtensionDataLoader.ts.template +0 -2
@@ -1,4 +1,4 @@
1
- import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,optional}from'inversify';import {BaseMongoRepository}from'@common-stack/store-mongo';import*as mongoose from'mongoose';import'../models/registry-extension-model.js';import {InstalledExtensionModelFunc}from'../models/installed-extension-model.js';let InstalledExtensionRepository = class InstalledExtensionRepository extends BaseMongoRepository {
1
+ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,optional}from'inversify';import {DB_COLL_NAMES}from'common/server';import {BaseMongoRepository}from'@common-stack/store-mongo';import*as mongoose from'mongoose';import {InstalledExtensionModelFunc}from'../models/installed-extension-model.js';import'../models/publisher-model.js';let InstalledExtensionRepository = class InstalledExtensionRepository extends BaseMongoRepository {
2
2
  constructor(db, logger, options) {
3
3
  super(InstalledExtensionModelFunc, db, logger, options);
4
4
  if (!db) {
@@ -8,30 +8,46 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
8
8
  className: 'InstalledExtensionRepository'
9
9
  });
10
10
  }
11
- async findByTenantAndId(tenantId, extensionSlug) {
11
+ async findByOrgAndId(orgId, extensionSlug) {
12
12
  try {
13
- const extension = await this.model.findOne({
14
- tenantId,
13
+ // Since we store extension as ObjectId, we need to look up by extension reference
14
+ // For now, we'll return null and let the service handle this differently
15
+ this.logger.info('findByOrgAndId called with extensionSlug, but we store extension ObjectIds', {
16
+ orgId,
15
17
  extensionSlug
16
18
  });
17
- return extension?.toObject();
19
+ return null;
18
20
  } catch (error) {
19
- this.logger.error('Error in findByTenantAndId', {
21
+ this.logger.error('Error in findByOrgAndId', {
20
22
  error,
21
- tenantId,
23
+ orgId,
22
24
  extensionSlug
23
25
  });
24
26
  return null;
25
27
  }
26
28
  }
29
+ async findByOrgAndExtensionId(organizationId, extensionId) {
30
+ try {
31
+ // Convert organizationId string to ObjectId for organization field lookup
32
+ return await this.get({
33
+ organization: new mongoose.Types.ObjectId(organizationId),
34
+ extension: new mongoose.Types.ObjectId(extensionId)
35
+ });
36
+ } catch (error) {
37
+ this.logger.error('Error in findByOrgAndExtensionId', {
38
+ error,
39
+ organizationId,
40
+ extensionId
41
+ });
42
+ return null;
43
+ }
44
+ }
27
45
  async countExtensions(filter) {
28
46
  try {
29
47
  const mongoQuery = {};
30
- if (filter.tenantId) {
31
- mongoQuery.tenantId = filter.tenantId;
32
- }
33
- if (filter.extensionSlug) {
34
- mongoQuery.extensionSlug = filter.extensionSlug;
48
+ if (filter.orgId) {
49
+ // Convert orgId string to ObjectId for organization field lookup
50
+ mongoQuery.organization = new mongoose.Types.ObjectId(filter.orgId);
35
51
  }
36
52
  if (filter.status) {
37
53
  mongoQuery.status = Array.isArray(filter.status) ? {
@@ -52,7 +68,7 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
52
68
  if (filter.installedBy) {
53
69
  mongoQuery.installedBy = filter.installedBy;
54
70
  }
55
- return await this.model.countDocuments(mongoQuery);
71
+ return await this.count(mongoQuery);
56
72
  } catch (error) {
57
73
  this.logger.error('Error in countExtensions', {
58
74
  error,
@@ -69,9 +85,10 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
69
85
  this.logger.trace('Creating installed extension with params (%j)', input);
70
86
  const extensionData = {
71
87
  ...input,
72
- tenantId: input.tenantId,
88
+ organization: new mongoose.Types.ObjectId(input.orgId),
89
+ // Convert orgId to ObjectId for organization field
73
90
  extension: input.extensionId,
74
- // Store extensionSlug directly since it's a string
91
+ // Store ObjectId reference to extension registry
75
92
  installedBy: new mongoose.Types.ObjectId(input.installedBy),
76
93
  installedAt: new Date(),
77
94
  status: 'installed',
@@ -110,8 +127,7 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
110
127
  }
111
128
  }]
112
129
  };
113
- const extension = await this.model.create(extensionData);
114
- return extension.toObject();
130
+ return await this.create(extensionData);
115
131
  } catch (error) {
116
132
  this.logger.error('Error creating installed extension', {
117
133
  error,
@@ -123,63 +139,85 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
123
139
  /**
124
140
  * Update an existing installed extension
125
141
  */
126
- async updateExtension(tenantId, extensionSlug, update) {
142
+ async updateExtension(orgId, extensionId, update) {
127
143
  try {
128
- const extension = await this.model.findOneAndUpdate({
129
- tenantId,
130
- extensionSlug
131
- }, {
132
- $set: {
133
- ...update,
134
- lastUpdated: new Date(),
135
- ...(update.lastUpdatedBy && {
136
- lastUpdatedBy: new mongoose.Types.ObjectId(update.lastUpdatedBy)
137
- })
138
- }
144
+ const updateData = {
145
+ ...update,
146
+ lastUpdated: new Date(),
147
+ ...(update.lastUpdatedBy && {
148
+ lastUpdatedBy: new mongoose.Types.ObjectId(update.lastUpdatedBy)
149
+ })
150
+ };
151
+ return await this.update({
152
+ organization: new mongoose.Types.ObjectId(orgId),
153
+ extension: new mongoose.Types.ObjectId(extensionId)
139
154
  }, {
140
- new: true
155
+ $set: updateData
141
156
  });
142
- return extension?.toObject();
143
157
  } catch (error) {
144
158
  this.logger.error('Error updating installed extension', {
145
159
  error,
146
- tenantId,
147
- extensionSlug
160
+ orgId,
161
+ extensionId
148
162
  });
149
163
  throw error;
150
164
  }
151
165
  }
152
166
  /**
153
- * Find a specific installed extension
167
+ * Find a specific installed extension by organization and extension ObjectIds
154
168
  */
155
- async findOne(tenantId, extensionSlug) {
169
+ async findOne(orgId, extensionId) {
156
170
  try {
157
- const extension = await this.model.findOne({
158
- tenantId,
159
- extensionSlug
171
+ return await this.get({
172
+ organization: new mongoose.Types.ObjectId(orgId),
173
+ extension: new mongoose.Types.ObjectId(extensionId)
160
174
  });
161
- return extension?.toObject();
162
175
  } catch (error) {
163
176
  this.logger.error('Error finding installed extension', {
164
177
  error,
165
- tenantId,
166
- extensionSlug
178
+ orgId,
179
+ extensionId
167
180
  });
168
181
  return null;
169
182
  }
170
183
  }
184
+ /**
185
+ * Find all installed extensions for a specific extension ObjectId
186
+ */
187
+ async findByExtensionId(extensionId) {
188
+ try {
189
+ const mongoQuery = {
190
+ extension: new mongoose.Types.ObjectId(extensionId)
191
+ };
192
+ const extensions = await this.model.find(mongoQuery).exec();
193
+ return extensions.map(ext => ext.toJSON({
194
+ virtuals: true
195
+ }));
196
+ } catch (error) {
197
+ this.logger.error('Error finding installed extensions by extensionId', {
198
+ error,
199
+ extensionId
200
+ });
201
+ return [];
202
+ }
203
+ }
171
204
  /**
172
205
  * Find installed extensions with optional filtering
206
+ * Uses BaseMongoRepository getAll with population to ensure proper _id to id transformation
173
207
  */
174
208
  async findExtensions(query) {
175
209
  try {
176
210
  const mongoQuery = {};
177
- if (query.tenantId) {
178
- mongoQuery.tenantId = query.tenantId;
211
+ // Handle organization-based queries (preferred)
212
+ if (query.orgId) {
213
+ mongoQuery.organization = new mongoose.Types.ObjectId(query.orgId);
179
214
  }
180
- if (query.extensionSlug) {
181
- mongoQuery.extensionSlug = query.extensionSlug;
215
+ // Support accountId as a fallback mapping to organization for backward compatibility
216
+ else if (query.accountId) {
217
+ mongoQuery.organization = new mongoose.Types.ObjectId(query.accountId);
182
218
  }
219
+ // Skip extensionSlug filtering at repository level since we store extension as ObjectId
220
+ // The GraphQL field resolver will handle mapping extension ObjectId to extension details
183
221
  if (query.status) {
184
222
  mongoQuery.status = Array.isArray(query.status) ? {
185
223
  $in: query.status
@@ -199,8 +237,12 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
199
237
  if (query.installedBy) {
200
238
  mongoQuery.installedBy = query.installedBy;
201
239
  }
202
- const extensions = await this.model.find(mongoQuery);
203
- return extensions.map(ext => ext.toObject());
240
+ // Use BaseMongoRepository getAll with population
241
+ // This ensures proper _id to id transformation through virtual fields
242
+ const extensions = await this.model.find(mongoQuery).exec();
243
+ return extensions.map(ext => ext.toJSON({
244
+ virtuals: true
245
+ }));
204
246
  } catch (error) {
205
247
  this.logger.error('Error finding installed extensions', {
206
248
  error,
@@ -212,18 +254,17 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
212
254
  /**
213
255
  * Delete an installed extension
214
256
  */
215
- async deleteExtension(tenantId, extensionSlug) {
257
+ async deleteExtension(orgId, extensionId) {
216
258
  try {
217
- const result = await this.model.deleteOne({
218
- tenantId,
219
- extensionSlug
259
+ return await this.delete({
260
+ organization: new mongoose.Types.ObjectId(orgId),
261
+ extension: new mongoose.Types.ObjectId(extensionId)
220
262
  });
221
- return result.deletedCount > 0;
222
263
  } catch (error) {
223
264
  this.logger.error('Error deleting installed extension', {
224
265
  error,
225
- tenantId,
226
- extensionSlug
266
+ orgId,
267
+ extensionId
227
268
  });
228
269
  return false;
229
270
  }
@@ -234,8 +275,8 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
234
275
  async findWithRegistryInfo(query) {
235
276
  try {
236
277
  const mongoQuery = {};
237
- if (query.tenantId) {
238
- mongoQuery.tenantId = query.tenantId;
278
+ if (query.orgId) {
279
+ mongoQuery.organization = new mongoose.Types.ObjectId(query.orgId);
239
280
  }
240
281
  const pipeline = [{
241
282
  $match: mongoQuery
@@ -263,20 +304,23 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
263
304
  }
264
305
  }
265
306
  /**
266
- * Check if extension exists for tenant
307
+ * Check if extension exists for organization
267
308
  */
268
- async exists(tenantId, extensionSlug) {
309
+ async exists(extensionId, orgId) {
269
310
  try {
270
- const count = await this.model.countDocuments({
271
- tenantId,
272
- extensionSlug
273
- });
311
+ const query = orgId ? {
312
+ organization: new mongoose.Types.ObjectId(orgId),
313
+ extension: new mongoose.Types.ObjectId(extensionId)
314
+ } : {
315
+ extension: new mongoose.Types.ObjectId(extensionId)
316
+ };
317
+ const count = await this.count(query);
274
318
  return count > 0;
275
319
  } catch (error) {
276
320
  this.logger.error('Error checking extension existence', {
277
321
  error,
278
- tenantId,
279
- extensionSlug
322
+ orgId,
323
+ extensionId
280
324
  });
281
325
  return false;
282
326
  }
@@ -311,10 +355,12 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
311
355
  try {
312
356
  const extensions = await this.model.find({
313
357
  tenantId
314
- });
315
- const extensionObjects = extensions.map(ext => ext.toObject());
358
+ }).populate(DB_COLL_NAMES.ExtensionRegistries).exec();
359
+ const extensionObjects = extensions.map(ext => ext.toJSON({
360
+ virtuals: true
361
+ }));
316
362
  const dependencies = extensionObjects.map(ext => ({
317
- extensionSlug: ext.extension?.toString() || '',
363
+ extensionId: ext.extension?.toString() || '',
318
364
  dependsOn: ext.dependencies || [],
319
365
  dependents: ext.dependents || []
320
366
  }));
@@ -336,18 +382,18 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
336
382
  /**
337
383
  * Count installed extensions matching query
338
384
  */
339
- async count(query) {
385
+ async countByQuery(query) {
340
386
  try {
341
387
  const mongoQuery = {};
342
- if (query.tenantId) {
343
- mongoQuery.tenantId = query.tenantId;
388
+ if (query.orgId) {
389
+ mongoQuery.organization = new mongoose.Types.ObjectId(query.orgId);
344
390
  }
345
391
  if (query.status) {
346
392
  mongoQuery.status = Array.isArray(query.status) ? {
347
393
  $in: query.status
348
394
  } : query.status;
349
395
  }
350
- return await this.model.countDocuments(mongoQuery);
396
+ return await this.count(mongoQuery);
351
397
  } catch (error) {
352
398
  this.logger.error('Error counting extensions', {
353
399
  error,
@@ -367,8 +413,10 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
367
413
  'lifecycle.lastRegistryCheck': {
368
414
  $lt: staleDate.toISOString()
369
415
  }
370
- });
371
- return extensions.map(ext => ext.toObject());
416
+ }).exec();
417
+ return extensions.map(ext => ext.toJSON({
418
+ virtuals: true
419
+ }));
372
420
  } catch (error) {
373
421
  this.logger.error('Error finding stale extensions', {
374
422
  error,
@@ -386,8 +434,8 @@ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,opti
386
434
  const bulkOps = updates.map(update => ({
387
435
  updateOne: {
388
436
  filter: {
389
- tenantId: update.tenantId,
390
- extensionSlug: update.extensionSlug
437
+ tenantId: update.orgId,
438
+ extensionSlug: update.extensionId
391
439
  },
392
440
  update: {
393
441
  $set: {
@@ -1 +1 @@
1
- {"version":3,"file":"installed-extension-repository.js","sources":["../../../src/store/repositories/installed-extension-repository.ts"],"sourcesContent":[null],"names":[],"mappings":"kUAqBqC,IAAA,4BAAa,GAAA,MACxB,4BACyB,SAAG,mBAAG,CAAA;AAS/C,EAAA,WAAA,CAAA,EAAA,EAAA,MACM,EAAA,OAAQ,EAAA;IAYd,KAAe,CAAA,2BAAS,EAAA,EAAA,EAAA,MAAA,EAAA,OAAmC,CAAA;AAiCjE,IAAA,IAAA,CAAA,EAAA,EAAA;;AAEG;IACU,IAAe,CAAA,MAAA,GAAA,MACnB,CAAA,KAAgC,CAAA;AAyDzC,MAAA,SAAA,EAAA;;AAEG;QACyB,0BACd,EAAM,aACH,EAAA;AA4BjB,IAAA,IAAA;;AAEG,QAAA,QAAA;AACU,QAAA;AAab,OAAA,CAAA;;AAEG,KAAA,CAAA,OAAA,KAAA,EAAA;AACU,MAAA,IAAA,CAAA,MAAA,CAAc,KAAC,CAAK,4BAA8B,EAAA;AA0C/D,QAAA,KAAA;;AAEG,QAAA;AACU,OAAA,CAAA;AAUb,MAAA,OAAA,IAAA;;AAEG;QAC8B,eAAA,CAAA,MAAM,EAAE;AAkCzC,IAAA,IAAA;;AAEG,MAAA,IAAA,MAAA,CAAA,QAAA,EAAA;AACU,QAAA,UAAO,CAAQ,QAAQ,GAAE,MAAA,CAAA,QAAe;AAUrD;;AAEG,QAAA,UAAA,CAAA,aAAA,GAAA,MAAA,CAAA,aAAA;;AAgBH,MAAA,IAAA,MAAA,CAAA,MAAA,EAAA;;AAEG,UAAA,GAAA,EAAA,MAAA,CAAA;AACU,SAAA,GAAA,MAAA,CAAA,MAA2B;AACpC;UACY,MAAA,CAAA,0BAAQ,CAAA,EAAA;kBACH,CAAA,0BAAS,CAAA,GAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,0BAAA,CAAA,CAAA,GAAA;aACb,EAAA,MAAA,CAAA,0BAAW;YACpB,MAAU,CAAA,0BAAW,CAAA;AACxB;MACH,IAAA,MAAA,CAAA,sBAAA,CAAA,KAAA,SAAA,EAAA;AAoBF,QAAA,UAAA,CAAA,sBAAA,CAAA,GAAA,MAAA,CAAA,sBAAA,CAAA;;AAEG,MAAA,IAAA,MAAA,CAAA,2BAAA,CAAA,KAAA,SAAA,EAAA;QACe,UAAQ,CAAA,2BAAmC,CAAA,GAAA,kCAAQ,CAAA;AAmBrE;;AAEG,QAAA,UAAA,CAAA,WAAA,GAAA,MAAA,CAAA,WAAA;AACU;AAkBb,MAAA,OAAA,MAAA,IAAA,CAAA,KAAA,CAAA,cAAA,CAAA,UAAA,CAAA;;AAEG,MAAA,IAAA,CAAA,MAAA,CAAA,KAAA,CAAA,0BAAA,EAAA;AACU,QAAA,KAAA;QAEL;QACA;aACc,CAAA;;;AAGjB;AA0BR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"installed-extension-repository.js","sources":["../../../src/store/repositories/installed-extension-repository.ts"],"sourcesContent":[null],"names":[],"mappings":"mWAiCU,IAAA,4BAA4B,qCAAkC,SAAY;AAe1E,EAAA,WAAA,CAAA,EAAA,EAAA,MAAA,EAAA,OACF,EAAA;IAeE,KAAA,CAAA,2BAAwB,EAAA,EAAA,EAAA,MAAA,EAAA,OAA4B,CAAA;AA+B1D,IAAA,IAAA,CAAA,EAAA,EAAA;;AAEG,IAAA;IACU,IAAA,CAAA,MAAA,GAAA,MACT,CAAK,KAAE,CAAA;AAwDX,MAAA,SAAA,EAAA;;AAEG,EAAA;QACU,oBACF,EAAA,aACP,EAAA;AAyBJ,IAAA,IAAA;;AAEG;AACU,MAAA,IAAA,CAAO,MAAM,CAAA,IAAE,CAAA;AAY5B,QAAA,KAAA;;AAEG,OAAA,CAAA;AACU,MAAA,OAAA,IAAA;AAab,IAAA,CAAA,CAAA,OAAA,KAAA,EAAA;;;AAGG,QAAA,KAAA;AACU,QAAA;AAgDb,OAAA,CAAA;;AAEG,IAAA;AACU,EAAA;AAYb,EAAA,MAAA,uBAAA,CAAA,cAAA,EAAA,WAAA,EAAA;;AAEG;MACU,OAAA,MAAA,IAAA,CAAoB;AAkCjC,QAAA,YAAA,EAAA,IAAA,QAAA,CAAA,KAAA,CAAA,QAAA,CAAA,cAAA,CAAA;;AAEG,OAAA,CAAA;AACU,IAAA,CAAA,CAAA,OAAO,KAAA,EAAA;AAgBpB,MAAA,IAAA,CAAA,MAAA,CAAA,KAAA,CAAA,kCAAA,EAAA;;AAEG,QAAA,cAAA;QACU;AAeb,OAAA,CAAA;;AAEG,IAAA;AACU,EAAA;AACT,EAAA,MAAA,eAAY,CAAA,MAAA,EAAY;QACxB;YACI,UAAA,GAAa;gBACb,CAAA,KAAS,EAAE;;AAEd,QAAA,UAAE,CAAA,YAAA,GAAA,IAAA,QAAA,CAAA,KAAA,CAAA,QAAA,CAAA,MAAA,CAAA,KAAA,CAAA;MACL;AAoBF,MAAA,IAAA,MAAA,CAAA,MAAA,EAAA;;AAEG,UAAA,GAAA,EAAA,MAAA,CAAA;SACU,GAAA,aAAoB;AAmBjC,MAAA;;AAEG,QAAA,UAAA,CAAA,0BAAA,CAAA,GAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,0BAAA,CAAA,CAAA,GAAA;AACU,UAAA,GAAA,EAAA,MAAA,CAAA,0BAEH;AAkBV,SAAA,GAAA,MAAA,CAAA,0BAAA,CAAA;;AAEG,MAAA,IAAA,MAAA,CAAA,sBAAA,CAAA,KAAA,SAAA,EAAA;AACU,QAAA,UAAA,CAAA,sBACM,CAAA,GAAA,MAAA,CAAA,sBAAA,CAAA;;UAEX,MAAA,CAAA,2BAAoB,CAAA,KAAA,SAAA,EAAA;QACpB,UAAA,CAAA,2BAAuB,CAAA,GAAA,MAAA,CAAA,2BAAA,CAAA;;UAEvB,MAAA,CAAA,WAAoB,EAAA;AACvB,QAAC,UACK,CAAA,WAAK,GAAA,MAAA,CAAA,WAAA;AAyBnB,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=publisher-analytics-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-analytics-repository.d.ts","sourceRoot":"","sources":["../../../src/store/repositories/publisher-analytics-repository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import * as mongoose from 'mongoose';
2
+ import { CdmLogger } from '@cdm-logger/core';
3
+ import { BaseMongoRepository } from '@common-stack/store-mongo';
4
+ import { AsDomainType, IMarketplacePublisherRepository, IMarketplacePublisherModel } from 'common/server';
5
+ export declare class MarketplacePublisherRepository extends BaseMongoRepository<IMarketplacePublisherModel> implements IMarketplacePublisherRepository {
6
+ constructor(db: mongoose.Connection, logger: CdmLogger.ILogger, options?: unknown);
7
+ findByPublisherName(publisherName: string): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
8
+ findPublishers(search?: string, orderBy?: string, orderDirection?: 'ASC' | 'DESC', limit?: number, offset?: number): Promise<{
9
+ publishers: AsDomainType<IMarketplacePublisherModel>[];
10
+ totalCount: number;
11
+ }>;
12
+ updatePublisherStats(publisherId: string, stats: {
13
+ extensionCount?: number;
14
+ totalInstalls?: number;
15
+ averageRating?: number;
16
+ }): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
17
+ verifyPublisher(publisherId: string): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
18
+ }
19
+ //# sourceMappingURL=publisher-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-repository.d.ts","sourceRoot":"","sources":["../../../src/store/repositories/publisher-repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAG1G,qBACa,8BACT,SAAQ,mBAAmB,CAAC,0BAA0B,CACtD,YAAW,+BAA+B;gBAGT,EAAE,EAAE,QAAQ,CAAC,UAAU,EAClC,MAAM,EAAE,SAAS,CAAC,OAAO,EACP,OAAO,CAAC,EAAE,OAAO;IAS5C,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,0BAA0B,CAAC,GAAG,IAAI,CAAC;IAKpG,cAAc,CACvB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,SAAc,EACrB,cAAc,GAAE,KAAK,GAAG,MAAe,EACvC,KAAK,SAAK,EACV,MAAM,SAAI,GACX,OAAO,CAAC;QACP,UAAU,EAAE,YAAY,CAAC,0BAA0B,CAAC,EAAE,CAAC;QACvD,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;IA2CW,oBAAoB,CAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KAC1B,GACF,OAAO,CAAC,YAAY,CAAC,0BAA0B,CAAC,GAAG,IAAI,CAAC;IAkB9C,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,0BAA0B,CAAC,GAAG,IAAI,CAAC;CAa9G"}
@@ -0,0 +1,87 @@
1
+ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject,optional}from'inversify';import*as mongoose from'mongoose';import'@cdm-logger/core';import {BaseMongoRepository}from'@common-stack/store-mongo';import'../models/installed-extension-model.js';import {PublisherModelFunc}from'../models/publisher-model.js';var MarketplacePublisherRepository_1;
2
+ let MarketplacePublisherRepository = MarketplacePublisherRepository_1 = class MarketplacePublisherRepository extends BaseMongoRepository {
3
+ constructor(db, logger, options) {
4
+ super(PublisherModelFunc, db, logger, options);
5
+ if (!db) {
6
+ throw new Error('MongoDB connection is not provided');
7
+ }
8
+ this.logger = logger.child({
9
+ className: MarketplacePublisherRepository_1.name
10
+ });
11
+ }
12
+ async findByPublisherName(publisherName) {
13
+ this.logger.trace('findByPublisherName with publisherName [%s]', publisherName);
14
+ return this.model.findOne({
15
+ name: publisherName.toLowerCase()
16
+ }).exec();
17
+ }
18
+ async findPublishers(search, orderBy = 'createdAt', orderDirection = 'DESC', limit = 20, offset = 0) {
19
+ this.logger.trace('findPublishers with limit [%d], offset [%d], search [%s]', limit, offset, search);
20
+ const query = this.model.find();
21
+ // Apply search filter
22
+ if (search && search.trim()) {
23
+ const searchRegex = new RegExp(search.trim(), 'i');
24
+ query.or([{
25
+ displayName: searchRegex
26
+ }, {
27
+ publisherName: searchRegex
28
+ }, {
29
+ description: searchRegex
30
+ }]);
31
+ }
32
+ // Get total count for pagination
33
+ const totalCount = await this.model.countDocuments(query.getQuery()).exec();
34
+ // Apply ordering
35
+ const sortDirection = orderDirection === 'ASC' ? 1 : -1;
36
+ let sortField;
37
+ if (orderBy === 'displayName') {
38
+ sortField = 'displayName';
39
+ } else if (orderBy === 'extensionCount') {
40
+ sortField = 'extensionCount';
41
+ } else if (orderBy === 'totalInstalls') {
42
+ sortField = 'totalInstalls';
43
+ } else if (orderBy === 'averageRating') {
44
+ sortField = 'averageRating';
45
+ } else {
46
+ sortField = 'createdAt';
47
+ }
48
+ query.sort({
49
+ [sortField]: sortDirection
50
+ });
51
+ // Apply pagination
52
+ query.skip(offset).limit(limit);
53
+ const publishers = await query.exec();
54
+ return {
55
+ publishers,
56
+ totalCount
57
+ };
58
+ }
59
+ async updatePublisherStats(publisherId, stats) {
60
+ this.logger.trace('updatePublisherStats for publisher [%s] with stats [%j]', publisherId, stats);
61
+ const updateData = {
62
+ updatedAt: new Date()
63
+ };
64
+ if (stats.extensionCount !== undefined) {
65
+ updateData.extensionCount = stats.extensionCount;
66
+ }
67
+ if (stats.totalInstalls !== undefined) {
68
+ updateData.totalInstalls = stats.totalInstalls;
69
+ }
70
+ if (stats.averageRating !== undefined) {
71
+ updateData.averageRating = Math.max(0, Math.min(5, stats.averageRating)); // Clamp between 0-5
72
+ }
73
+ return this.model.findByIdAndUpdate(publisherId, updateData, {
74
+ new: true
75
+ }).exec();
76
+ }
77
+ async verifyPublisher(publisherId) {
78
+ this.logger.trace('verifyPublisher with publisherId [%s]', publisherId);
79
+ return this.model.findByIdAndUpdate(publisherId, {
80
+ verified: true,
81
+ updatedAt: new Date()
82
+ }, {
83
+ new: true
84
+ }).exec();
85
+ }
86
+ };
87
+ MarketplacePublisherRepository = MarketplacePublisherRepository_1 = __decorate([injectable(), __param(0, inject('MongoDBConnection')), __param(1, inject('Logger')), __param(2, inject('MongoOptions')), __param(2, optional()), __metadata("design:paramtypes", [mongoose.Connection, Object, Object])], MarketplacePublisherRepository);export{MarketplacePublisherRepository};//# sourceMappingURL=publisher-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-repository.js","sources":["../../../src/store/repositories/publisher-repository.ts"],"sourcesContent":[null],"names":[],"mappings":"yUACA,IAAA,gCAAoC;IA4BnB,8BACM,GACf,gCACc,SAAO,8BAErB,SAAM,mBACC,CAAA;AACP,EAAA,WAAA,CAAA,EAAA,EAAU,MAAE,EAAA,OAAa,EAAA;SACzB,CAAA,kBAAmB,EAAA,EAAA,EAAA,MAAA,EAAA,OAAA,CAAA;QACrB,CAAA,EAAA,EAAA;AA2CW,MAAA,MAAA,IAAA,KAAA,CAAA,oCAEF,CAAA;;QAEH,CAAA,MAAA,GAAA,MAAgB,CAAA,KAAM,CAAC;eACvB,EAAA,gCAAuB,CAAA;KAC1B,CAAA;AAmBQ,EAAA;AAahB,EAAA,MAAA,mBAAA,CAAA,aAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  export const DB_COLL_NAMES = {
2
2
  // from package: marketplace-server
3
- ExtensionRegistries: 'extensions',
4
3
  InstalledExtensions: 'installed_extensions',
4
+ MarketplacePublisher: 'marketplace_publishers',
5
5
  };
@@ -1,9 +1,12 @@
1
-
2
1
  export const SERVER_TYPES = {
3
- IExtensionMongoConnection: Symbol('ExtensionMongoConnection'),
4
- IRegistryExtensionService: Symbol('IRegistryExtensionService'),
5
- IRegistryExtensionRepository: Symbol('IRegistryExtensionRepository'),
6
- IRegistryExtensionDataLoader: Symbol('IRegistryExtensionDataLoader'),
2
+
7
3
  IInstalledExtensionService: Symbol('IInstalledExtensionService'),
8
4
  IInstalledExtensionRepository: Symbol('IInstalledExtensionRepository'),
5
+ IMarketplacePublisherService: Symbol('IMarketplacePublisherService'),
6
+ IMarketplacePublisherRepository: Symbol('IMarketplacePublisherRepository'),
7
+ IPublisherEventService: Symbol('IPublisherEventService'),
8
+ // Extension Gallery Services
9
+ IExtensionGalleryService: Symbol.for('IExtensionGalleryService'),
10
+ IExtensionGalleryRepository: Symbol.for('IExtensionGalleryRepository'),
11
+ ExtensionGalleryDataLoader: Symbol.for('ExtensionGalleryDataLoader'),
9
12
  };
@@ -0,0 +1,44 @@
1
+ // from package: marketplace-server
2
+ import { IGalleryExtension } from 'common/server';
3
+
4
+ /**
5
+ * Gallery query result interface for repository operations
6
+ */
7
+ export interface IGalleryQueryResult {
8
+ results: IGalleryExtension[];
9
+ total: number;
10
+ pageSize: number;
11
+ }
12
+
13
+ /**
14
+ * Extension asset interface
15
+ */
16
+ export interface IExtensionAsset {
17
+ uri: string;
18
+ fallbackUri?: string;
19
+ }
20
+
21
+ /**
22
+ * Repository interface for ExtensionGallery data access
23
+ */
24
+ export interface IExtensionGalleryRepository {
25
+ /**
26
+ * Get asset content for an extension
27
+ */
28
+ asset<T>(extensionSlug: string, version: string, asset: string): Promise<T>;
29
+
30
+ /**
31
+ * Get extensions by ID
32
+ */
33
+ get(id: string, fields: string[]): Promise<IGalleryExtension[]>;
34
+
35
+ /**
36
+ * Download an extension
37
+ */
38
+ download(extension: IGalleryExtension): Promise<boolean>;
39
+
40
+ /**
41
+ * Query extensions
42
+ */
43
+ query(query: Record<string, unknown>): Promise<IGalleryQueryResult>;
44
+ }
@@ -18,25 +18,30 @@ export interface IInstalledExtensionRepository extends IBaseMongoRepository<IIns
18
18
  * Update an existing installed extension
19
19
  */
20
20
  updateExtension(
21
- tenantId: string,
22
- extensionSlug: string,
21
+ orgId: string,
22
+ extensionId: string,
23
23
  update: IUpdateInstalledExtensionInput,
24
24
  ): Promise<AsDomainType<IInstalledExtensionModel> | null>;
25
25
 
26
26
  /**
27
- * Find a specific installed extension
27
+ * Find a specific installed extension by organization and extension ObjectIds
28
28
  */
29
- findByTenantAndId(tenantId: string, extensionSlug: string): Promise<AsDomainType<IInstalledExtensionModel> | null>;
29
+ findByOrgAndExtensionId(orgId: string, extensionId: string): Promise<AsDomainType<IInstalledExtensionModel> | null>;
30
30
 
31
31
  /**
32
32
  * Find installed extensions with optional filtering
33
33
  */
34
34
  findExtensions(filter: IInstalledExtensionFilter): Promise<AsDomainType<IInstalledExtensionModel>[]>;
35
35
 
36
+ /**
37
+ * Find all installed extensions for a specific extension ObjectId
38
+ */
39
+ findByExtensionId(extensionId: string): Promise<AsDomainType<IInstalledExtensionModel>[]>;
40
+
36
41
  /**
37
42
  * Delete an installed extension
38
43
  */
39
- deleteExtension(tenantId: string, extensionSlug: string): Promise<boolean>;
44
+ deleteExtension(orgId: string, extensionId: string): Promise<boolean>;
40
45
 
41
46
  /**
42
47
  * Get installed extensions joined with registry information
@@ -44,26 +49,26 @@ export interface IInstalledExtensionRepository extends IBaseMongoRepository<IIns
44
49
  findWithRegistryInfo(filter: IInstalledExtensionFilter): Promise<any[]>;
45
50
 
46
51
  /**
47
- * Check if extension exists for tenant
52
+ * Check if extension exists for organization
48
53
  */
49
- exists(tenantId: string, extensionSlug: string): Promise<boolean>;
54
+ exists(orgId: string, extensionId: string): Promise<boolean>;
50
55
 
51
56
  /**
52
57
  * Bulk update multiple extensions (useful for policy changes or admin actions)
53
58
  */
54
59
  bulkUpdateExtensions(
55
- tenantId: string,
60
+ orgId: string,
56
61
  filter: Partial<IInstalledExtensionFilter>,
57
62
  update: Partial<IUpdateInstalledExtensionInput>,
58
63
  ): Promise<number>;
59
64
 
60
65
  /**
61
- * Get extension dependency graph for a tenant
66
+ * Get extension dependency graph for an organization
62
67
  */
63
- getDependencyGraph(tenantId: string): Promise<{
68
+ getDependencyGraph(orgId: string): Promise<{
64
69
  extensions: AsDomainType<IInstalledExtensionModel>[];
65
70
  dependencies: Array<{
66
- extensionSlug: string;
71
+ extensionId: string;
67
72
  dependsOn: string[];
68
73
  dependents: string[];
69
74
  }>;
@@ -77,15 +82,15 @@ export interface IInstalledExtensionRepository extends IBaseMongoRepository<IIns
77
82
  /**
78
83
  * Find extensions that need registry sync (stale registry status)
79
84
  */
80
- findStaleExtensions(tenantId: string, maxAge: number): Promise<AsDomainType<IInstalledExtensionModel>[]>;
85
+ findStaleExtensions(orgId: string, maxAge: number): Promise<AsDomainType<IInstalledExtensionModel>[]>;
81
86
 
82
87
  /**
83
88
  * Update registry status for multiple extensions
84
89
  */
85
90
  syncRegistryStatus(
86
91
  updates: Array<{
87
- tenantId: string;
88
- extensionSlug: string;
92
+ orgId: string;
93
+ extensionId: string;
89
94
  registryStatus: string;
90
95
  latestVersion?: string;
91
96
  isOrphaned: boolean;