@adminide-stack/marketplace-module-server 12.0.4-alpha.92 → 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 (194) hide show
  1. package/Readme.md +321 -0
  2. package/lib/containers/module.d.ts +8 -0
  3. package/lib/containers/module.d.ts.map +1 -1
  4. package/lib/containers/module.js +16 -5
  5. package/lib/containers/module.js.map +1 -1
  6. package/lib/dataloaders/index.d.ts +2 -0
  7. package/lib/dataloaders/index.d.ts.map +1 -0
  8. package/lib/dataloaders/publisher-data-loader.d.ts +6 -0
  9. package/lib/dataloaders/publisher-data-loader.d.ts.map +1 -0
  10. package/lib/demo/test-graphql-examples.d.ts +73 -0
  11. package/lib/demo/test-graphql-examples.d.ts.map +1 -0
  12. package/lib/graphql/resolvers/form-templates-resolver.d.ts +220 -0
  13. package/lib/graphql/resolvers/form-templates-resolver.d.ts.map +1 -0
  14. package/lib/graphql/resolvers/form-templates-resolver.js +170 -0
  15. package/lib/graphql/resolvers/form-templates-resolver.js.map +1 -0
  16. package/lib/graphql/resolvers/gallery-resolver.d.ts +15 -0
  17. package/lib/graphql/resolvers/gallery-resolver.d.ts.map +1 -0
  18. package/lib/graphql/resolvers/gallery-resolver.js +35 -0
  19. package/lib/graphql/resolvers/gallery-resolver.js.map +1 -0
  20. package/lib/graphql/resolvers/index.d.ts +247 -1
  21. package/lib/graphql/resolvers/index.d.ts.map +1 -1
  22. package/lib/graphql/resolvers/index.js +1 -0
  23. package/lib/graphql/resolvers/index.js.map +1 -0
  24. package/lib/graphql/resolvers/installed-extension-resolver.d.ts +5 -0
  25. package/lib/graphql/resolvers/installed-extension-resolver.d.ts.map +1 -0
  26. package/lib/graphql/resolvers/installed-extension-resolver.js +309 -0
  27. package/lib/graphql/resolvers/installed-extension-resolver.js.map +1 -0
  28. package/lib/graphql/resolvers/marketplace-form-resolver.d.ts +13 -0
  29. package/lib/graphql/resolvers/marketplace-form-resolver.d.ts.map +1 -0
  30. package/lib/graphql/resolvers/marketplace-form-resolver.js +90 -0
  31. package/lib/graphql/resolvers/marketplace-form-resolver.js.map +1 -0
  32. package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts +14 -0
  33. package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts.map +1 -0
  34. package/lib/graphql/resolvers/publisher-analytics-resolver.js +221 -0
  35. package/lib/graphql/resolvers/publisher-analytics-resolver.js.map +1 -0
  36. package/lib/graphql/resolvers/publisher-resolver.d.ts +5 -0
  37. package/lib/graphql/resolvers/publisher-resolver.d.ts.map +1 -0
  38. package/lib/graphql/resolvers/publisher-resolver.js +183 -0
  39. package/lib/graphql/resolvers/publisher-resolver.js.map +1 -0
  40. package/lib/graphql/resolvers/registry-extension-resolver.d.ts +5 -0
  41. package/lib/graphql/resolvers/registry-extension-resolver.d.ts.map +1 -0
  42. package/lib/graphql/resolvers/registry-extension-resolver.js +46 -0
  43. package/lib/graphql/resolvers/registry-extension-resolver.js.map +1 -0
  44. package/lib/graphql/schemas/extension-pricing.graphql +546 -0
  45. package/lib/graphql/schemas/extension-pricing.graphql.js +1 -0
  46. package/lib/graphql/schemas/extension-pricing.graphql.js.map +1 -0
  47. package/lib/graphql/schemas/extension-registry.graphql +107 -0
  48. package/lib/graphql/schemas/extension-registry.graphql.js +1 -0
  49. package/lib/graphql/schemas/extension-registry.graphql.js.map +1 -0
  50. package/lib/graphql/schemas/form-templates.graphql +269 -0
  51. package/lib/graphql/schemas/form-templates.graphql.js +1 -0
  52. package/lib/graphql/schemas/form-templates.graphql.js.map +1 -0
  53. package/lib/graphql/schemas/gallery-schema.graphql +247 -0
  54. package/lib/graphql/schemas/gallery-schema.graphql.js +1 -0
  55. package/lib/graphql/schemas/gallery-schema.graphql.js.map +1 -0
  56. package/lib/graphql/schemas/index.d.ts.map +1 -1
  57. package/lib/graphql/schemas/index.js +3 -4
  58. package/lib/graphql/schemas/index.js.map +1 -1
  59. package/lib/graphql/schemas/installed-extension.graphql +324 -0
  60. package/lib/graphql/schemas/installed-extension.graphql.js +1 -0
  61. package/lib/graphql/schemas/installed-extension.graphql.js.map +1 -0
  62. package/lib/graphql/schemas/publisher-analytics.graphql +305 -0
  63. package/lib/graphql/schemas/publisher-analytics.graphql.js +1 -0
  64. package/lib/graphql/schemas/publisher-analytics.graphql.js.map +1 -0
  65. package/lib/graphql/schemas/publisher.graphql +584 -0
  66. package/lib/graphql/schemas/publisher.graphql.js +1 -0
  67. package/lib/graphql/schemas/publisher.graphql.js.map +1 -0
  68. package/lib/graphql/schemas/service.graphql +196 -0
  69. package/lib/index.d.ts +3 -1
  70. package/lib/index.d.ts.map +1 -1
  71. package/lib/index.js +1 -1
  72. package/lib/index.js.map +1 -1
  73. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts +20 -0
  74. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts.map +1 -0
  75. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js +61 -0
  76. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js.map +1 -0
  77. package/lib/migrations/index.d.ts +2 -0
  78. package/lib/migrations/index.d.ts.map +1 -0
  79. package/lib/module.d.ts +1 -1
  80. package/lib/module.d.ts.map +1 -1
  81. package/lib/module.js +12 -25
  82. package/lib/module.js.map +1 -1
  83. package/lib/plugins/extension-moleculer-service.d.ts +86 -0
  84. package/lib/plugins/extension-moleculer-service.d.ts.map +1 -0
  85. package/lib/plugins/index.d.ts +2 -0
  86. package/lib/plugins/index.d.ts.map +1 -0
  87. package/lib/services/extension-gallery-repository.d.ts +17 -0
  88. package/lib/services/extension-gallery-repository.d.ts.map +1 -0
  89. package/lib/services/extension-gallery-repository.js +192 -0
  90. package/lib/services/extension-gallery-repository.js.map +1 -0
  91. package/lib/services/extension-gallery-service-new.d.ts +39 -0
  92. package/lib/services/extension-gallery-service-new.d.ts.map +1 -0
  93. package/lib/services/extension-gallery-service.d.ts +30 -0
  94. package/lib/services/extension-gallery-service.d.ts.map +1 -0
  95. package/lib/services/extension-gallery-service.js +334 -0
  96. package/lib/services/extension-gallery-service.js.map +1 -0
  97. package/lib/services/index.d.ts +6 -1
  98. package/lib/services/index.d.ts.map +1 -1
  99. package/lib/services/installed-extension-service-ext.d.ts +16 -0
  100. package/lib/services/installed-extension-service-ext.d.ts.map +1 -0
  101. package/lib/services/installed-extension-service-ext.js +518 -0
  102. package/lib/services/installed-extension-service-ext.js.map +1 -0
  103. package/lib/services/installed-extension-service.d.ts +110 -0
  104. package/lib/services/installed-extension-service.d.ts.map +1 -0
  105. package/lib/services/installed-extension-service.js +633 -0
  106. package/lib/services/installed-extension-service.js.map +1 -0
  107. package/lib/services/installed-extension-service.test.d.ts +1 -0
  108. package/lib/services/installed-extension-service.test.d.ts.map +1 -0
  109. package/lib/services/publisher-analytics-service.d.ts +128 -0
  110. package/lib/services/publisher-analytics-service.d.ts.map +1 -0
  111. package/lib/services/publisher-event-service.d.ts +48 -0
  112. package/lib/services/publisher-event-service.d.ts.map +1 -0
  113. package/lib/services/publisher-event-service.js +296 -0
  114. package/lib/services/publisher-event-service.js.map +1 -0
  115. package/lib/services/publisher-service-context.d.ts +1 -0
  116. package/lib/services/publisher-service-context.d.ts.map +1 -0
  117. package/lib/services/publisher-service.d.ts +62 -0
  118. package/lib/services/publisher-service.d.ts.map +1 -0
  119. package/lib/services/publisher-service.js +135 -0
  120. package/lib/services/publisher-service.js.map +1 -0
  121. package/lib/store/index.d.ts +1 -1
  122. package/lib/store/index.d.ts.map +1 -1
  123. package/lib/store/models/index.d.ts +2 -1
  124. package/lib/store/models/index.d.ts.map +1 -1
  125. package/lib/store/models/installed-extension-model.d.ts +4 -0
  126. package/lib/store/models/installed-extension-model.d.ts.map +1 -0
  127. package/lib/store/models/installed-extension-model.js +269 -0
  128. package/lib/store/models/installed-extension-model.js.map +1 -0
  129. package/lib/store/models/publisher-event-model.d.ts +11 -0
  130. package/lib/store/models/publisher-event-model.d.ts.map +1 -0
  131. package/lib/store/models/publisher-model.d.ts +5 -0
  132. package/lib/store/models/publisher-model.d.ts.map +1 -0
  133. package/lib/store/models/publisher-model.js +117 -0
  134. package/lib/store/models/publisher-model.js.map +1 -0
  135. package/lib/store/models/publisher-stats-model.d.ts +1 -0
  136. package/lib/store/models/publisher-stats-model.d.ts.map +1 -0
  137. package/lib/store/repositories/index.d.ts +3 -0
  138. package/lib/store/repositories/index.d.ts.map +1 -0
  139. package/lib/store/repositories/installed-extension-repository.d.ts +77 -0
  140. package/lib/store/repositories/installed-extension-repository.d.ts.map +1 -0
  141. package/lib/store/repositories/installed-extension-repository.js +462 -0
  142. package/lib/store/repositories/installed-extension-repository.js.map +1 -0
  143. package/lib/store/repositories/publisher-analytics-repository.d.ts +1 -0
  144. package/lib/store/repositories/publisher-analytics-repository.d.ts.map +1 -0
  145. package/lib/store/repositories/publisher-repository.d.ts +19 -0
  146. package/lib/store/repositories/publisher-repository.d.ts.map +1 -0
  147. package/lib/store/repositories/publisher-repository.js +87 -0
  148. package/lib/store/repositories/publisher-repository.js.map +1 -0
  149. package/lib/templates/constants/DB_COLL_NAMES.ts.template +5 -0
  150. package/lib/templates/constants/SERVER_TYPES.ts.template +10 -4
  151. package/lib/templates/repositories/ExtensionGalleryRepository.ts.template +44 -0
  152. package/lib/templates/repositories/InstalledExtensionRepository.ts.template +99 -0
  153. package/lib/templates/repositories/MarketplacePublisherRepository.ts.template +24 -0
  154. package/lib/templates/repositories/RegistryExtensionRepository.ts.template +10 -15
  155. package/lib/templates/services/ExtensionGalleryDataLoader.ts.template +2 -0
  156. package/lib/templates/services/ExtensionGalleryService.ts.template +79 -0
  157. package/lib/templates/services/InstalledExtensionDataLoader.ts.template +2 -0
  158. package/lib/templates/services/InstalledExtensionService.ts.template +199 -0
  159. package/lib/templates/services/MarketplacePublisherService.ts.template +51 -0
  160. package/lib/templates/services/PublisherDataLoader.ts.template +3 -0
  161. package/lib/templates/services/PublisherEventService.ts.template +56 -0
  162. package/lib/templates/services/RegistryExtensionService.ts.template +62 -18
  163. package/lib/tests/extension-integration.test.d.ts +1 -0
  164. package/lib/tests/extension-integration.test.d.ts.map +1 -0
  165. package/lib/tests/install-extension-graphql.test.d.ts +2 -0
  166. package/lib/tests/install-extension-graphql.test.d.ts.map +1 -0
  167. package/lib/tests/test-extension-services.d.ts +1 -0
  168. package/lib/tests/test-extension-services.d.ts.map +1 -0
  169. package/lib/utils/publisherValidation.d.ts +23 -0
  170. package/lib/utils/publisherValidation.d.ts.map +1 -0
  171. package/lib/utils/publisherValidation.js +144 -0
  172. package/lib/utils/publisherValidation.js.map +1 -0
  173. package/package.json +16 -7
  174. package/lib/graphql/resolvers/resolvers.d.ts +0 -2
  175. package/lib/graphql/resolvers/resolvers.d.ts.map +0 -1
  176. package/lib/graphql/resolvers/resolvers.js +0 -167
  177. package/lib/graphql/resolvers/resolvers.js.map +0 -1
  178. package/lib/graphql/schemas/extension.graphql +0 -57
  179. package/lib/graphql/schemas/extension.graphql.js +0 -1
  180. package/lib/graphql/schemas/extension.graphql.js.map +0 -1
  181. package/lib/services/extension-service.d.ts +0 -54
  182. package/lib/services/extension-service.d.ts.map +0 -1
  183. package/lib/services/extension-service.js +0 -42
  184. package/lib/services/extension-service.js.map +0 -1
  185. package/lib/store/models/registry-extension-model.d.ts +0 -10
  186. package/lib/store/models/registry-extension-model.d.ts.map +0 -1
  187. package/lib/store/models/registry-extension-model.js +0 -62
  188. package/lib/store/models/registry-extension-model.js.map +0 -1
  189. package/lib/store/repository/index.d.ts +0 -2
  190. package/lib/store/repository/index.d.ts.map +0 -1
  191. package/lib/store/repository/registry-extension-repository.d.ts +0 -31
  192. package/lib/store/repository/registry-extension-repository.d.ts.map +0 -1
  193. package/lib/store/repository/registry-extension-repository.js +0 -135
  194. package/lib/store/repository/registry-extension-repository.js.map +0 -1
@@ -0,0 +1,99 @@
1
+ import { IBaseMongoRepository, IInstalledExtensionModel, AsDomainType } from 'common/server';
2
+ import {
3
+ ICreateInstalledExtensionInput,
4
+ IUpdateInstalledExtensionInput,
5
+ IInstalledExtensionFilter,
6
+ } from '../services/InstalledExtensionService';
7
+
8
+ /**
9
+ * Repository interface for installed extensions data access layer
10
+ */
11
+ export interface IInstalledExtensionRepository extends IBaseMongoRepository<IInstalledExtensionModel> {
12
+ /**
13
+ * Create a new installed extension record
14
+ */
15
+ create<T = ICreateInstalledExtensionInput>(data: T): Promise<AsDomainType<IInstalledExtensionModel>>;
16
+
17
+ /**
18
+ * Update an existing installed extension
19
+ */
20
+ updateExtension(
21
+ orgId: string,
22
+ extensionId: string,
23
+ update: IUpdateInstalledExtensionInput,
24
+ ): Promise<AsDomainType<IInstalledExtensionModel> | null>;
25
+
26
+ /**
27
+ * Find a specific installed extension by organization and extension ObjectIds
28
+ */
29
+ findByOrgAndExtensionId(orgId: string, extensionId: string): Promise<AsDomainType<IInstalledExtensionModel> | null>;
30
+
31
+ /**
32
+ * Find installed extensions with optional filtering
33
+ */
34
+ findExtensions(filter: IInstalledExtensionFilter): Promise<AsDomainType<IInstalledExtensionModel>[]>;
35
+
36
+ /**
37
+ * Find all installed extensions for a specific extension ObjectId
38
+ */
39
+ findByExtensionId(extensionId: string): Promise<AsDomainType<IInstalledExtensionModel>[]>;
40
+
41
+ /**
42
+ * Delete an installed extension
43
+ */
44
+ deleteExtension(orgId: string, extensionId: string): Promise<boolean>;
45
+
46
+ /**
47
+ * Get installed extensions joined with registry information
48
+ */
49
+ findWithRegistryInfo(filter: IInstalledExtensionFilter): Promise<any[]>;
50
+
51
+ /**
52
+ * Check if extension exists for organization
53
+ */
54
+ exists(orgId: string, extensionId: string): Promise<boolean>;
55
+
56
+ /**
57
+ * Bulk update multiple extensions (useful for policy changes or admin actions)
58
+ */
59
+ bulkUpdateExtensions(
60
+ orgId: string,
61
+ filter: Partial<IInstalledExtensionFilter>,
62
+ update: Partial<IUpdateInstalledExtensionInput>,
63
+ ): Promise<number>;
64
+
65
+ /**
66
+ * Get extension dependency graph for an organization
67
+ */
68
+ getDependencyGraph(orgId: string): Promise<{
69
+ extensions: AsDomainType<IInstalledExtensionModel>[];
70
+ dependencies: Array<{
71
+ extensionId: string;
72
+ dependsOn: string[];
73
+ dependents: string[];
74
+ }>;
75
+ }>;
76
+
77
+ /**
78
+ * Count installed extensions matching filter
79
+ */
80
+ countExtensions(filter: IInstalledExtensionFilter): Promise<number>;
81
+
82
+ /**
83
+ * Find extensions that need registry sync (stale registry status)
84
+ */
85
+ findStaleExtensions(orgId: string, maxAge: number): Promise<AsDomainType<IInstalledExtensionModel>[]>;
86
+
87
+ /**
88
+ * Update registry status for multiple extensions
89
+ */
90
+ syncRegistryStatus(
91
+ updates: Array<{
92
+ orgId: string;
93
+ extensionId: string;
94
+ registryStatus: string;
95
+ latestVersion?: string;
96
+ isOrphaned: boolean;
97
+ }>,
98
+ ): Promise<void>;
99
+ }
@@ -0,0 +1,24 @@
1
+ import { IBaseMongoRepository, IMarketplacePublisherModel, AsDomainType } from 'common/server';
2
+
3
+ export interface IMarketplacePublisherRepository extends IBaseMongoRepository<IMarketplacePublisherModel> {
4
+ findByPublisherName(publisherName: string): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
5
+ findPublishers(
6
+ search?: string,
7
+ orderBy?: string,
8
+ orderDirection?: 'ASC' | 'DESC',
9
+ limit?: number,
10
+ offset?: number,
11
+ ): Promise<{
12
+ publishers: AsDomainType<IMarketplacePublisherModel>[];
13
+ totalCount: number;
14
+ }>;
15
+ updatePublisherStats(
16
+ publisherId: string,
17
+ stats: {
18
+ extensionCount?: number;
19
+ totalInstalls?: number;
20
+ averageRating?: number;
21
+ },
22
+ ): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
23
+ verifyPublisher(publisherId: string): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
24
+ }
@@ -1,24 +1,19 @@
1
- import { IPublishRequest, IExtensionRelease, IRegistryExtension } from 'common/server';
1
+ import { IMarketplacePublishExtensionInput, IExtensionRelease, IBaseMongoRepository, IRegistryExtensionModel, IExtensionReleaseModel, AsDomainType } from 'common/server';
2
2
 
3
- export interface IRepositoryDefault {
4
- updatedAt?: string;
5
- createdAt?: string;
6
- }
7
-
8
- export interface IRegistryExtensionRepository {
9
- extensionReleases(extensionID: string): Promise<IExtensionRelease[]>;
3
+ export interface IRegistryExtensionRepository extends IBaseMongoRepository<IRegistryExtensionModel> {
4
+ extensionReleases(extensionSlug: string): Promise<AsDomainType<IExtensionReleaseModel>[]>;
10
5
 
11
- createExtension(publisherId: string, name: string): Promise<IRegistryExtension & IRepositoryDefault>;
6
+ createExtension(publisherId: string, name: string): Promise<AsDomainType<IRegistryExtensionModel>>;
12
7
 
13
- updateExtensionName(extensionID: string, name: string);
8
+ updateExtensionName(extensionSlug: string, name: string): Promise<AsDomainType<IRegistryExtensionModel>>;
14
9
 
15
- updateExtension(extensionID: string, update: { installed?: boolean }): Promise<IRegistryExtension & IRepositoryDefault>;
10
+ updateExtension(extensionSlug: string, update: { installed?: boolean }): Promise<AsDomainType<IRegistryExtensionModel>>;
16
11
 
17
- deleteExtension(extensionID: string): boolean | Promise<boolean>;
12
+ deleteExtension(extensionSlug: string): boolean | Promise<boolean>;
18
13
 
19
- publishExtension(request: IPublishRequest);
14
+ publishExtension(request: IMarketplacePublishExtensionInput): Promise<AsDomainType<IRegistryExtensionModel>>;
20
15
 
21
- findExtensions(first: number, query: string, local?: boolean, remote?: boolean, prioritizeExtensionIDs?: string[]);
16
+ findExtensions(first: number, query: string, local?: boolean, remote?: boolean, prioritizeExtensionIDs?: string[]): Promise<AsDomainType<IRegistryExtensionModel>[]>;
22
17
 
23
- findExtension(extensionID: string);
18
+ findExtension(extensionSlug: string): Promise<AsDomainType<IRegistryExtensionModel>>;
24
19
  }
@@ -0,0 +1,2 @@
1
+ import { IGalleryExtension, IDataLoader } from 'common/server';
2
+ export type IExtensionGalleryDataLoader = IDataLoader<IGalleryExtension>;
@@ -0,0 +1,79 @@
1
+ // from package: marketplace-server
2
+ import {
3
+ IGalleryExtension,
4
+ IExtensionIdentifier,
5
+ IExtensionManifest,
6
+ IGalleryPager,
7
+ AsDomainType,
8
+ IRegistryExtensionModel,
9
+ } from 'common/server';
10
+
11
+ /**
12
+ * Query options interface for gallery searches
13
+ */
14
+ export interface IQueryOptions {
15
+ text?: string;
16
+ pageSize?: number;
17
+ }
18
+
19
+ /**
20
+ * Service interface for managing extension gallery
21
+ * IMPORTANT: All service methods that return domain entities MUST use AsDomainType<IEntityModel>
22
+ * This ensures proper type compatibility between MongoDB models and GraphQL domain types
23
+ */
24
+ export interface IExtensionGalleryService {
25
+ /**
26
+ * Check if gallery service is enabled
27
+ */
28
+ isEnabled(): boolean;
29
+
30
+ /**
31
+ * Query extensions in gallery
32
+ */
33
+ query(options?: IQueryOptions): Promise<IGalleryPager>;
34
+
35
+ /**
36
+ * Get a specific extension by identifier
37
+ */
38
+ getExtension(identifier: IExtensionIdentifier | string): Promise<IGalleryExtension | null>;
39
+
40
+ /**
41
+ * Download an extension
42
+ */
43
+ download(extension: IGalleryExtension): Promise<string>;
44
+
45
+ /**
46
+ * Get extension README content
47
+ */
48
+ getReadme(extension: IGalleryExtension): Promise<string>;
49
+
50
+ /**
51
+ * Get extension manifest
52
+ */
53
+ getManifest(extension: IGalleryExtension): Promise<IExtensionManifest | null>;
54
+
55
+ /**
56
+ * Get extension changelog
57
+ */
58
+ getChangelog(extension: IGalleryExtension): Promise<string>;
59
+
60
+ /**
61
+ * Get extension license
62
+ */
63
+ getLicense(extension: IGalleryExtension): Promise<string>;
64
+
65
+ /**
66
+ * Load compatible version of extension
67
+ */
68
+ loadCompatibleVersion(extension: IGalleryExtension): Promise<IGalleryExtension>;
69
+ }
70
+
71
+ /**
72
+ * This file augments the ServerContext interface from the central apollo-context.
73
+ * Through declaration merging, the extensionGalleryService will be added to the ServerContext.
74
+ */
75
+ declare module '../apollo-context' {
76
+ export interface ServerContext {
77
+ extensionGalleryService: IExtensionGalleryService;
78
+ }
79
+ }
@@ -0,0 +1,2 @@
1
+ import { IInstalledExtension, IDataLoader } from 'common/server';
2
+ export type IInstalledExtensionDataLoader = IDataLoader<IInstalledExtension>;
@@ -0,0 +1,199 @@
1
+ import {
2
+ IInstalledExtensionModel,
3
+ IInstallExtensionInput,
4
+ IExtensionPoliciesInput,
5
+ IExtensionSettingsInput,
6
+ AsDomainType,
7
+ IBaseService,
8
+ } from 'common/server';
9
+
10
+ /**
11
+ * Input type for creating installed extensions with additional server-side fields
12
+ */
13
+ export interface ICreateInstalledExtensionInput extends IInstallExtensionInput {
14
+ extensionId: string; // ObjectId reference to extension registry
15
+ orgId: string; // Organization ID
16
+ installedVersion: string;
17
+ installedBy: string; // User ObjectId as string
18
+ }
19
+
20
+ /**
21
+ * Input type for updating installed extensions
22
+ */
23
+ export interface IUpdateInstalledExtensionInput {
24
+ status?: string;
25
+ lifecycle?: {
26
+ registryStatus?: string;
27
+ isOrphaned?: boolean;
28
+ deprecationWarningShown?: boolean;
29
+ autoUpdateBlocked?: boolean;
30
+ lastRegistryCheck?: string;
31
+ };
32
+ policies?: IExtensionPoliciesInput;
33
+ settings?: IExtensionSettingsInput;
34
+ runtime?: {
35
+ activationState?: string;
36
+ lastActivated?: Date;
37
+ lastDeactivated?: Date;
38
+ activationError?: {
39
+ message: string;
40
+ code: string;
41
+ timestamp: string;
42
+ };
43
+ metrics?: {
44
+ activationTime: number;
45
+ memoryUsage: number;
46
+ lastMeasured: string;
47
+ };
48
+ };
49
+ lastUpdatedBy?: string;
50
+ availableVersion?: string;
51
+ }
52
+
53
+ /**
54
+ * Filter input for querying installed extensions
55
+ */
56
+ export interface IInstalledExtensionFilter {
57
+ accountId?: string; // Account ID for filtering extensions by account
58
+ orgId?: string; // Organization ID for filtering extensions by organization
59
+ extension?: string; // ObjectId as string reference to extension registry
60
+ status?: string[];
61
+ 'lifecycle.registryStatus'?: string[];
62
+ 'lifecycle.isOrphaned'?: boolean;
63
+ 'settings.effectiveEnabled'?: boolean;
64
+ installedBy?: string;
65
+ }
66
+
67
+ /**
68
+ * Service interface for managing installed extensions
69
+ * This service handles the lifecycle of extensions after they've been installed from the registry
70
+ */
71
+ export interface IInstalledExtensionService extends IBaseService<IInstalledExtensionModel> {
72
+ /**
73
+ * Install a new extension from the registry
74
+ */
75
+ installExtension(input: ICreateInstalledExtensionInput, tenantId: string): Promise<AsDomainType<IInstalledExtensionModel>>;
76
+
77
+ /**
78
+ * Uninstall an extension - now supports accountId and orgId based filtering
79
+ */
80
+ uninstallExtension(
81
+ orgId: string,
82
+ extensionSlug: string,
83
+ uninstalledBy: string,
84
+ tenantId: string
85
+ ): Promise<boolean>;
86
+
87
+ /**
88
+ * Update an installed extension's configuration or status - now supports accountId and orgId based filtering
89
+ */
90
+ updateInstalledExtension(
91
+ orgId: string,
92
+ extensionSlug: string,
93
+ update: IUpdateInstalledExtensionInput,
94
+ tenantId: string,
95
+ ): Promise<AsDomainType<IInstalledExtensionModel>>;
96
+
97
+ /**
98
+ * Get a specific installed extension - now supports accountId and orgId based filtering
99
+ */
100
+ getInstalledExtension(
101
+ orgId: string,
102
+ extensionSlug: string,
103
+ ): Promise<AsDomainType<IInstalledExtensionModel> | null>;
104
+
105
+ /**
106
+ * Get all installed extensions with optional filtering - now supports accountId and orgId based filtering
107
+ */
108
+ getInstalledExtensions(filter: IInstalledExtensionFilter): Promise<AsDomainType<IInstalledExtensionModel>[]>;
109
+
110
+ /**
111
+ * Get all installed extensions for a specific extension by extensionSlug
112
+ * Useful for finding all organizations that have installed a specific extension
113
+ */
114
+ getInstalledExtensionsBySlug(extensionSlug: string): Promise<AsDomainType<IInstalledExtensionModel>[]>;
115
+
116
+ /**
117
+ * Enable/disable an installed extension - now supports accountId and orgId based filtering
118
+ */
119
+ toggleExtension(
120
+ orgId: string,
121
+ extensionSlug: string,
122
+ enabled: boolean,
123
+ toggledBy: string,
124
+ tenantId: string,
125
+ ): Promise<AsDomainType<IInstalledExtensionModel>>;
126
+
127
+ /**
128
+ * Update extension settings/configuration - now supports accountId and orgId based filtering
129
+ */
130
+ updateExtensionSettings(
131
+ orgId: string,
132
+ extensionSlug: string,
133
+ userConfig: Record<string, unknown>,
134
+ updatedBy: string,
135
+ tenantId: string,
136
+ ): Promise<AsDomainType<IInstalledExtensionModel>>;
137
+
138
+ /**
139
+ * Check for extension updates and return available updates - now supports accountId and orgId based filtering
140
+ */
141
+ checkForUpdates(
142
+ orgId: string,
143
+ extensionSlug?: string,
144
+ ): Promise<
145
+ Array<{
146
+ extensionId: string;
147
+ extensionSlug: string;
148
+ currentVersion: string;
149
+ availableVersion: string;
150
+ isSecurityUpdate: boolean;
151
+ }>
152
+ >;
153
+
154
+ /**
155
+ * Update an extension to a newer version - now supports accountId and orgId based filtering
156
+ */
157
+ updateExtensionVersion(
158
+ orgId: string,
159
+ extensionSlug: string,
160
+ targetVersion: string,
161
+ updatedBy: string,
162
+ tenantId: string
163
+ ): Promise<AsDomainType<IInstalledExtensionModel>>;
164
+
165
+ /**
166
+ * Sync installed extensions with registry status (for orphaned, deprecated, etc.) - now supports accountId and orgId based filtering
167
+ */
168
+ syncWithRegistry(orgId: string, tenantId: string): Promise<void>;
169
+
170
+ /**
171
+ * Get extensions that need attention (deprecated, orphaned, security updates, etc.) - now supports accountId and orgId based filtering
172
+ */
173
+ getExtensionsNeedingAttention(orgId: string): Promise<AsDomainType<IInstalledExtensionModel>[]>;
174
+
175
+ /**
176
+ * Clean up deprecated or removed extensions based on policies - now supports accountId and orgId based filtering
177
+ */
178
+ cleanupExtensions(
179
+ orgId: string,
180
+ tenantId: string,
181
+ dryRun?: boolean,
182
+ ): Promise<{
183
+ removed: string[]; // Array of extension ObjectIds
184
+ deprecated: string[]; // Array of extension ObjectIds
185
+ warnings: string[];
186
+ }>;
187
+
188
+ /**
189
+ * Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry
190
+ */
191
+ cleanupOrphanedExtensions(
192
+ orgId: string,
193
+ tenantId: string,
194
+ dryRun?: boolean,
195
+ ): Promise<{
196
+ removed: string[]; // Array of extension slugs
197
+ warnings: string[];
198
+ }>;
199
+ }
@@ -0,0 +1,51 @@
1
+ import { IBaseService, IMarketplacePublisherModel, AsDomainType } from 'common/server';
2
+
3
+ export interface IMarketplacePublisherService extends IBaseService<IMarketplacePublisherModel> {
4
+ findById(id: string): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
5
+ findByPublisherName(publisherName: string): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
6
+ findPublishers(
7
+ search?: string,
8
+ orderBy?: string,
9
+ orderDirection?: 'ASC' | 'DESC',
10
+ first?: number,
11
+ after?: number,
12
+ ): Promise<{
13
+ publishers: AsDomainType<IMarketplacePublisherModel>[];
14
+ totalCount: number;
15
+ }>;
16
+ createPublisher(data: {
17
+ displayName: string;
18
+ publisherName: string;
19
+ description?: string;
20
+ website?: string;
21
+ domain?: string;
22
+ tenant?: string;
23
+ }): Promise<AsDomainType<IMarketplacePublisherModel>>;
24
+ updatePublisher(
25
+ publisherId: string,
26
+ data: {
27
+ displayName?: string;
28
+ description?: string;
29
+ website?: string;
30
+ avatarUrl?: string;
31
+ tenant?: string;
32
+ },
33
+ ): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
34
+ updatePublisherStats(
35
+ publisherId: string,
36
+ stats: {
37
+ extensionCount?: number;
38
+ totalInstalls?: number;
39
+ averageRating?: number;
40
+ },
41
+ ): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
42
+ verifyPublisher(publisherId: string): Promise<AsDomainType<IMarketplacePublisherModel> | null>;
43
+ getPublisherStats(publisherId: string): Promise<{
44
+ totalExtensions: number;
45
+ totalDownloads: number;
46
+ totalInstallations: number;
47
+ averageRating: number;
48
+ verifiedCount: number;
49
+ topExtension?: unknown; // TODO: Should be IRegistryExtension when available
50
+ } | null>;
51
+ }
@@ -0,0 +1,3 @@
1
+ import { IMarketplacePublisherModel, IDataLoader } from 'common/server';
2
+
3
+ export type IPublisherDataLoader = IDataLoader<IMarketplacePublisherModel>;
@@ -0,0 +1,56 @@
1
+ // from package: marketplace-server
2
+
3
+ /**
4
+ * Service interface for managing publisher analytics events
5
+ */
6
+ export interface IPublisherEventService {
7
+ recordEvent(event: {
8
+ publisherId: string;
9
+ extensionId?: string;
10
+ eventType: 'download' | 'install' | 'view' | 'rating';
11
+ value?: number;
12
+ metadata?: Record<string, unknown>;
13
+ }): Promise<void>;
14
+
15
+ getPublisherStats(publisherId: string): Promise<{
16
+ totalDownloads: number;
17
+ totalInstalls: number;
18
+ totalViews: number;
19
+ totalRatings: number;
20
+ averageRating: number;
21
+ extensionCount: number;
22
+ lastUpdated: Date;
23
+ }>;
24
+
25
+ getPublisherAnalytics(
26
+ publisherId: string,
27
+ startDate: Date,
28
+ endDate: Date,
29
+ granularity: string,
30
+ ): Promise<
31
+ Array<{
32
+ date: Date;
33
+ downloads: number;
34
+ installs: number;
35
+ views: number;
36
+ ratings: number;
37
+ averageRating: number;
38
+ uniqueUsers: number;
39
+ }>
40
+ >;
41
+
42
+ getPublisherTrends(
43
+ publisherId: string,
44
+ days: number,
45
+ ): Promise<{
46
+ downloadTrend: string;
47
+ downloadChange: number;
48
+ installTrend: string;
49
+ installChange: number;
50
+ viewTrend: string;
51
+ viewChange: number;
52
+ ratingTrend: string;
53
+ ratingChange: number;
54
+ trendScore: number;
55
+ }>;
56
+ }
@@ -1,19 +1,63 @@
1
- import { IPublishRequest, IExtensionRelease,IRegistryExtension } from 'common/server';
2
-
3
- export interface IRegistryExtensionService {
4
- extensionReleases(extensionID: string): Promise<IExtensionRelease[]>;
5
-
6
- createExtension(publisherId: string, name: string): Promise<IRegistryExtension>;
7
-
8
- updateExtensionName(extensionID: string, name: string);
9
-
10
- updateExtension(extensionID: string, update: { installed?: boolean }): Promise<IRegistryExtension>;
11
-
12
- deleteExtension(extensionID: string): boolean | Promise<boolean>;
13
-
14
- publishExtension(request: IPublishRequest);
15
-
16
- findExtensions(first: number, query: string, local?: boolean, remote?: boolean, prioritizeExtensionIDs?: string[]);
17
-
18
- findExtension(extensionID: string);
1
+ import { IMarketplacePublishExtensionInput, IExtensionRelease, IBaseService, IRegistryExtensionModel, AsDomainType } from 'common/server';
2
+
3
+ export interface IRegistryExtensionService extends IBaseService<AsDomainType<IRegistryExtensionModel>> {
4
+ extensionReleases(extensionSlug: string): Promise<IExtensionRelease[]>;
5
+
6
+ createExtension(publisherId: string, name: string): Promise<AsDomainType<IRegistryExtensionModel>>;
7
+
8
+ updateExtensionName(extensionSlug: string, name: string): Promise<AsDomainType<IRegistryExtensionModel>>;
9
+
10
+ updateExtension(extensionSlug: string, update: { installed?: boolean }): Promise<AsDomainType<IRegistryExtensionModel>>;
11
+
12
+ deleteExtension(extensionSlug: string): boolean | Promise<boolean>;
13
+
14
+ publishExtension(request: IMarketplacePublishExtensionInput): Promise<AsDomainType<IRegistryExtensionModel>>;
15
+
16
+ findExtensions(first: number, query: string, local?: boolean, remote?: boolean, prioritizeExtensionIDs?: string[]): Promise<AsDomainType<IRegistryExtensionModel>[]>;
17
+
18
+ findExtension(extensionSlug: string): Promise<AsDomainType<IRegistryExtensionModel>>;
19
+
20
+ // Enhanced marketplace features
21
+ formSubmission(input: {
22
+ extensionSlug: string;
23
+ formData: string;
24
+ submissionType: string;
25
+ metadata?: string;
26
+ }): Promise<{
27
+ success: boolean;
28
+ message?: string;
29
+ errors?: string[];
30
+ submissionId?: string;
31
+ data?: string;
32
+ }>;
33
+
34
+ validateExtension(input: {
35
+ manifest: string;
36
+ bundle?: string;
37
+ sourceMap?: string;
38
+ extensionSlug?: string;
39
+ version?: string;
40
+ }): Promise<{
41
+ isValid: boolean;
42
+ errors: Array<{ field: string; message: string; code?: string }>;
43
+ warnings: Array<{ field: string; message: string; code?: string }>;
44
+ metadata?: string;
45
+ }>;
46
+
47
+ publishExtensionEnhanced(input: {
48
+ extensionSlug: string;
49
+ manifest: string;
50
+ bundle: string;
51
+ sourceMap?: string;
52
+ version: string;
53
+ releaseNotes?: string;
54
+ force?: boolean;
55
+ preRelease?: boolean;
56
+ }): Promise<{
57
+ success: boolean;
58
+ extension?: AsDomainType<IRegistryExtensionModel>;
59
+ message?: string;
60
+ errors?: string[];
61
+ releaseId?: string;
62
+ }>;
19
63
  }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=extension-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-integration.test.d.ts","sourceRoot":"","sources":["../../src/tests/extension-integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=install-extension-graphql.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-extension-graphql.test.d.ts","sourceRoot":"","sources":["../../src/tests/install-extension-graphql.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=test-extension-services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-extension-services.d.ts","sourceRoot":"","sources":["../../src/tests/test-extension-services.ts"],"names":[],"mappings":""}