@adminide-stack/marketplace-module-server 12.0.4-alpha.417 ā 12.0.4-alpha.423
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/graphql/resolvers/installed-extension-resolver.d.ts.map +1 -1
- package/lib/graphql/resolvers/installed-extension-resolver.js +20 -0
- package/lib/graphql/resolvers/installed-extension-resolver.js.map +1 -1
- package/lib/graphql/schemas/installed-extension.graphql +15 -0
- package/lib/graphql/schemas/installed-extension.graphql.js +1 -1
- package/lib/services/installed-extension-service-ext.d.ts.map +1 -1
- package/lib/services/installed-extension-service-ext.js +73 -40
- package/lib/services/installed-extension-service-ext.js.map +1 -1
- package/lib/services/installed-extension-service.d.ts +9 -0
- package/lib/services/installed-extension-service.d.ts.map +1 -1
- package/lib/services/installed-extension-service.js +79 -0
- package/lib/services/installed-extension-service.js.map +1 -1
- package/lib/templates/services/InstalledExtensionService.ts.template +12 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installed-extension-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAuB,UAAU,EAA0C,MAAM,eAAe,CAAC;AAExG,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,
|
|
1
|
+
{"version":3,"file":"installed-extension-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAuB,UAAU,EAA0C,MAAM,eAAe,CAAC;AAExG,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UAsXpE,CAAC"}
|
|
@@ -284,6 +284,26 @@ const resolver = (pubsub, logger) => ({
|
|
|
284
284
|
result,
|
|
285
285
|
message: args.dryRun ? 'Cleanup preview completed' : `Cleanup completed: ${result.removed.length} removed, ${result.deprecated.length} deprecated`
|
|
286
286
|
};
|
|
287
|
+
},
|
|
288
|
+
/**
|
|
289
|
+
* Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry
|
|
290
|
+
*/
|
|
291
|
+
async cleanupOrphanedExtensions(root, args, {
|
|
292
|
+
userContext,
|
|
293
|
+
installedExtensionService,
|
|
294
|
+
slugService
|
|
295
|
+
}) {
|
|
296
|
+
let orgId;
|
|
297
|
+
if (args.orgName) {
|
|
298
|
+
orgId = await slugService.resolveOrganizationSlug(args.orgName);
|
|
299
|
+
}
|
|
300
|
+
const result = await installedExtensionService.cleanupOrphanedExtensions(orgId, userContext.tenantId, args.dryRun || false);
|
|
301
|
+
return {
|
|
302
|
+
success: true,
|
|
303
|
+
removed: result.removed,
|
|
304
|
+
warnings: result.warnings,
|
|
305
|
+
message: args.dryRun ? `Preview: ${result.removed.length} orphaned extension(s) would be removed` : `Cleanup completed: ${result.removed.length} orphaned extension(s) removed`
|
|
306
|
+
};
|
|
287
307
|
}
|
|
288
308
|
}
|
|
289
309
|
});export{resolver};//# sourceMappingURL=installed-extension-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installed-extension-resolver.js","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"AAES,MAAA,QAAQ;AACjB,EAAA,kBAAoB,EAAA;AACpB,IAAA,YAA8B,EAAA,CAAU,IAA0C,EAAA,mBAAsB,KAAA;AAExG,MAAA,MAAA
|
|
1
|
+
{"version":3,"file":"installed-extension-resolver.js","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"AAES,MAAA,QAAQ;AACjB,EAAA,kBAAoB,EAAA;AACpB,IAAA,YAA8B,EAAA,CAAU,IAA0C,EAAA,mBAAsB,KAAA;AAExG,MAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -249,6 +249,16 @@ type ExtensionSyncResponse {
|
|
|
249
249
|
message: String!
|
|
250
250
|
}
|
|
251
251
|
|
|
252
|
+
"""
|
|
253
|
+
Response type for orphaned extension cleanup
|
|
254
|
+
"""
|
|
255
|
+
type OrphanedExtensionCleanupResponse {
|
|
256
|
+
success: Boolean!
|
|
257
|
+
message: String!
|
|
258
|
+
removed: [String!]!
|
|
259
|
+
warnings: [String!]!
|
|
260
|
+
}
|
|
261
|
+
|
|
252
262
|
extend type Query {
|
|
253
263
|
"""
|
|
254
264
|
Get all installed extensions for the current tenant
|
|
@@ -306,4 +316,9 @@ extend type Mutation {
|
|
|
306
316
|
Clean up deprecated or removed extensions
|
|
307
317
|
"""
|
|
308
318
|
cleanupExtensions(dryRun: Boolean): ExtensionCleanupResponse!
|
|
319
|
+
|
|
320
|
+
"""
|
|
321
|
+
Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry
|
|
322
|
+
"""
|
|
323
|
+
cleanupOrphanedExtensions(dryRun: Boolean, orgName: String): OrphanedExtensionCleanupResponse!
|
|
309
324
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var installedExtensionSchema = "\"\"\"\nInstalled extension status enumeration\n\"\"\"\nenum InstalledExtensionStatus {\n installed\n deprecated_installed\n suspended\n orphaned\n force_disabled\n}\n\n\"\"\"\nRegistry status cached from extensionRegistry\n\"\"\"\nenum ExtensionRegistryStatus {\n active\n deprecated\n suspended\n removed\n emergency_removed\n}\n\n\"\"\"\nRuntime activation state\n\"\"\"\nenum ExtensionActivationState {\n enabled\n disabled\n disabled_by_user\n disabled_by_admin\n disabled_by_policy\n}\n\n\"\"\"\nExtension lifecycle management information\n\"\"\"\ntype ExtensionLifecycle @entity(embedded: true) {\n registryStatus: ExtensionRegistryStatus! @column\n isOrphaned: Boolean! @column\n deprecationWarningShown: Boolean! @column\n autoUpdateBlocked: Boolean! @column\n lastRegistryCheck: String! @column\n}\n\n\"\"\"\nAdmin policies for extension behavior\n\"\"\"\ntype ExtensionPolicies @entity(embedded: true) {\n allowOrphanedExecution: Boolean! @column\n requireSecurityUpdates: Boolean! @column\n autoRemoveDeprecated: Boolean! @column\n deprecationGracePeriod: Int! @column\n}\n\n\"\"\"\nExtension settings for user preferences and system state\n\"\"\"\ntype ExtensionSettings @entity(embedded: true) {\n userEnabled: Boolean! @column\n systemEnabled: Boolean! @column\n effectiveEnabled: Boolean! @column\n userConfig: JSON @column\n systemConfig: JSON @column\n}\n\n\"\"\"\nRuntime activation error information\n\"\"\"\ntype ExtensionActivationError @entity(embedded: true) {\n message: String! @column\n code: String! @column\n timestamp: String! @column\n}\n\n\"\"\"\nPerformance metrics\n\"\"\"\ntype ExtensionMetrics @entity(embedded: true) {\n activationTime: Float! @column\n memoryUsage: Float! @column\n lastMeasured: String! @column\n}\n\n\"\"\"\nRuntime information about extension execution\n\"\"\"\ntype ExtensionRuntime @entity(embedded: true) {\n activationState: ExtensionActivationState! @column\n lastActivated: DateTime @column(overrideType: \"Date\")\n lastDeactivated: DateTime @column(overrideType: \"Date\")\n activationError: ExtensionActivationError @embedded\n metrics: ExtensionMetrics @embedded\n}\n\n\"\"\"\nAudit log entry for extension actions\n\"\"\"\ntype ExtensionAuditEntry @entity(embedded: true) {\n action: String! @column\n timestamp: DateTime! @column(overrideType: \"Date\")\n user: UserAccount! @column(overrideType: \"ObjectId\")\n details: JSON @column\n}\n\n\"\"\"\nMain installed extension type\n\"\"\"\ntype InstalledExtension implements Node @entity {\n id: ID! @id\n organization: Organization @column(overrideType: \"ObjectId\")\n extension: RegistryExtension! @column(overrideType: \"ObjectId\")\n installedVersion: String! @column\n status: InstalledExtensionStatus! @column\n lifecycle: ExtensionLifecycle! @embedded\n policies: ExtensionPolicies! @embedded\n settings: ExtensionSettings! @embedded\n runtime: ExtensionRuntime! @embedded\n installedAt: DateTime! @column(overrideType: \"Date\")\n installedBy: UserAccount! @column(overrideType: \"ObjectId\")\n lastUpdated: DateTime @column(overrideType: \"Date\")\n lastUpdatedBy: UserAccount @column(overrideType: \"ObjectId\")\n availableVersion: String @column\n dependencies: [String!] @column\n dependents: [String!] @column\n auditLog: [ExtensionAuditEntry!] @embedded\n \"\"\"The source database collection this installed extension references\"\"\"\n sourceCollection: String @column\n \"\"\"The ObjectId of the specific document in the source collection\"\"\"\n sourceDocumentId: String @column\n \"\"\"Additional metadata for the installed extension\"\"\"\n metadata: JSON @column\n \"\"\"The actual document from the source collection (resolved via DataLoader, returns null if not found or no reference)\"\"\"\n sourceDocument: JSON\n}\n\n\"\"\"\nRegistry information for display\n\"\"\"\ntype ExtensionRegistryInfo {\n displayName: String!\n description: String!\n publisher: String!\n latestVersion: String!\n tags: [String!]!\n categories: [String!]!\n deprecation: JSON\n suspension: JSON\n}\n\n\"\"\"\nNotification action\n\"\"\"\ntype NotificationAction {\n label: String!\n action: String!\n url: String\n extensionSlug: String\n}\n\n\"\"\"\nExtension notification\n\"\"\"\ntype ExtensionNotification {\n type: String!\n severity: String!\n message: String!\n actions: [NotificationAction!]\n}\n\n\"\"\"\nExtension update information\n\"\"\"\ntype ExtensionUpdate {\n extensionSlug: String!\n currentVersion: String!\n availableVersion: String!\n isSecurityUpdate: Boolean!\n}\n\n\"\"\"\nExtension cleanup result\n\"\"\"\ntype ExtensionCleanupResult {\n removed: [String!]!\n deprecated: [String!]!\n warnings: [String!]!\n}\n\n\"\"\"\nInput for installing an extension\n\"\"\"\ninput InstallExtensionInput {\n extensionSlug: String!\n version: String!\n orgName: String\n policies: ExtensionPoliciesInput\n settings: ExtensionSettingsInput\n \"\"\"The source database collection this extension references\"\"\"\n sourceCollection: String\n \"\"\"The ObjectId of the specific document in the source collection\"\"\"\n sourceDocumentId: String\n \"\"\"Additional metadata for the installation\"\"\"\n metadata: JSON\n}\n\n\"\"\"\nInput for extension policies\n\"\"\"\ninput ExtensionPoliciesInput {\n allowOrphanedExecution: Boolean\n requireSecurityUpdates: Boolean\n autoRemoveDeprecated: Boolean\n deprecationGracePeriod: Int\n}\n\n\"\"\"\nInput for extension settings\n\"\"\"\ninput ExtensionSettingsInput {\n userEnabled: Boolean\n systemEnabled: Boolean\n userConfig: JSON\n systemConfig: JSON\n}\n\n\"\"\"\nResponse type for extension mutations\n\"\"\"\ntype ExtensionMutationResponse {\n success: Boolean!\n extension: InstalledExtension\n message: String!\n}\n\n\"\"\"\nResponse type for cleanup operations\n\"\"\"\ntype ExtensionCleanupResponse {\n success: Boolean!\n result: ExtensionCleanupResult\n message: String!\n}\n\n\"\"\"\nResponse type for sync operations\n\"\"\"\ntype ExtensionSyncResponse {\n success: Boolean!\n message: String!\n}\n\nextend type Query {\n \"\"\"\n Get all installed extensions for the current tenant\n \"\"\"\n installedExtensions(enabled: Boolean, orgName: String): [InstalledExtension!]!\n\n \"\"\"\n Get a specific installed extension\n \"\"\"\n installedExtension(extensionSlug: String!): InstalledExtension\n\n \"\"\"\n Get installed extensions that need attention\n \"\"\"\n extensionsNeedingAttention: [InstalledExtension!]!\n\n \"\"\"\n Check for available updates\n \"\"\"\n extensionUpdates(extensionSlug: String): [ExtensionUpdate!]!\n}\n\nextend type Mutation {\n \"\"\"\n Install an extension from the registry\n \"\"\"\n installExtension(input: InstallExtensionInput!): ExtensionMutationResponse!\n\n \"\"\"\n Uninstall an extension\n \"\"\"\n uninstallExtension(extensionSlug: String!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Enable or disable an extension\n \"\"\"\n toggleExtension(extensionSlug: String!, enabled: Boolean!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Update extension settings\n \"\"\"\n updateExtensionSettings(extensionSlug: String!, settings: JSON!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Update an extension to a newer version\n \"\"\"\n updateExtensionVersion(extensionSlug: String!, version: String!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Sync installed extensions with registry\n \"\"\"\n syncExtensionsWithRegistry: ExtensionSyncResponse!\n\n \"\"\"\n Clean up deprecated or removed extensions\n \"\"\"\n cleanupExtensions(dryRun: Boolean): ExtensionCleanupResponse!\n}\n";export{installedExtensionSchema as default};//# sourceMappingURL=installed-extension.graphql.js.map
|
|
1
|
+
var installedExtensionSchema = "\"\"\"\nInstalled extension status enumeration\n\"\"\"\nenum InstalledExtensionStatus {\n installed\n deprecated_installed\n suspended\n orphaned\n force_disabled\n}\n\n\"\"\"\nRegistry status cached from extensionRegistry\n\"\"\"\nenum ExtensionRegistryStatus {\n active\n deprecated\n suspended\n removed\n emergency_removed\n}\n\n\"\"\"\nRuntime activation state\n\"\"\"\nenum ExtensionActivationState {\n enabled\n disabled\n disabled_by_user\n disabled_by_admin\n disabled_by_policy\n}\n\n\"\"\"\nExtension lifecycle management information\n\"\"\"\ntype ExtensionLifecycle @entity(embedded: true) {\n registryStatus: ExtensionRegistryStatus! @column\n isOrphaned: Boolean! @column\n deprecationWarningShown: Boolean! @column\n autoUpdateBlocked: Boolean! @column\n lastRegistryCheck: String! @column\n}\n\n\"\"\"\nAdmin policies for extension behavior\n\"\"\"\ntype ExtensionPolicies @entity(embedded: true) {\n allowOrphanedExecution: Boolean! @column\n requireSecurityUpdates: Boolean! @column\n autoRemoveDeprecated: Boolean! @column\n deprecationGracePeriod: Int! @column\n}\n\n\"\"\"\nExtension settings for user preferences and system state\n\"\"\"\ntype ExtensionSettings @entity(embedded: true) {\n userEnabled: Boolean! @column\n systemEnabled: Boolean! @column\n effectiveEnabled: Boolean! @column\n userConfig: JSON @column\n systemConfig: JSON @column\n}\n\n\"\"\"\nRuntime activation error information\n\"\"\"\ntype ExtensionActivationError @entity(embedded: true) {\n message: String! @column\n code: String! @column\n timestamp: String! @column\n}\n\n\"\"\"\nPerformance metrics\n\"\"\"\ntype ExtensionMetrics @entity(embedded: true) {\n activationTime: Float! @column\n memoryUsage: Float! @column\n lastMeasured: String! @column\n}\n\n\"\"\"\nRuntime information about extension execution\n\"\"\"\ntype ExtensionRuntime @entity(embedded: true) {\n activationState: ExtensionActivationState! @column\n lastActivated: DateTime @column(overrideType: \"Date\")\n lastDeactivated: DateTime @column(overrideType: \"Date\")\n activationError: ExtensionActivationError @embedded\n metrics: ExtensionMetrics @embedded\n}\n\n\"\"\"\nAudit log entry for extension actions\n\"\"\"\ntype ExtensionAuditEntry @entity(embedded: true) {\n action: String! @column\n timestamp: DateTime! @column(overrideType: \"Date\")\n user: UserAccount! @column(overrideType: \"ObjectId\")\n details: JSON @column\n}\n\n\"\"\"\nMain installed extension type\n\"\"\"\ntype InstalledExtension implements Node @entity {\n id: ID! @id\n organization: Organization @column(overrideType: \"ObjectId\")\n extension: RegistryExtension! @column(overrideType: \"ObjectId\")\n installedVersion: String! @column\n status: InstalledExtensionStatus! @column\n lifecycle: ExtensionLifecycle! @embedded\n policies: ExtensionPolicies! @embedded\n settings: ExtensionSettings! @embedded\n runtime: ExtensionRuntime! @embedded\n installedAt: DateTime! @column(overrideType: \"Date\")\n installedBy: UserAccount! @column(overrideType: \"ObjectId\")\n lastUpdated: DateTime @column(overrideType: \"Date\")\n lastUpdatedBy: UserAccount @column(overrideType: \"ObjectId\")\n availableVersion: String @column\n dependencies: [String!] @column\n dependents: [String!] @column\n auditLog: [ExtensionAuditEntry!] @embedded\n \"\"\"The source database collection this installed extension references\"\"\"\n sourceCollection: String @column\n \"\"\"The ObjectId of the specific document in the source collection\"\"\"\n sourceDocumentId: String @column\n \"\"\"Additional metadata for the installed extension\"\"\"\n metadata: JSON @column\n \"\"\"The actual document from the source collection (resolved via DataLoader, returns null if not found or no reference)\"\"\"\n sourceDocument: JSON\n}\n\n\"\"\"\nRegistry information for display\n\"\"\"\ntype ExtensionRegistryInfo {\n displayName: String!\n description: String!\n publisher: String!\n latestVersion: String!\n tags: [String!]!\n categories: [String!]!\n deprecation: JSON\n suspension: JSON\n}\n\n\"\"\"\nNotification action\n\"\"\"\ntype NotificationAction {\n label: String!\n action: String!\n url: String\n extensionSlug: String\n}\n\n\"\"\"\nExtension notification\n\"\"\"\ntype ExtensionNotification {\n type: String!\n severity: String!\n message: String!\n actions: [NotificationAction!]\n}\n\n\"\"\"\nExtension update information\n\"\"\"\ntype ExtensionUpdate {\n extensionSlug: String!\n currentVersion: String!\n availableVersion: String!\n isSecurityUpdate: Boolean!\n}\n\n\"\"\"\nExtension cleanup result\n\"\"\"\ntype ExtensionCleanupResult {\n removed: [String!]!\n deprecated: [String!]!\n warnings: [String!]!\n}\n\n\"\"\"\nInput for installing an extension\n\"\"\"\ninput InstallExtensionInput {\n extensionSlug: String!\n version: String!\n orgName: String\n policies: ExtensionPoliciesInput\n settings: ExtensionSettingsInput\n \"\"\"The source database collection this extension references\"\"\"\n sourceCollection: String\n \"\"\"The ObjectId of the specific document in the source collection\"\"\"\n sourceDocumentId: String\n \"\"\"Additional metadata for the installation\"\"\"\n metadata: JSON\n}\n\n\"\"\"\nInput for extension policies\n\"\"\"\ninput ExtensionPoliciesInput {\n allowOrphanedExecution: Boolean\n requireSecurityUpdates: Boolean\n autoRemoveDeprecated: Boolean\n deprecationGracePeriod: Int\n}\n\n\"\"\"\nInput for extension settings\n\"\"\"\ninput ExtensionSettingsInput {\n userEnabled: Boolean\n systemEnabled: Boolean\n userConfig: JSON\n systemConfig: JSON\n}\n\n\"\"\"\nResponse type for extension mutations\n\"\"\"\ntype ExtensionMutationResponse {\n success: Boolean!\n extension: InstalledExtension\n message: String!\n}\n\n\"\"\"\nResponse type for cleanup operations\n\"\"\"\ntype ExtensionCleanupResponse {\n success: Boolean!\n result: ExtensionCleanupResult\n message: String!\n}\n\n\"\"\"\nResponse type for sync operations\n\"\"\"\ntype ExtensionSyncResponse {\n success: Boolean!\n message: String!\n}\n\n\"\"\"\nResponse type for orphaned extension cleanup\n\"\"\"\ntype OrphanedExtensionCleanupResponse {\n success: Boolean!\n message: String!\n removed: [String!]!\n warnings: [String!]!\n}\n\nextend type Query {\n \"\"\"\n Get all installed extensions for the current tenant\n \"\"\"\n installedExtensions(enabled: Boolean, orgName: String): [InstalledExtension!]!\n\n \"\"\"\n Get a specific installed extension\n \"\"\"\n installedExtension(extensionSlug: String!): InstalledExtension\n\n \"\"\"\n Get installed extensions that need attention\n \"\"\"\n extensionsNeedingAttention: [InstalledExtension!]!\n\n \"\"\"\n Check for available updates\n \"\"\"\n extensionUpdates(extensionSlug: String): [ExtensionUpdate!]!\n}\n\nextend type Mutation {\n \"\"\"\n Install an extension from the registry\n \"\"\"\n installExtension(input: InstallExtensionInput!): ExtensionMutationResponse!\n\n \"\"\"\n Uninstall an extension\n \"\"\"\n uninstallExtension(extensionSlug: String!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Enable or disable an extension\n \"\"\"\n toggleExtension(extensionSlug: String!, enabled: Boolean!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Update extension settings\n \"\"\"\n updateExtensionSettings(extensionSlug: String!, settings: JSON!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Update an extension to a newer version\n \"\"\"\n updateExtensionVersion(extensionSlug: String!, version: String!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Sync installed extensions with registry\n \"\"\"\n syncExtensionsWithRegistry: ExtensionSyncResponse!\n\n \"\"\"\n Clean up deprecated or removed extensions\n \"\"\"\n cleanupExtensions(dryRun: Boolean): ExtensionCleanupResponse!\n \n \"\"\"\n Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry\n \"\"\"\n cleanupOrphanedExtensions(dryRun: Boolean, orgName: String): OrphanedExtensionCleanupResponse!\n}\n";export{installedExtensionSchema as default};//# sourceMappingURL=installed-extension.graphql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installed-extension-service-ext.d.ts","sourceRoot":"","sources":["../../src/services/installed-extension-service-ext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAgBH,yBAAyB,EACzB,6BAA6B,EAO7B,YAAY,EACZ,kBAAkB,EACrB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"installed-extension-service-ext.d.ts","sourceRoot":"","sources":["../../src/services/installed-extension-service-ext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAgBH,yBAAyB,EACzB,6BAA6B,EAO7B,YAAY,EACZ,kBAAkB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AA0D1E;;;GAGG;AACH,qBACa,4BAA6B,SAAQ,yBAAyB;IAKnE,SAAS,CAAC,WAAW,EAAE,YAAY;IAEnC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,kBAAkB;gBALJ,UAAU,EAAE,6BAA6B,EAC7C,eAAe,EAAE,yBAAyB,EAEhF,WAAW,EAAE,YAAY,EAEhB,iBAAiB,EAAE,kBAAkB,EACnB,MAAM,EAAE,aAAa,EAC/B,MAAM,EAAE,SAAS,CAAC,OAAO;IAMxD,OAAO,CAAC,mBAAmB;YA6gBb,SAAS;CA8C1B"}
|
|
@@ -119,6 +119,7 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
|
|
|
119
119
|
} else {
|
|
120
120
|
console.log('No configuration contributions found in manifest');
|
|
121
121
|
}
|
|
122
|
+
console.log('CONTRIBUTES========>', JSON.stringify(contributes));
|
|
122
123
|
// Extract UILayout contributions if they exist (same structure as configuration)
|
|
123
124
|
if (contributes && contributes.uiLayout) {
|
|
124
125
|
console.log('UILayout contributions found, processing...');
|
|
@@ -160,29 +161,6 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
|
|
|
160
161
|
} else {
|
|
161
162
|
console.log('No extension found for:', event.extensionSlug);
|
|
162
163
|
}
|
|
163
|
-
// Add the extension's enabled/disabled state to configuration nodes
|
|
164
|
-
// This tracks the extension status regardless of whether it has configuration contributions
|
|
165
|
-
const extensionStatusNode = {
|
|
166
|
-
id: ContributionFragmentName.Settings,
|
|
167
|
-
title: `${registryExtension?.name || event.extensionSlug} Status`,
|
|
168
|
-
description: `Extension enabled/disabled status for ${event.extensionSlug}`,
|
|
169
|
-
properties: {
|
|
170
|
-
[`extensions.${event.extensionSlug}`]: {
|
|
171
|
-
type: 'boolean',
|
|
172
|
-
default: true,
|
|
173
|
-
// Default to enabled when installed
|
|
174
|
-
description: `Enable/disable ${event.extensionSlug} extension`,
|
|
175
|
-
scope: 3 /* ConfigurationScope.WINDOW */
|
|
176
|
-
}
|
|
177
|
-
},
|
|
178
|
-
type: ['object'],
|
|
179
|
-
extensionInfo: {
|
|
180
|
-
id: event.extensionSlug,
|
|
181
|
-
displayName: registryExtension?.name || event.extensionSlug
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
// Add the extension status node to configurationNodes
|
|
185
|
-
// configurationNodes.push(extensionStatusNode);
|
|
186
164
|
// Create the configuration node data that configuration registry expects
|
|
187
165
|
const configurationNode = {
|
|
188
166
|
schemaId: ConfigurationSchemaId.Configuration,
|
|
@@ -208,14 +186,6 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
|
|
|
208
186
|
});
|
|
209
187
|
// STEP 1: MANDATORY - Register extension in system_extension FIRST (REQUIRED FOR ALL EXTENSIONS)
|
|
210
188
|
console.log('\nš§ STEP 1: Registering extension in SYSTEM_EXTENSION (MANDATORY)');
|
|
211
|
-
// Create separate configuration node for system extension status
|
|
212
|
-
const systemExtensionNode = {
|
|
213
|
-
schemaId: ConfigurationSchemaId.Configuration,
|
|
214
|
-
tenantId: event.tenantId,
|
|
215
|
-
extensionName: SystemContributionExtensionNames.SystemExtension,
|
|
216
|
-
policyConfigs: null,
|
|
217
|
-
configurationNodes: [extensionStatusNode]
|
|
218
|
-
};
|
|
219
189
|
const systemContext = {
|
|
220
190
|
schemaId: ConfigurationSchemaId.Configuration,
|
|
221
191
|
tenantId: event.tenantId,
|
|
@@ -224,13 +194,66 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
|
|
|
224
194
|
};
|
|
225
195
|
let systemExtensionRegistered = false;
|
|
226
196
|
try {
|
|
227
|
-
console.log('
|
|
228
|
-
|
|
229
|
-
|
|
197
|
+
console.log('Fetching current system_extension document...');
|
|
198
|
+
// Get existing system_extension document
|
|
199
|
+
const existingSystemDoc = await this.broker.call('ConfigurationRegistryService.getConfigurationNodeRegistry', {
|
|
200
|
+
context: systemContext
|
|
201
|
+
});
|
|
202
|
+
// Prepare the merged configuration node
|
|
203
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
204
|
+
const mergedNode = {
|
|
205
|
+
id: ContributionFragmentName.Settings,
|
|
206
|
+
type: ['object'],
|
|
207
|
+
properties: {},
|
|
208
|
+
restrictedProperties: []
|
|
209
|
+
};
|
|
210
|
+
// If document exists, merge existing properties
|
|
211
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
212
|
+
if (existingSystemDoc && existingSystemDoc.configurationNodes) {
|
|
213
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
214
|
+
const existingNodes = existingSystemDoc.configurationNodes || [];
|
|
215
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
216
|
+
const existingSettingsNode = existingNodes.find(
|
|
217
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
218
|
+
node => node.id === ContributionFragmentName.Settings);
|
|
219
|
+
if (existingSettingsNode?.properties) {
|
|
220
|
+
mergedNode.properties = {
|
|
221
|
+
...existingSettingsNode.properties
|
|
222
|
+
};
|
|
223
|
+
const existingCount = Object.keys(existingSettingsNode.properties).length;
|
|
224
|
+
console.log(`š Merging with ${existingCount} existing properties`);
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
console.log('š Creating new system_extension document');
|
|
228
|
+
}
|
|
229
|
+
// Add/update the property for this extension
|
|
230
|
+
mergedNode.properties[`extensions.${event.extensionSlug}`] = {
|
|
231
|
+
type: 'boolean',
|
|
232
|
+
default: true,
|
|
233
|
+
description: `Enable/disable ${event.extensionSlug} extension`,
|
|
234
|
+
scope: 3 /* ConfigurationScope.WINDOW */
|
|
235
|
+
};
|
|
236
|
+
// Prepare final data
|
|
237
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
238
|
+
const finalSystemExtensionNode = {
|
|
239
|
+
schemaId: ConfigurationSchemaId.Configuration,
|
|
240
|
+
tenantId: event.tenantId,
|
|
241
|
+
extensionName: SystemContributionExtensionNames.SystemExtension,
|
|
242
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
243
|
+
policyConfigs: existingSystemDoc?.policyConfigs || null,
|
|
244
|
+
configurationNodes: [mergedNode],
|
|
245
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
246
|
+
configurationDefaults: existingSystemDoc?.configurationDefaults || []
|
|
247
|
+
};
|
|
248
|
+
// Use update if exists, create if new
|
|
249
|
+
const serviceMethod = existingSystemDoc ? 'ConfigurationRegistryService.updateConfigurationNodeRegistry' : 'ConfigurationRegistryService.createConfigurationNodeRegistry';
|
|
250
|
+
await this.broker.call(serviceMethod, {
|
|
251
|
+
data: finalSystemExtensionNode,
|
|
230
252
|
context: systemContext
|
|
231
253
|
});
|
|
232
254
|
systemExtensionRegistered = true;
|
|
233
|
-
|
|
255
|
+
const totalExtensions = Object.keys(mergedNode.properties).length;
|
|
256
|
+
console.log(`ā
STEP 1 SUCCESS: Extension registered (total: ${totalExtensions} extensions)`);
|
|
234
257
|
} catch (systemError) {
|
|
235
258
|
console.error('ā STEP 1 FAILED: System extension registration failed:', systemError);
|
|
236
259
|
throw new Error(`Extension installation failed: Could not register in system (${systemError.message})`);
|
|
@@ -321,12 +344,21 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
|
|
|
321
344
|
});
|
|
322
345
|
if (currentSystemDoc && currentSystemDoc.configurationNodes) {
|
|
323
346
|
const systemDoc = currentSystemDoc;
|
|
324
|
-
//
|
|
347
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
325
348
|
const configurationNodes = systemDoc.configurationNodes;
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
//
|
|
349
|
+
// Find the settings node and remove the extension property
|
|
350
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
351
|
+
const settingsNode = configurationNodes.find(
|
|
352
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
353
|
+
node => node.id === ContributionFragmentName.Settings);
|
|
354
|
+
if (settingsNode?.properties) {
|
|
355
|
+
const propertyKey = `extensions.${event.extensionSlug}`;
|
|
356
|
+
delete settingsNode.properties[propertyKey];
|
|
357
|
+
console.log(`Removing extension property: ${propertyKey}`);
|
|
358
|
+
console.log(`Remaining properties: ${Object.keys(settingsNode.properties).length}`);
|
|
359
|
+
}
|
|
360
|
+
const updatedConfigurationNodes = configurationNodes;
|
|
361
|
+
// Update the system_extension document with the updated nodes
|
|
330
362
|
const updatedSystemExtensionNode = {
|
|
331
363
|
schemaId: ConfigurationSchemaId.Configuration,
|
|
332
364
|
tenantId: event.tenantId,
|
|
@@ -453,6 +485,7 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
|
|
|
453
485
|
console.log('Start dropping GraphQL query cache keys');
|
|
454
486
|
try {
|
|
455
487
|
// Get Redis client from redisCacheManager
|
|
488
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
456
489
|
const {
|
|
457
490
|
redisClient
|
|
458
491
|
} = this.redisCacheManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installed-extension-service-ext.js","sources":["../../src/services/installed-extension-service-ext.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"installed-extension-service-ext.js","sources":["../../src/services/installed-extension-service-ext.ts"],"sourcesContent":[null],"names":[],"mappings":"qbA4FG;AACH;;AAQQ;;AAQJ,EAAA,IAAA,OAAQ,KAAA,KAAA,QAAmB,EAAA;gBA6gBb,CAAA;AA8CjB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -88,6 +88,15 @@ export declare class InstalledExtensionService extends BaseService2<IInstalledEx
|
|
|
88
88
|
deprecated: string[];
|
|
89
89
|
warnings: string[];
|
|
90
90
|
}>;
|
|
91
|
+
/**
|
|
92
|
+
* Sync installed_extensions with system_extension registry
|
|
93
|
+
* Removes extensions from installed_extensions and configuration_registries
|
|
94
|
+
* if they are not present in system_extension registry
|
|
95
|
+
*/
|
|
96
|
+
cleanupOrphanedExtensions(orgId: string, tenantId: string, dryRun?: boolean): Promise<{
|
|
97
|
+
removed: string[];
|
|
98
|
+
warnings: string[];
|
|
99
|
+
}>;
|
|
91
100
|
/**
|
|
92
101
|
* Check if update is a security update (simplified logic)
|
|
93
102
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installed-extension-service.d.ts","sourceRoot":"","sources":["../../src/services/installed-extension-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"installed-extension-service.d.ts","sourceRoot":"","sources":["../../src/services/installed-extension-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACH,wBAAwB,EACxB,8BAA8B,EAC9B,8BAA8B,EAE9B,yBAAyB,EAEzB,yBAAyB,EAEzB,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,4BAA4B,EAC5B,+BAA+B,EAC/B,yBAAyB,EACzB,uBAAuB,EACvB,mCAAmC,EACnC,4BAA4B,EAC5B,+BAA+B,EAC/B,YAAY,EACZ,YAAY,EAGf,MAAM,eAAe,CAAC;AAEvB,qBACa,yBACT,SAAQ,YAAY,CAAC,wBAAwB,CAC7C,YAAW,0BAA0B,EAAE,UAAU;IAgD7C,OAAO,CAAC,4BAA4B;IAGpC,SAAS,CAAC,wBAAwB,EAAE,yBAAyB;IAG7D,SAAS,CAAC,WAAW,EAAE,YAAY;IAGnC,SAAS,CAAC,MAAM,EAAE,aAAa;IAvDnC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,oCAA2C;IAElF,SAAS,CAAC,QAAQ,CAAC,sBAAsB,sCAA6C;IAEtF,SAAS,CAAC,QAAQ,CAAC,kBAAkB,kCAAyC;IAE9E,SAAS,CAAC,QAAQ,CAAC,mBAAmB,mCAA0C;IAEhF,SAAS,CAAC,QAAQ,CAAC,kBAAkB,kCAAyC;IAE9E,SAAS,CAAC,QAAQ,CAAC,yBAAyB,yCAAgD;IAE5F,SAAS,CAAC,QAAQ,CAAC,+BAA+B,+CAAsD;IAExG,SAAS,CAAC,QAAQ,CAAC,wBAAwB,wCAA+C;IAE1F,SAAS,CAAC,QAAQ,CAAC,2BAA2B,2CAAkD;IAEhG,SAAS,CAAC,QAAQ,CAAC,wBAAwB,wCAA+C;IAE1F,SAAS,CAAC,QAAQ,CAAC,2BAA2B,2CAAkD;IAEhG,SAAS,CAAC,QAAQ,CAAC,qBAAqB,qCAA4C;IAEpF,SAAS,CAAC,QAAQ,CAAC,mBAAmB,mCAA0C;IAEhF,SAAS,CAAC,QAAQ,CAAC,SAAS,uBAc1B;IAEF,OAAO,CAAC,MAAM,CAAoB;gBAItB,4BAA4B,EAAE,6BAA6B,EAGzD,wBAAwB,EAAE,yBAAyB,EAGnD,WAAW,EAAE,YAAY,EAGzB,MAAM,EAAE,aAAa,EAG/B,MAAM,EAAE,SAAS,CAAC,OAAO;IAMtB,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACU,gBAAgB,CACzB,KAAK,EAAE,8BAA8B,EACrC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;IAiDlD;;OAEG;YACW,kBAAkB;IA4DhC;;OAEG;IACU,kBAAkB,CAC3B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,QAAQ,KAAA,GACT,OAAO,CAAC,OAAO,CAAC;IAqInB;;OAEG;IACU,wBAAwB,CACjC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,8BAA8B,EACtC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;IA8BlD;;OAEG;IACU,qBAAqB,CAC9B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC;IAQzD;;OAEG;IACU,sBAAsB,CAC/B,MAAM,EAAE,yBAAyB,GAClC,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,CAAC;IAKpD;;OAEG;IACU,eAAe,CACxB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;IAgDlD;;OAEG;IACU,uBAAuB,CAChC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;IA+BlD;;OAEG;IACU,eAAe,CACxB,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,GACvB,OAAO,CACN,KAAK,CAAC;QACF,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,OAAO,CAAC;KAC7B,CAAC,CACL;IAmCD;;OAEG;IACU,sBAAsB,CAC/B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,KAAA,GACT,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;IAuClD;;OAEG;IACU,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsE7E;;OAEG;IACU,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,CAAC;IAe5G;;OAEG;IACU,iBAAiB,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO,GACjB,OAAO,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IA0DF;;;;OAIG;IACU,yBAAyB,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO,GACjB,OAAO,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAuFF;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAK3B"}
|
|
@@ -509,6 +509,85 @@ let InstalledExtensionService = InstalledExtensionService_1 = class InstalledExt
|
|
|
509
509
|
this.onExtensionCleanupCompleted.fire(event);
|
|
510
510
|
return result;
|
|
511
511
|
}
|
|
512
|
+
/**
|
|
513
|
+
* Sync installed_extensions with system_extension registry
|
|
514
|
+
* Removes extensions from installed_extensions and configuration_registries
|
|
515
|
+
* if they are not present in system_extension registry
|
|
516
|
+
*/
|
|
517
|
+
async cleanupOrphanedExtensions(orgId, tenantId, dryRun) {
|
|
518
|
+
const result = {
|
|
519
|
+
removed: [],
|
|
520
|
+
warnings: []
|
|
521
|
+
};
|
|
522
|
+
console.log('š SYNC: Starting extension registry sync...');
|
|
523
|
+
console.log(` OrgId: ${orgId}, TenantId: ${tenantId}, DryRun: ${dryRun}`);
|
|
524
|
+
// Get all installed extensions
|
|
525
|
+
const extensions = await this.installedExtensionRepository.findExtensions({
|
|
526
|
+
orgId
|
|
527
|
+
});
|
|
528
|
+
console.log(` Found ${extensions.length} installed extensions`);
|
|
529
|
+
// Get system_extension document
|
|
530
|
+
const systemExtensionDoc = await this.broker.call('ConfigurationRegistryService.getConfigurationNodeRegistry', {
|
|
531
|
+
context: {
|
|
532
|
+
schemaId: 'configuration',
|
|
533
|
+
tenantId,
|
|
534
|
+
extensionName: 'system_extension'
|
|
535
|
+
}
|
|
536
|
+
});
|
|
537
|
+
// Get list of extensions in system_extension
|
|
538
|
+
const systemExtensionSlugs = new Set();
|
|
539
|
+
if (systemExtensionDoc && systemExtensionDoc.configurationNodes) {
|
|
540
|
+
const configNodes = systemExtensionDoc.configurationNodes || [];
|
|
541
|
+
const settingsNode = configNodes.find(node => node.id === 'settings');
|
|
542
|
+
if (settingsNode?.properties) {
|
|
543
|
+
Object.keys(settingsNode.properties).forEach(key => {
|
|
544
|
+
if (key.startsWith('extensions.')) {
|
|
545
|
+
const slug = key.replace('extensions.', '');
|
|
546
|
+
systemExtensionSlugs.add(slug);
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
console.log(` Found ${systemExtensionSlugs.size} extensions in system_extension registry`);
|
|
552
|
+
console.log(` System extensions:`, Array.from(systemExtensionSlugs));
|
|
553
|
+
// Check each installed extension
|
|
554
|
+
for (const extension of extensions) {
|
|
555
|
+
const extensionSlug = extension.extension?.extensionSlug || extension.extensionSlug;
|
|
556
|
+
// If extension is in installed_extensions but NOT in system_extension, it's orphaned
|
|
557
|
+
if (extensionSlug && !systemExtensionSlugs.has(extensionSlug)) {
|
|
558
|
+
console.log(`ā ļø Found orphaned installed_extension: ${extensionSlug} (not in system_extension)`);
|
|
559
|
+
if (!dryRun) {
|
|
560
|
+
try {
|
|
561
|
+
// Get the extension ID (registry reference) for deletion
|
|
562
|
+
const extensionId = String(extension.extension);
|
|
563
|
+
// Remove from installed_extensions
|
|
564
|
+
await this.installedExtensionRepository.deleteExtension(orgId, extensionId);
|
|
565
|
+
console.log(` ā
Deleted from installed_extensions: ${extensionSlug}`);
|
|
566
|
+
// Remove uiLayout configuration from configuration_registries
|
|
567
|
+
await this.broker.call('ConfigurationRegistryService.removeConfigurationNodeRegistry', {
|
|
568
|
+
context: {
|
|
569
|
+
schemaId: 'uiLayout',
|
|
570
|
+
tenantId,
|
|
571
|
+
extensionName: extensionSlug
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
console.log(` ā
Deleted uiLayout config: ${extensionSlug}`);
|
|
575
|
+
result.removed.push(extensionSlug);
|
|
576
|
+
} catch (cleanupError) {
|
|
577
|
+
console.error(` ā Failed to cleanup ${extensionSlug}:`, cleanupError);
|
|
578
|
+
result.warnings.push(`Failed to cleanup ${extensionSlug}: ${cleanupError.message}`);
|
|
579
|
+
}
|
|
580
|
+
} else {
|
|
581
|
+
console.log(` [DRY RUN] Would remove: ${extensionSlug}`);
|
|
582
|
+
result.removed.push(extensionSlug);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
console.log('\nā
SYNC COMPLETE');
|
|
587
|
+
console.log(` Removed: ${result.removed.length} extensions`);
|
|
588
|
+
console.log(` Warnings: ${result.warnings.length} items`);
|
|
589
|
+
return result;
|
|
590
|
+
}
|
|
512
591
|
/**
|
|
513
592
|
* Check if update is a security update (simplified logic)
|
|
514
593
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installed-extension-service.js","sources":["../../src/services/installed-extension-service.ts"],"sourcesContent":[null],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"installed-extension-service.js","sources":["../../src/services/installed-extension-service.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -178,4 +178,16 @@ export interface IInstalledExtensionService extends IBaseService<IInstalledExten
|
|
|
178
178
|
deprecated: string[]; // Array of extension ObjectIds
|
|
179
179
|
warnings: string[];
|
|
180
180
|
}>;
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry
|
|
184
|
+
*/
|
|
185
|
+
cleanupOrphanedExtensions(
|
|
186
|
+
orgId: string,
|
|
187
|
+
tenantId: string,
|
|
188
|
+
dryRun?: boolean,
|
|
189
|
+
): Promise<{
|
|
190
|
+
removed: string[]; // Array of extension slugs
|
|
191
|
+
warnings: string[];
|
|
192
|
+
}>;
|
|
181
193
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/marketplace-module-server",
|
|
3
|
-
"version": "12.0.4-alpha.
|
|
3
|
+
"version": "12.0.4-alpha.423",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
"watch": "yarn build:lib:watch"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@adminide-stack/extension-api": "12.0.4-alpha.
|
|
24
|
+
"@adminide-stack/extension-api": "12.0.4-alpha.423",
|
|
25
25
|
"nanoid": "^5.1.5"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"common": "12.0.4-alpha.
|
|
28
|
+
"common": "12.0.4-alpha.423"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"graphql-tag": ">=2.0.0"
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"typescript": {
|
|
58
58
|
"definition": "lib/index.d.ts"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "b3354cb147e8ed3a8c12b24a0304e97e82da23b8"
|
|
61
61
|
}
|