@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.
- package/lib/containers/module.d.ts +4 -4
- package/lib/containers/module.d.ts.map +1 -1
- package/lib/containers/module.js +12 -7
- package/lib/containers/module.js.map +1 -1
- package/lib/dataloaders/index.d.ts +1 -1
- package/lib/dataloaders/index.d.ts.map +1 -1
- package/lib/dataloaders/publisher-data-loader.d.ts +6 -0
- package/lib/dataloaders/publisher-data-loader.d.ts.map +1 -0
- package/lib/demo/test-graphql-examples.d.ts +73 -0
- package/lib/demo/test-graphql-examples.d.ts.map +1 -0
- package/lib/graphql/resolvers/form-templates-resolver.d.ts +220 -0
- package/lib/graphql/resolvers/form-templates-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/form-templates-resolver.js +170 -0
- package/lib/graphql/resolvers/form-templates-resolver.js.map +1 -0
- package/lib/graphql/resolvers/gallery-resolver.d.ts +15 -0
- package/lib/graphql/resolvers/gallery-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/gallery-resolver.js +35 -0
- package/lib/graphql/resolvers/gallery-resolver.js.map +1 -0
- package/lib/graphql/resolvers/index.d.ts +247 -1
- package/lib/graphql/resolvers/index.d.ts.map +1 -1
- package/lib/graphql/resolvers/index.js +1 -1
- package/lib/graphql/resolvers/installed-extension-resolver.d.ts.map +1 -1
- package/lib/graphql/resolvers/installed-extension-resolver.js +161 -35
- package/lib/graphql/resolvers/installed-extension-resolver.js.map +1 -1
- package/lib/graphql/resolvers/marketplace-form-resolver.d.ts +13 -0
- package/lib/graphql/resolvers/marketplace-form-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/marketplace-form-resolver.js +90 -0
- package/lib/graphql/resolvers/marketplace-form-resolver.js.map +1 -0
- package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts +14 -0
- package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/publisher-analytics-resolver.js +221 -0
- package/lib/graphql/resolvers/publisher-analytics-resolver.js.map +1 -0
- package/lib/graphql/resolvers/publisher-resolver.d.ts +5 -0
- package/lib/graphql/resolvers/publisher-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/publisher-resolver.js +183 -0
- package/lib/graphql/resolvers/publisher-resolver.js.map +1 -0
- package/lib/graphql/resolvers/registry-extension-resolver.d.ts.map +1 -1
- package/lib/graphql/resolvers/registry-extension-resolver.js +34 -167
- package/lib/graphql/resolvers/registry-extension-resolver.js.map +1 -1
- package/lib/graphql/schemas/extension-pricing.graphql +546 -0
- package/lib/graphql/schemas/extension-pricing.graphql.js +1 -0
- package/lib/graphql/schemas/extension-pricing.graphql.js.map +1 -0
- package/lib/graphql/schemas/extension-registry.graphql +91 -58
- package/lib/graphql/schemas/extension-registry.graphql.js +1 -1
- package/lib/graphql/schemas/form-templates.graphql +269 -0
- package/lib/graphql/schemas/form-templates.graphql.js +1 -0
- package/lib/graphql/schemas/form-templates.graphql.js.map +1 -0
- package/lib/graphql/schemas/gallery-schema.graphql +247 -0
- package/lib/graphql/schemas/gallery-schema.graphql.js +1 -0
- package/lib/graphql/schemas/gallery-schema.graphql.js.map +1 -0
- package/lib/graphql/schemas/index.d.ts.map +1 -1
- package/lib/graphql/schemas/index.js +3 -1
- package/lib/graphql/schemas/index.js.map +1 -1
- package/lib/graphql/schemas/installed-extension.graphql +37 -7
- package/lib/graphql/schemas/installed-extension.graphql.js +1 -1
- package/lib/graphql/schemas/publisher-analytics.graphql +305 -0
- package/lib/graphql/schemas/publisher-analytics.graphql.js +1 -0
- package/lib/graphql/schemas/publisher-analytics.graphql.js.map +1 -0
- package/lib/graphql/schemas/publisher.graphql +584 -0
- package/lib/graphql/schemas/publisher.graphql.js +1 -0
- package/lib/graphql/schemas/publisher.graphql.js.map +1 -0
- package/lib/graphql/schemas/service.graphql +15 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts +20 -0
- package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts.map +1 -0
- package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js +61 -0
- package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js.map +1 -0
- package/lib/migrations/index.d.ts +2 -0
- package/lib/migrations/index.d.ts.map +1 -0
- package/lib/module.d.ts +1 -1
- package/lib/module.d.ts.map +1 -1
- package/lib/module.js +11 -26
- package/lib/module.js.map +1 -1
- package/lib/services/extension-gallery-repository.d.ts +17 -0
- package/lib/services/extension-gallery-repository.d.ts.map +1 -0
- package/lib/services/extension-gallery-repository.js +192 -0
- package/lib/services/extension-gallery-repository.js.map +1 -0
- package/lib/services/extension-gallery-service-new.d.ts +39 -0
- package/lib/services/extension-gallery-service-new.d.ts.map +1 -0
- package/lib/services/extension-gallery-service.d.ts +30 -0
- package/lib/services/extension-gallery-service.d.ts.map +1 -0
- package/lib/services/extension-gallery-service.js +334 -0
- package/lib/services/extension-gallery-service.js.map +1 -0
- package/lib/services/index.d.ts +4 -1
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/installed-extension-service-ext.d.ts +5 -2
- package/lib/services/installed-extension-service-ext.d.ts.map +1 -1
- package/lib/services/installed-extension-service-ext.js +364 -117
- package/lib/services/installed-extension-service-ext.js.map +1 -1
- package/lib/services/installed-extension-service.d.ts +30 -13
- package/lib/services/installed-extension-service.d.ts.map +1 -1
- package/lib/services/installed-extension-service.js +301 -68
- package/lib/services/installed-extension-service.js.map +1 -1
- package/lib/services/installed-extension-service.test.d.ts +0 -1
- package/lib/services/publisher-analytics-service.d.ts +128 -0
- package/lib/services/publisher-analytics-service.d.ts.map +1 -0
- package/lib/services/publisher-event-service.d.ts +48 -0
- package/lib/services/publisher-event-service.d.ts.map +1 -0
- package/lib/services/publisher-event-service.js +296 -0
- package/lib/services/publisher-event-service.js.map +1 -0
- package/lib/services/publisher-service-context.d.ts +1 -0
- package/lib/services/publisher-service-context.d.ts.map +1 -0
- package/lib/services/publisher-service.d.ts +62 -0
- package/lib/services/publisher-service.d.ts.map +1 -0
- package/lib/services/publisher-service.js +135 -0
- package/lib/services/publisher-service.js.map +1 -0
- package/lib/store/models/index.d.ts +1 -1
- package/lib/store/models/index.d.ts.map +1 -1
- package/lib/store/models/installed-extension-model.d.ts.map +1 -1
- package/lib/store/models/installed-extension-model.js +17 -45
- package/lib/store/models/installed-extension-model.js.map +1 -1
- package/lib/store/models/publisher-event-model.d.ts +11 -0
- package/lib/store/models/publisher-event-model.d.ts.map +1 -0
- package/lib/store/models/publisher-model.d.ts +5 -0
- package/lib/store/models/publisher-model.d.ts.map +1 -0
- package/lib/store/models/publisher-model.js +117 -0
- package/lib/store/models/publisher-model.js.map +1 -0
- package/lib/store/models/publisher-stats-model.d.ts +1 -0
- package/lib/store/models/publisher-stats-model.d.ts.map +1 -0
- package/lib/store/repositories/index.d.ts +1 -1
- package/lib/store/repositories/index.d.ts.map +1 -1
- package/lib/store/repositories/installed-extension-repository.d.ts +17 -11
- package/lib/store/repositories/installed-extension-repository.d.ts.map +1 -1
- package/lib/store/repositories/installed-extension-repository.js +123 -75
- package/lib/store/repositories/installed-extension-repository.js.map +1 -1
- package/lib/store/repositories/publisher-analytics-repository.d.ts +1 -0
- package/lib/store/repositories/publisher-analytics-repository.d.ts.map +1 -0
- package/lib/store/repositories/publisher-repository.d.ts +19 -0
- package/lib/store/repositories/publisher-repository.d.ts.map +1 -0
- package/lib/store/repositories/publisher-repository.js +87 -0
- package/lib/store/repositories/publisher-repository.js.map +1 -0
- package/lib/templates/constants/DB_COLL_NAMES.ts.template +1 -1
- package/lib/templates/constants/SERVER_TYPES.ts.template +8 -5
- package/lib/templates/repositories/ExtensionGalleryRepository.ts.template +44 -0
- package/lib/templates/repositories/InstalledExtensionRepository.ts.template +19 -14
- package/lib/templates/repositories/MarketplacePublisherRepository.ts.template +24 -0
- package/lib/templates/repositories/RegistryExtensionRepository.ts.template +2 -2
- package/lib/templates/services/ExtensionGalleryDataLoader.ts.template +2 -0
- package/lib/templates/services/ExtensionGalleryService.ts.template +79 -0
- package/lib/templates/services/InstalledExtensionService.ts.template +63 -32
- package/lib/templates/services/MarketplacePublisherService.ts.template +51 -0
- package/lib/templates/services/PublisherDataLoader.ts.template +3 -0
- package/lib/templates/services/PublisherEventService.ts.template +56 -0
- package/lib/templates/services/RegistryExtensionService.ts.template +46 -2
- package/lib/tests/extension-integration.test.d.ts +0 -1
- package/lib/tests/install-extension-graphql.test.d.ts +2 -0
- package/lib/tests/install-extension-graphql.test.d.ts.map +1 -0
- package/lib/utils/publisherValidation.d.ts +23 -0
- package/lib/utils/publisherValidation.d.ts.map +1 -0
- package/lib/utils/publisherValidation.js +144 -0
- package/lib/utils/publisherValidation.js.map +1 -0
- package/package.json +13 -9
- package/lib/constants/extension-events.d.ts +0 -136
- package/lib/constants/extension-events.d.ts.map +0 -1
- package/lib/dataloaders/registry-extension-data-loader.d.ts +0 -6
- package/lib/dataloaders/registry-extension-data-loader.d.ts.map +0 -1
- package/lib/dataloaders/registry-extension-data-loader.js +0 -6
- package/lib/dataloaders/registry-extension-data-loader.js.map +0 -1
- package/lib/graphql/schemas/service.graphql.js +0 -1
- package/lib/graphql/schemas/service.graphql.js.map +0 -1
- package/lib/services/extension-service.d.ts +0 -42
- package/lib/services/extension-service.d.ts.map +0 -1
- package/lib/services/extension-service.js +0 -60
- package/lib/services/extension-service.js.map +0 -1
- package/lib/store/models/registry-extension-model.d.ts +0 -5
- package/lib/store/models/registry-extension-model.d.ts.map +0 -1
- package/lib/store/models/registry-extension-model.js +0 -83
- package/lib/store/models/registry-extension-model.js.map +0 -1
- package/lib/store/repositories/registry-extension-repository.d.ts +0 -54
- package/lib/store/repositories/registry-extension-repository.d.ts.map +0 -1
- package/lib/store/repositories/registry-extension-repository.js +0 -137
- package/lib/store/repositories/registry-extension-repository.js.map +0 -1
- 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/
|
|
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
|
|
11
|
+
async findByOrgAndId(orgId, extensionSlug) {
|
|
12
12
|
try {
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
19
|
+
return null;
|
|
18
20
|
} catch (error) {
|
|
19
|
-
this.logger.error('Error in
|
|
21
|
+
this.logger.error('Error in findByOrgAndId', {
|
|
20
22
|
error,
|
|
21
|
-
|
|
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.
|
|
31
|
-
|
|
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.
|
|
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
|
-
|
|
88
|
+
organization: new mongoose.Types.ObjectId(input.orgId),
|
|
89
|
+
// Convert orgId to ObjectId for organization field
|
|
73
90
|
extension: input.extensionId,
|
|
74
|
-
// Store
|
|
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
|
-
|
|
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(
|
|
142
|
+
async updateExtension(orgId, extensionId, update) {
|
|
127
143
|
try {
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
147
|
-
|
|
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(
|
|
169
|
+
async findOne(orgId, extensionId) {
|
|
156
170
|
try {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
166
|
-
|
|
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
|
-
|
|
178
|
-
|
|
211
|
+
// Handle organization-based queries (preferred)
|
|
212
|
+
if (query.orgId) {
|
|
213
|
+
mongoQuery.organization = new mongoose.Types.ObjectId(query.orgId);
|
|
179
214
|
}
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
203
|
-
|
|
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(
|
|
257
|
+
async deleteExtension(orgId, extensionId) {
|
|
216
258
|
try {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
-
|
|
226
|
-
|
|
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.
|
|
238
|
-
mongoQuery.
|
|
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
|
|
307
|
+
* Check if extension exists for organization
|
|
267
308
|
*/
|
|
268
|
-
async exists(
|
|
309
|
+
async exists(extensionId, orgId) {
|
|
269
310
|
try {
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
279
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
385
|
+
async countByQuery(query) {
|
|
340
386
|
try {
|
|
341
387
|
const mongoQuery = {};
|
|
342
|
-
if (query.
|
|
343
|
-
mongoQuery.
|
|
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.
|
|
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.
|
|
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.
|
|
390
|
-
extensionSlug: update.
|
|
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":"
|
|
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,9 +1,12 @@
|
|
|
1
|
-
|
|
2
1
|
export const SERVER_TYPES = {
|
|
3
|
-
|
|
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
|
-
|
|
22
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
52
|
+
* Check if extension exists for organization
|
|
48
53
|
*/
|
|
49
|
-
exists(
|
|
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
|
-
|
|
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
|
|
66
|
+
* Get extension dependency graph for an organization
|
|
62
67
|
*/
|
|
63
|
-
getDependencyGraph(
|
|
68
|
+
getDependencyGraph(orgId: string): Promise<{
|
|
64
69
|
extensions: AsDomainType<IInstalledExtensionModel>[];
|
|
65
70
|
dependencies: Array<{
|
|
66
|
-
|
|
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(
|
|
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
|
-
|
|
88
|
-
|
|
92
|
+
orgId: string;
|
|
93
|
+
extensionId: string;
|
|
89
94
|
registryStatus: string;
|
|
90
95
|
latestVersion?: string;
|
|
91
96
|
isOrphaned: boolean;
|