@powerhousedao/service-offering 1.0.0-dev.4 → 1.0.0-dev.6

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 (235) hide show
  1. package/dist/document-models/facet/v1/actions.d.ts +3 -1
  2. package/dist/document-models/facet/v1/actions.d.ts.map +1 -1
  3. package/dist/document-models/facet/v1/gen/controller.d.ts +4 -0
  4. package/dist/document-models/facet/v1/gen/controller.d.ts.map +1 -0
  5. package/dist/document-models/facet/v1/gen/controller.js +3 -0
  6. package/dist/document-models/facet/v1/gen/document-model.d.ts.map +1 -1
  7. package/dist/document-models/facet/v1/gen/document-model.js +31 -7
  8. package/dist/document-models/facet/v1/gen/document-schema.d.ts +6 -6
  9. package/dist/document-models/facet/v1/gen/index.d.ts +1 -0
  10. package/dist/document-models/facet/v1/gen/index.d.ts.map +1 -1
  11. package/dist/document-models/facet/v1/gen/index.js +1 -0
  12. package/dist/document-models/facet/v1/gen/option-management/error.d.ts +27 -1
  13. package/dist/document-models/facet/v1/gen/option-management/error.d.ts.map +1 -1
  14. package/dist/document-models/facet/v1/gen/option-management/error.js +23 -1
  15. package/dist/document-models/facet/v1/gen/ph-factories.js +2 -2
  16. package/dist/document-models/facet/v1/gen/schema/types.d.ts +2 -2
  17. package/dist/document-models/facet/v1/gen/schema/types.d.ts.map +1 -1
  18. package/dist/document-models/facet/v1/gen/schema/zod.js +2 -2
  19. package/dist/document-models/facet/v1/gen/utils.js +2 -2
  20. package/dist/document-models/facet/v1/module.d.ts +1 -1
  21. package/dist/document-models/facet/v1/module.d.ts.map +1 -1
  22. package/dist/document-models/facet/v1/module.js +4 -1
  23. package/dist/document-models/resource-instance/v1/actions.d.ts +4 -1
  24. package/dist/document-models/resource-instance/v1/actions.d.ts.map +1 -1
  25. package/dist/document-models/resource-instance/v1/gen/configuration-management/error.d.ts +34 -1
  26. package/dist/document-models/resource-instance/v1/gen/configuration-management/error.d.ts.map +1 -1
  27. package/dist/document-models/resource-instance/v1/gen/configuration-management/error.js +32 -1
  28. package/dist/document-models/resource-instance/v1/gen/controller.d.ts +4 -0
  29. package/dist/document-models/resource-instance/v1/gen/controller.d.ts.map +1 -0
  30. package/dist/document-models/resource-instance/v1/gen/controller.js +3 -0
  31. package/dist/document-models/resource-instance/v1/gen/document-model.d.ts.map +1 -1
  32. package/dist/document-models/resource-instance/v1/gen/document-model.js +222 -70
  33. package/dist/document-models/resource-instance/v1/gen/document-schema.d.ts +0 -6
  34. package/dist/document-models/resource-instance/v1/gen/document-schema.d.ts.map +1 -1
  35. package/dist/document-models/resource-instance/v1/gen/index.d.ts +1 -0
  36. package/dist/document-models/resource-instance/v1/gen/index.d.ts.map +1 -1
  37. package/dist/document-models/resource-instance/v1/gen/index.js +1 -0
  38. package/dist/document-models/resource-instance/v1/gen/instance-management/actions.d.ts +6 -2
  39. package/dist/document-models/resource-instance/v1/gen/instance-management/actions.d.ts.map +1 -1
  40. package/dist/document-models/resource-instance/v1/gen/instance-management/creators.d.ts +3 -2
  41. package/dist/document-models/resource-instance/v1/gen/instance-management/creators.d.ts.map +1 -1
  42. package/dist/document-models/resource-instance/v1/gen/instance-management/creators.js +2 -1
  43. package/dist/document-models/resource-instance/v1/gen/instance-management/error.d.ts +98 -1
  44. package/dist/document-models/resource-instance/v1/gen/instance-management/error.d.ts.map +1 -1
  45. package/dist/document-models/resource-instance/v1/gen/instance-management/error.js +112 -1
  46. package/dist/document-models/resource-instance/v1/gen/instance-management/operations.d.ts +2 -1
  47. package/dist/document-models/resource-instance/v1/gen/instance-management/operations.d.ts.map +1 -1
  48. package/dist/document-models/resource-instance/v1/gen/ph-factories.d.ts.map +1 -1
  49. package/dist/document-models/resource-instance/v1/gen/ph-factories.js +0 -2
  50. package/dist/document-models/resource-instance/v1/gen/reducer.d.ts.map +1 -1
  51. package/dist/document-models/resource-instance/v1/gen/reducer.js +6 -1
  52. package/dist/document-models/resource-instance/v1/gen/schema/types.d.ts +3 -3
  53. package/dist/document-models/resource-instance/v1/gen/schema/types.d.ts.map +1 -1
  54. package/dist/document-models/resource-instance/v1/gen/schema/zod.d.ts +2 -1
  55. package/dist/document-models/resource-instance/v1/gen/schema/zod.d.ts.map +1 -1
  56. package/dist/document-models/resource-instance/v1/gen/schema/zod.js +5 -3
  57. package/dist/document-models/resource-instance/v1/gen/utils.d.ts.map +1 -1
  58. package/dist/document-models/resource-instance/v1/gen/utils.js +0 -2
  59. package/dist/document-models/resource-instance/v1/module.d.ts +1 -1
  60. package/dist/document-models/resource-instance/v1/module.d.ts.map +1 -1
  61. package/dist/document-models/resource-instance/v1/module.js +4 -1
  62. package/dist/document-models/resource-instance/v1/src/reducers/configuration-management.d.ts.map +1 -1
  63. package/dist/document-models/resource-instance/v1/src/reducers/configuration-management.js +57 -53
  64. package/dist/document-models/resource-instance/v1/src/reducers/instance-management.d.ts.map +1 -1
  65. package/dist/document-models/resource-instance/v1/src/reducers/instance-management.js +57 -21
  66. package/dist/document-models/resource-instance/v1/tests/instance-management.test.js +11 -1
  67. package/dist/document-models/resource-template/v1/actions.d.ts +3 -1
  68. package/dist/document-models/resource-template/v1/actions.d.ts.map +1 -1
  69. package/dist/document-models/resource-template/v1/gen/audience-management/error.d.ts +20 -1
  70. package/dist/document-models/resource-template/v1/gen/audience-management/error.d.ts.map +1 -1
  71. package/dist/document-models/resource-template/v1/gen/audience-management/error.js +16 -1
  72. package/dist/document-models/resource-template/v1/gen/controller.d.ts +4 -0
  73. package/dist/document-models/resource-template/v1/gen/controller.d.ts.map +1 -0
  74. package/dist/document-models/resource-template/v1/gen/controller.js +3 -0
  75. package/dist/document-models/resource-template/v1/gen/document-model.d.ts.map +1 -1
  76. package/dist/document-models/resource-template/v1/gen/document-model.js +207 -89
  77. package/dist/document-models/resource-template/v1/gen/document-schema.d.ts +12 -12
  78. package/dist/document-models/resource-template/v1/gen/facet-targeting/error.d.ts +27 -1
  79. package/dist/document-models/resource-template/v1/gen/facet-targeting/error.d.ts.map +1 -1
  80. package/dist/document-models/resource-template/v1/gen/facet-targeting/error.js +23 -1
  81. package/dist/document-models/resource-template/v1/gen/index.d.ts +1 -0
  82. package/dist/document-models/resource-template/v1/gen/index.d.ts.map +1 -1
  83. package/dist/document-models/resource-template/v1/gen/index.js +1 -0
  84. package/dist/document-models/resource-template/v1/gen/option-group-management/error.d.ts +27 -1
  85. package/dist/document-models/resource-template/v1/gen/option-group-management/error.d.ts.map +1 -1
  86. package/dist/document-models/resource-template/v1/gen/option-group-management/error.js +23 -1
  87. package/dist/document-models/resource-template/v1/gen/ph-factories.js +3 -3
  88. package/dist/document-models/resource-template/v1/gen/schema/types.d.ts +4 -4
  89. package/dist/document-models/resource-template/v1/gen/schema/types.d.ts.map +1 -1
  90. package/dist/document-models/resource-template/v1/gen/schema/zod.js +4 -4
  91. package/dist/document-models/resource-template/v1/gen/service-management/error.d.ts +51 -1
  92. package/dist/document-models/resource-template/v1/gen/service-management/error.d.ts.map +1 -1
  93. package/dist/document-models/resource-template/v1/gen/service-management/error.js +49 -1
  94. package/dist/document-models/resource-template/v1/gen/utils.js +3 -3
  95. package/dist/document-models/resource-template/v1/module.d.ts +1 -1
  96. package/dist/document-models/resource-template/v1/module.d.ts.map +1 -1
  97. package/dist/document-models/resource-template/v1/module.js +4 -1
  98. package/dist/document-models/resource-template/v1/src/reducers/option-group-management.d.ts.map +1 -1
  99. package/dist/document-models/resource-template/v1/src/reducers/option-group-management.js +2 -21
  100. package/dist/document-models/service-offering/v1/actions.d.ts +3 -1
  101. package/dist/document-models/service-offering/v1/actions.d.ts.map +1 -1
  102. package/dist/document-models/service-offering/v1/gen/controller.d.ts +4 -0
  103. package/dist/document-models/service-offering/v1/gen/controller.d.ts.map +1 -0
  104. package/dist/document-models/service-offering/v1/gen/controller.js +3 -0
  105. package/dist/document-models/service-offering/v1/gen/document-model.d.ts.map +1 -1
  106. package/dist/document-models/service-offering/v1/gen/document-model.js +421 -199
  107. package/dist/document-models/service-offering/v1/gen/document-schema.d.ts +9 -9
  108. package/dist/document-models/service-offering/v1/gen/index.d.ts +1 -0
  109. package/dist/document-models/service-offering/v1/gen/index.d.ts.map +1 -1
  110. package/dist/document-models/service-offering/v1/gen/index.js +1 -0
  111. package/dist/document-models/service-offering/v1/gen/offering/error.d.ts +41 -1
  112. package/dist/document-models/service-offering/v1/gen/offering/error.d.ts.map +1 -1
  113. package/dist/document-models/service-offering/v1/gen/offering/error.js +37 -1
  114. package/dist/document-models/service-offering/v1/gen/option-groups/error.d.ts +55 -1
  115. package/dist/document-models/service-offering/v1/gen/option-groups/error.d.ts.map +1 -1
  116. package/dist/document-models/service-offering/v1/gen/option-groups/error.js +53 -1
  117. package/dist/document-models/service-offering/v1/gen/ph-factories.js +3 -3
  118. package/dist/document-models/service-offering/v1/gen/schema/types.d.ts +134 -61
  119. package/dist/document-models/service-offering/v1/gen/schema/types.d.ts.map +1 -1
  120. package/dist/document-models/service-offering/v1/gen/schema/zod.d.ts +35 -10
  121. package/dist/document-models/service-offering/v1/gen/schema/zod.d.ts.map +1 -1
  122. package/dist/document-models/service-offering/v1/gen/schema/zod.js +182 -64
  123. package/dist/document-models/service-offering/v1/gen/services/error.d.ts +20 -1
  124. package/dist/document-models/service-offering/v1/gen/services/error.d.ts.map +1 -1
  125. package/dist/document-models/service-offering/v1/gen/services/error.js +16 -1
  126. package/dist/document-models/service-offering/v1/gen/tiers/error.d.ts +100 -1
  127. package/dist/document-models/service-offering/v1/gen/tiers/error.d.ts.map +1 -1
  128. package/dist/document-models/service-offering/v1/gen/tiers/error.js +106 -1
  129. package/dist/document-models/service-offering/v1/gen/utils.js +4 -4
  130. package/dist/document-models/service-offering/v1/module.d.ts +1 -1
  131. package/dist/document-models/service-offering/v1/module.d.ts.map +1 -1
  132. package/dist/document-models/service-offering/v1/module.js +4 -1
  133. package/dist/document-models/service-offering/v1/src/reducers/offering.d.ts.map +1 -1
  134. package/dist/document-models/service-offering/v1/src/reducers/offering.js +20 -12
  135. package/dist/document-models/service-offering/v1/src/reducers/option-groups.d.ts.map +1 -1
  136. package/dist/document-models/service-offering/v1/src/reducers/option-groups.js +157 -39
  137. package/dist/document-models/service-offering/v1/src/reducers/services.d.ts.map +1 -1
  138. package/dist/document-models/service-offering/v1/src/reducers/services.js +17 -14
  139. package/dist/document-models/service-offering/v1/src/reducers/tiers.d.ts.map +1 -1
  140. package/dist/document-models/service-offering/v1/src/reducers/tiers.js +111 -78
  141. package/dist/document-models/service-offering/v1/src/utils.d.ts +60 -1
  142. package/dist/document-models/service-offering/v1/src/utils.d.ts.map +1 -1
  143. package/dist/document-models/service-offering/v1/src/utils.js +173 -1
  144. package/dist/document-models/service-offering/v1/tests/option-groups.test.js +1 -1
  145. package/dist/document-models/service-offering/v1/utils.d.ts +3 -0
  146. package/dist/document-models/service-offering/v1/utils.d.ts.map +1 -1
  147. package/dist/document-models/subscription-instance/v1/actions.d.ts +3 -1
  148. package/dist/document-models/subscription-instance/v1/actions.d.ts.map +1 -1
  149. package/dist/document-models/subscription-instance/v1/gen/controller.d.ts +4 -0
  150. package/dist/document-models/subscription-instance/v1/gen/controller.d.ts.map +1 -0
  151. package/dist/document-models/subscription-instance/v1/gen/controller.js +3 -0
  152. package/dist/document-models/subscription-instance/v1/gen/document-model.d.ts.map +1 -1
  153. package/dist/document-models/subscription-instance/v1/gen/document-model.js +488 -246
  154. package/dist/document-models/subscription-instance/v1/gen/document-schema.d.ts +3 -3
  155. package/dist/document-models/subscription-instance/v1/gen/index.d.ts +1 -0
  156. package/dist/document-models/subscription-instance/v1/gen/index.d.ts.map +1 -1
  157. package/dist/document-models/subscription-instance/v1/gen/index.js +1 -0
  158. package/dist/document-models/subscription-instance/v1/gen/metrics/error.d.ts +73 -1
  159. package/dist/document-models/subscription-instance/v1/gen/metrics/error.d.ts.map +1 -1
  160. package/dist/document-models/subscription-instance/v1/gen/metrics/error.js +86 -1
  161. package/dist/document-models/subscription-instance/v1/gen/ph-factories.js +1 -1
  162. package/dist/document-models/subscription-instance/v1/gen/schema/types.d.ts +199 -82
  163. package/dist/document-models/subscription-instance/v1/gen/schema/types.d.ts.map +1 -1
  164. package/dist/document-models/subscription-instance/v1/gen/schema/zod.d.ts +22 -12
  165. package/dist/document-models/subscription-instance/v1/gen/schema/zod.d.ts.map +1 -1
  166. package/dist/document-models/subscription-instance/v1/gen/schema/zod.js +230 -84
  167. package/dist/document-models/subscription-instance/v1/gen/service/error.d.ts +62 -1
  168. package/dist/document-models/subscription-instance/v1/gen/service/error.d.ts.map +1 -1
  169. package/dist/document-models/subscription-instance/v1/gen/service/error.js +60 -1
  170. package/dist/document-models/subscription-instance/v1/gen/service-group/error.d.ts +39 -1
  171. package/dist/document-models/subscription-instance/v1/gen/service-group/error.d.ts.map +1 -1
  172. package/dist/document-models/subscription-instance/v1/gen/service-group/error.js +39 -1
  173. package/dist/document-models/subscription-instance/v1/gen/subscription/error.d.ts +55 -1
  174. package/dist/document-models/subscription-instance/v1/gen/subscription/error.d.ts.map +1 -1
  175. package/dist/document-models/subscription-instance/v1/gen/subscription/error.js +51 -1
  176. package/dist/document-models/subscription-instance/v1/gen/utils.js +2 -2
  177. package/dist/document-models/subscription-instance/v1/module.d.ts +1 -1
  178. package/dist/document-models/subscription-instance/v1/module.d.ts.map +1 -1
  179. package/dist/document-models/subscription-instance/v1/module.js +4 -1
  180. package/dist/document-models/subscription-instance/v1/src/reducers/customer.d.ts.map +1 -1
  181. package/dist/document-models/subscription-instance/v1/src/reducers/customer.js +1 -0
  182. package/dist/document-models/subscription-instance/v1/src/reducers/metrics.d.ts.map +1 -1
  183. package/dist/document-models/subscription-instance/v1/src/reducers/metrics.js +70 -45
  184. package/dist/document-models/subscription-instance/v1/src/reducers/service-group.d.ts.map +1 -1
  185. package/dist/document-models/subscription-instance/v1/src/reducers/service-group.js +108 -30
  186. package/dist/document-models/subscription-instance/v1/src/reducers/service.d.ts.map +1 -1
  187. package/dist/document-models/subscription-instance/v1/src/reducers/service.js +108 -39
  188. package/dist/document-models/subscription-instance/v1/src/reducers/subscription.d.ts.map +1 -1
  189. package/dist/document-models/subscription-instance/v1/src/reducers/subscription.js +193 -35
  190. package/dist/editors/resource-instance-editor/editor.d.ts.map +1 -1
  191. package/dist/editors/resource-instance-editor/editor.js +13 -3
  192. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts.map +1 -1
  193. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.js +4 -2
  194. package/dist/editors/service-offering-editor/components/ServiceCatalog.d.ts.map +1 -1
  195. package/dist/editors/service-offering-editor/components/ServiceCatalog.js +189 -32
  196. package/dist/editors/service-offering-editor/components/TheMatrix.d.ts +1 -1
  197. package/dist/editors/service-offering-editor/components/TheMatrix.d.ts.map +1 -1
  198. package/dist/editors/service-offering-editor/components/TheMatrix.js +295 -140
  199. package/dist/editors/service-offering-editor/components/TierDefinition.d.ts.map +1 -1
  200. package/dist/editors/service-offering-editor/components/TierDefinition.js +2 -0
  201. package/dist/editors/service-offering-editor/components/TierPricingOptionsPanel.js +3 -3
  202. package/dist/editors/service-offering-editor/components/pricing-utils.d.ts.map +1 -1
  203. package/dist/editors/service-offering-editor/components/pricing-utils.js +26 -7
  204. package/dist/editors/subscription-instance-editor/components/BillingPanel.d.ts.map +1 -1
  205. package/dist/editors/subscription-instance-editor/components/BillingPanel.js +4 -4
  206. package/dist/editors/subscription-instance-editor/components/CustomerInfo.d.ts.map +1 -1
  207. package/dist/editors/subscription-instance-editor/components/CustomerInfo.js +3 -2
  208. package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.d.ts +3 -0
  209. package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.d.ts.map +1 -1
  210. package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.js +12 -0
  211. package/dist/editors/subscription-instance-editor/components/MetricActions.d.ts.map +1 -1
  212. package/dist/editors/subscription-instance-editor/components/MetricActions.js +4 -2
  213. package/dist/editors/subscription-instance-editor/components/MockDataButton.d.ts.map +1 -1
  214. package/dist/editors/subscription-instance-editor/components/MockDataButton.js +214 -2
  215. package/dist/editors/subscription-instance-editor/components/OperatorNotes.js +1 -1
  216. package/dist/editors/subscription-instance-editor/components/ServicesPanel.d.ts.map +1 -1
  217. package/dist/editors/subscription-instance-editor/components/ServicesPanel.js +9 -20
  218. package/dist/editors/subscription-instance-editor/components/SubscriptionActions.d.ts.map +1 -1
  219. package/dist/editors/subscription-instance-editor/components/SubscriptionActions.js +8 -9
  220. package/dist/editors/subscription-instance-editor/components/SubscriptionHeader.d.ts.map +1 -1
  221. package/dist/editors/subscription-instance-editor/components/SubscriptionHeader.js +1 -1
  222. package/dist/editors/subscription-instance-editor/components/billing-utils.d.ts +14 -6
  223. package/dist/editors/subscription-instance-editor/components/billing-utils.d.ts.map +1 -1
  224. package/dist/editors/subscription-instance-editor/components/billing-utils.js +19 -23
  225. package/dist/editors/subscription-instance-editor/components/mapOfferingToSubscription.d.ts +16 -2
  226. package/dist/editors/subscription-instance-editor/components/mapOfferingToSubscription.d.ts.map +1 -1
  227. package/dist/editors/subscription-instance-editor/components/mapOfferingToSubscription.js +155 -6
  228. package/dist/powerhouse.manifest.json +29 -3
  229. package/dist/style.css +14 -0
  230. package/dist/subgraphs/resources-services/resolvers.d.ts +1 -1
  231. package/dist/subgraphs/resources-services/resolvers.d.ts.map +1 -1
  232. package/dist/subgraphs/resources-services/resolvers.js +273 -158
  233. package/dist/subgraphs/resources-services/schema.d.ts.map +1 -1
  234. package/dist/subgraphs/resources-services/schema.js +107 -41
  235. package/package.json +22 -18
@@ -1,44 +1,54 @@
1
- import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
- import { createAction, generateId } from "document-model/core";
3
- import { addFile } from "document-drive";
4
- import { ResourceInstanceV1, SubscriptionInstanceV1, } from "@powerhousedao/service-offering/document-models";
1
+ import { getUserSelectionPriceBreakdown, } from "../../document-models/service-offering/v1/src/utils.js";
2
+ import { createAction } from "document-model/core";
3
+ import { addFile, driveCreateDocument } from "document-drive";
4
+ import { ResourceInstance } from "../../document-models/resource-instance/v1/module.js";
5
+ import { SubscriptionInstance } from "../../document-models/subscription-instance/v1/module.js";
6
+ import { mapOfferingToSubscription } from "../../editors/subscription-instance-editor/components/mapOfferingToSubscription.js";
5
7
  export const getResolvers = (subgraph) => {
6
- const reactor = subgraph.reactor;
7
8
  const reactorClient = subgraph.reactorClient;
8
9
  return {
9
10
  Query: {
10
11
  resourceTemplates: async (_, args) => {
11
12
  const { id, status, operatorId } = args.filter || {};
12
- // If filtering by specific id, fetch directly
13
+ // If filtering by specific id, try to fetch directly
13
14
  if (id) {
14
15
  try {
15
- const result = await reactorClient.find({ type: "powerhouse/resource-template", ids: [id] });
16
- const docs = result.results;
17
- if (docs.length === 0)
18
- return [];
19
- const doc = docs[0];
20
- const state = doc.state.global;
21
- if (status && status.length > 0 && !status.includes(state.status)) {
22
- return [];
16
+ const doc = await reactorClient.get(id);
17
+ if (doc &&
18
+ doc.header.documentType === "powerhouse/resource-template") {
19
+ const state = doc.state.global;
20
+ if (status &&
21
+ status.length > 0 &&
22
+ !status.includes(state.status)) {
23
+ return [];
24
+ }
25
+ if (operatorId && state.operatorId !== operatorId) {
26
+ return [];
27
+ }
28
+ return [mapResourceTemplateState(state, doc)];
23
29
  }
24
- if (operatorId && state.operatorId !== operatorId) {
25
- return [];
26
- }
27
- return [mapResourceTemplateState(state, doc)];
28
30
  }
29
31
  catch {
30
- return [];
32
+ // Document not found
31
33
  }
34
+ return [];
32
35
  }
33
36
  // Find all resource template documents
34
- const result = await reactorClient.find({ type: "powerhouse/resource-template" });
35
- const docs = result.results;
37
+ const { results: docs } = await reactorClient.find({
38
+ type: "powerhouse/resource-template",
39
+ });
36
40
  const resourceTemplates = [];
37
41
  for (const doc of docs) {
38
- const state = doc.state.global;
42
+ const resourceDoc = doc;
43
+ const state = resourceDoc.state.global;
44
+ // Skip documents missing required fields
45
+ if (!state.operatorId)
46
+ continue;
47
+ // Apply status filter if provided
39
48
  if (status && status.length > 0 && !status.includes(state.status)) {
40
49
  continue;
41
50
  }
51
+ // Apply operatorId filter if provided
42
52
  if (operatorId && state.operatorId !== operatorId) {
43
53
  continue;
44
54
  }
@@ -48,43 +58,53 @@ export const getResolvers = (subgraph) => {
48
58
  },
49
59
  serviceOfferings: async (_, args) => {
50
60
  const { id, status, operatorId, resourceTemplateId } = args.filter || {};
51
- // If filtering by specific id, fetch directly
61
+ // If filtering by specific id, try to fetch directly
52
62
  if (id) {
53
63
  try {
54
- const result = await reactorClient.find({ type: "powerhouse/service-offering", ids: [id] });
55
- const docs = result.results;
56
- if (docs.length === 0)
57
- return [];
58
- const doc = docs[0];
59
- const state = doc.state.global;
60
- if (status && status.length > 0 && !status.includes(state.status)) {
61
- return [];
62
- }
63
- if (operatorId && state.operatorId !== operatorId) {
64
- return [];
64
+ const doc = await reactorClient.get(id);
65
+ if (doc &&
66
+ doc.header.documentType === "powerhouse/service-offering") {
67
+ const state = doc.state.global;
68
+ if (status &&
69
+ status.length > 0 &&
70
+ !status.includes(state.status)) {
71
+ return [];
72
+ }
73
+ if (operatorId && state.operatorId !== operatorId) {
74
+ return [];
75
+ }
76
+ if (resourceTemplateId &&
77
+ state.resourceTemplateId !== resourceTemplateId) {
78
+ return [];
79
+ }
80
+ return [mapServiceOfferingState(state, doc)];
65
81
  }
66
- if (resourceTemplateId &&
67
- state.resourceTemplateId !== resourceTemplateId) {
68
- return [];
69
- }
70
- return [mapServiceOfferingState(state, doc)];
71
82
  }
72
83
  catch {
73
- return [];
84
+ // Document not found
74
85
  }
86
+ return [];
75
87
  }
76
88
  // Find all service offering documents
77
- const result = await reactorClient.find({ type: "powerhouse/service-offering" });
78
- const docs = result.results;
89
+ const { results: docs } = await reactorClient.find({
90
+ type: "powerhouse/service-offering",
91
+ });
79
92
  const serviceOfferings = [];
80
93
  for (const doc of docs) {
81
- const state = doc.state.global;
94
+ const offeringDoc = doc;
95
+ const state = offeringDoc.state.global;
96
+ // Skip documents missing required fields
97
+ if (!state.operatorId)
98
+ continue;
99
+ // Apply status filter if provided
82
100
  if (status && status.length > 0 && !status.includes(state.status)) {
83
101
  continue;
84
102
  }
103
+ // Apply operatorId filter if provided
85
104
  if (operatorId && state.operatorId !== operatorId) {
86
105
  continue;
87
106
  }
107
+ // Apply resourceTemplateId filter if provided
88
108
  if (resourceTemplateId &&
89
109
  state.resourceTemplateId !== resourceTemplateId) {
90
110
  continue;
@@ -175,7 +195,7 @@ export const getResolvers = (subgraph) => {
175
195
  };
176
196
  }
177
197
  // Fetch the service offering
178
- const serviceOfferingDoc = await reactor.getDocument(serviceOfferingId);
198
+ const serviceOfferingDoc = await reactorClient.get(serviceOfferingId);
179
199
  if (!serviceOfferingDoc) {
180
200
  return {
181
201
  success: false,
@@ -192,13 +212,38 @@ export const getResolvers = (subgraph) => {
192
212
  errors: ["Service offering has no associated resource template"],
193
213
  };
194
214
  }
195
- // Find the selected tier
196
- const selectedTier = serviceOfferingState.tiers.find((t) => t.id === userSelection.tierId);
197
- if (!selectedTier) {
215
+ // Convert GraphQL overrides to Record<string, BillingCycle>
216
+ const groupBillingCycleOverrides = {};
217
+ for (const o of userSelection.groupBillingCycleOverrides ?? []) {
218
+ groupBillingCycleOverrides[o.groupId] =
219
+ o.billingCycle;
220
+ }
221
+ const addonBillingCycleOverrides = {};
222
+ for (const o of userSelection.addonBillingCycleOverrides ?? []) {
223
+ addonBillingCycleOverrides[o.groupId] =
224
+ o.billingCycle;
225
+ }
226
+ // Compute price breakdown from user selection
227
+ const selection = {
228
+ tierId: userSelection.tierId,
229
+ billingCycle: userSelection.billingCycle,
230
+ optionGroupIds: userSelection.optionGroupIds ?? [],
231
+ groupBillingCycleOverrides,
232
+ addonBillingCycleOverrides,
233
+ };
234
+ let priceBreakdown;
235
+ try {
236
+ priceBreakdown = getUserSelectionPriceBreakdown(serviceOfferingDoc.state, selection);
237
+ }
238
+ catch (error) {
198
239
  return {
199
240
  success: false,
200
241
  data: null,
201
- errors: ["Selected tier not found in service offering"],
242
+ errors: [
243
+ error instanceof Error
244
+ ? error.message
245
+ : "Failed to compute price breakdown from user selection",
246
+ ],
202
247
  };
203
248
  }
204
249
  // Sanitize names for use as drive id/slug: lowercase, trim, collapse whitespace, replace spaces with hyphens
@@ -207,36 +252,36 @@ export const getResolvers = (subgraph) => {
207
252
  .toLowerCase()
208
253
  .replace(/\s+/g, "-")
209
254
  .replace(/_/g, "-");
210
- const parsedName = name
211
- .trim()
212
- .toLowerCase()
213
- .replace(/\s+/g, "-")
214
- .replace(/_/g, "-");
215
255
  try {
216
256
  // create team-builder-admin drive
217
- const teamBuilderAdminDrive = await reactor.addDrive({
218
- global: {
219
- name: teamName,
220
- icon: "https://cdn-icons-png.flaticon.com/512/6020/6020347.png",
221
- },
222
- id: generateId(),
223
- slug: parsedTeamName,
224
- preferredEditor: "builder-team-admin",
225
- });
257
+ const driveDoc = driveCreateDocument();
258
+ driveDoc.state.global.name = teamName;
259
+ driveDoc.state.global.icon =
260
+ "https://cdn-icons-png.flaticon.com/512/6020/6020347.png";
261
+ driveDoc.header.slug = parsedTeamName;
262
+ if (!driveDoc.header.meta)
263
+ driveDoc.header.meta = {};
264
+ driveDoc.header.meta.preferredEditor = "builder-team-admin";
265
+ const teamBuilderAdminDrive = await reactorClient.create(driveDoc);
226
266
  // create builder-profile doc inside the team-builder-admin drive
227
- const builderProfileDoc = await reactor.addDocument("powerhouse/builder-profile");
228
- await reactor.addAction(teamBuilderAdminDrive.header.id, addFile({
229
- documentType: "powerhouse/builder-profile",
230
- id: builderProfileDoc.header.id,
231
- name: `${parsedTeamName} Builder Profile`,
232
- parentFolder: teamBuilderAdminDrive.state.global.nodes?.find((node) => node.kind === "folder")?.parentFolder,
233
- }));
234
- await reactor.addAction(builderProfileDoc.header.id, createAction("UPDATE_PROFILE", { name: parsedTeamName }, undefined, undefined, "global"));
267
+ const builderProfileDoc = await reactorClient.createEmpty("powerhouse/builder-profile");
268
+ const teamRootFolder = teamBuilderAdminDrive.state.global.nodes.find((node) => node.kind === "folder")?.parentFolder;
269
+ await reactorClient.execute(teamBuilderAdminDrive.header.id, "main", [
270
+ addFile({
271
+ documentType: "powerhouse/builder-profile",
272
+ id: builderProfileDoc.header.id,
273
+ name: `${parsedTeamName} Builder Profile`,
274
+ parentFolder: teamRootFolder,
275
+ }),
276
+ ]);
277
+ await reactorClient.execute(builderProfileDoc.header.id, "main", [
278
+ createAction("UPDATE_PROFILE", { name: parsedTeamName }, undefined, undefined, "global"),
279
+ ]);
235
280
  // create resource-instance and subscription-instance docs
236
- const resourceInstanceDoc = await reactor.addDocument("powerhouse/resource-instance");
237
- const subscriptionInstanceDoc = await reactor.addDocument("powerhouse/subscription-instance");
281
+ const resourceInstanceDoc = await reactorClient.createEmpty("powerhouse/resource-instance");
282
+ const subscriptionInstanceDoc = await reactorClient.createEmpty("powerhouse/subscription-instance");
238
283
  // resolve parent folders for both drives
239
- const teamParentFolder = teamBuilderAdminDrive.state.global.nodes?.find((node) => node.kind === "folder")?.parentFolder;
284
+ const teamParentFolder = teamBuilderAdminDrive.state.global.nodes.find((node) => node.kind === "folder")?.parentFolder;
240
285
  const operatorDrive = await getOperatorDrive(reactorClient, resourceTemplateId);
241
286
  if (!operatorDrive) {
242
287
  throw new Error(`Operator drive not found for resource template ${resourceTemplateId}`);
@@ -250,7 +295,7 @@ export const getResolvers = (subgraph) => {
250
295
  }
251
296
  const operatorParentFolder = operatorDrive.state.global.nodes.find((node) => node.kind === "folder")?.parentFolder;
252
297
  // batch add resource-instance and subscription-instance to team-builder-admin drive
253
- await reactor.addActions(teamBuilderAdminDrive.header.id, [
298
+ await reactorClient.execute(teamBuilderAdminDrive.header.id, "main", [
254
299
  addFile({
255
300
  documentType: "powerhouse/resource-instance",
256
301
  id: resourceInstanceDoc.header.id,
@@ -265,7 +310,7 @@ export const getResolvers = (subgraph) => {
265
310
  }),
266
311
  ]);
267
312
  // batch add resource-instance and subscription-instance to operator drive
268
- await reactor.addActions(operatorDrive.header.id, [
313
+ await reactorClient.execute(operatorDrive.header.id, "main", [
269
314
  addFile({
270
315
  documentType: "powerhouse/resource-instance",
271
316
  id: resourceInstanceDoc.header.id,
@@ -280,30 +325,37 @@ export const getResolvers = (subgraph) => {
280
325
  }),
281
326
  ]);
282
327
  // populate documents after all files are added to both drives
283
- await populateResourceInstance(reactor, resourceInstanceDoc.header.id, resourceTemplateId, operatorProfileId, // operator profile id
328
+ await populateResourceInstance(reactorClient, resourceInstanceDoc.header.id, resourceTemplateId, operatorProfileId, // operator profile id
284
329
  builderProfileDoc.header.id, // customer id
285
330
  parsedTeamName);
286
331
  const now = new Date().toISOString();
287
- await reactor.addAction(subscriptionInstanceDoc.header.id, SubscriptionInstanceV1.actions.initializeSubscription({
288
- createdAt: now,
332
+ const subscriptionInput = mapOfferingToSubscription({
333
+ offering: serviceOfferingState,
334
+ tierId: selection.tierId,
335
+ selectedBillingCycle: selection.billingCycle,
289
336
  customerId: builderProfileDoc.header.id,
290
337
  customerName: name,
291
338
  customerEmail,
292
- serviceOfferingId,
293
- tierName: selectedTier.name,
294
- tierPricingOptionId: selectedTier.id,
295
- tierPrice: selectedTier.pricing?.amount ?? undefined,
296
- tierCurrency: selectedTier.pricing?.currency ?? "USD",
297
- tierPricingMode: selectedTier.pricingMode,
298
- selectedBillingCycle: userSelection.billingCycle,
299
- globalCurrency: selectedTier.pricing?.currency ?? "USD",
300
- }));
301
- const projectedAmount = selectedTier.pricing?.amount;
339
+ createdAt: now,
340
+ priceBreakdown,
341
+ });
342
+ await reactorClient.execute(subscriptionInstanceDoc.header.id, "main", [
343
+ SubscriptionInstance.actions.initializeSubscription({
344
+ ...subscriptionInput,
345
+ resourceId: resourceInstanceDoc.header.id,
346
+ resourceLabel: parsedTeamName,
347
+ resourceThumbnailUrl: serviceOfferingState.thumbnailUrl,
348
+ }),
349
+ ]);
350
+ // Set billing projection from tier price
351
+ const projectedAmount = subscriptionInput.tierPrice ?? priceBreakdown.tierCycleTotal;
302
352
  if (projectedAmount != null) {
303
- await reactor.addAction(subscriptionInstanceDoc.header.id, SubscriptionInstanceV1.actions.updateBillingProjection({
304
- projectedBillAmount: projectedAmount,
305
- projectedBillCurrency: selectedTier.pricing?.currency || "USD",
306
- }));
353
+ await reactorClient.execute(subscriptionInstanceDoc.header.id, "main", [
354
+ SubscriptionInstance.actions.updateBillingProjection({
355
+ projectedBillAmount: projectedAmount,
356
+ projectedBillCurrency: priceBreakdown.tierCurrency || "USD",
357
+ }),
358
+ ]);
307
359
  }
308
360
  return {
309
361
  success: true,
@@ -334,7 +386,7 @@ export const getResolvers = (subgraph) => {
334
386
  * Uses the drive slug in the switchboard URL path.
335
387
  */
336
388
  function getDriveLink(driveSlug) {
337
- const baseUri = process.env.BASE_URI || "";
389
+ const baseUri = typeof process !== "undefined" ? process.env.BASE_URI || "" : "";
338
390
  if (baseUri.includes("-dev.")) {
339
391
  return `https://connect-dev.powerhouse.xyz/?driveUrl=https://switchboard-dev.powerhouse.xyz/d/${driveSlug}`;
340
392
  }
@@ -360,18 +412,18 @@ function mapResourceTemplateState(state, doc) {
360
412
  infoLink: state.infoLink || null,
361
413
  status: state.status,
362
414
  lastModified: state.lastModified,
363
- targetAudiences: state.targetAudiences.map((audience) => ({
415
+ targetAudiences: (state.targetAudiences || []).map((audience) => ({
364
416
  id: audience.id,
365
417
  label: audience.label,
366
418
  color: audience.color || null,
367
419
  })),
368
- setupServices: state.setupServices,
369
- recurringServices: state.recurringServices,
370
- facetTargets: state.facetTargets.map((facet) => ({
420
+ setupServices: state.setupServices || [],
421
+ recurringServices: state.recurringServices || [],
422
+ facetTargets: (state.facetTargets || []).map((facet) => ({
371
423
  id: facet.id,
372
424
  categoryKey: facet.categoryKey,
373
425
  categoryLabel: facet.categoryLabel,
374
- selectedOptions: facet.selectedOptions,
426
+ selectedOptions: facet.selectedOptions || [],
375
427
  })),
376
428
  services: (state.services || []).map((service) => ({
377
429
  id: service.id,
@@ -385,7 +437,7 @@ function mapResourceTemplateState(state, doc) {
385
437
  id: binding.id,
386
438
  facetName: binding.facetName,
387
439
  facetType: binding.facetType,
388
- supportedOptions: binding.supportedOptions,
440
+ supportedOptions: binding.supportedOptions || [],
389
441
  })),
390
442
  })),
391
443
  optionGroups: (state.optionGroups || []).map((group) => ({
@@ -401,7 +453,7 @@ function mapResourceTemplateState(state, doc) {
401
453
  answer: faq.answer || null,
402
454
  displayOrder: faq.displayOrder,
403
455
  })),
404
- contentSections: state.contentSections.map((section) => ({
456
+ contentSections: (state.contentSections || []).map((section) => ({
405
457
  id: section.id,
406
458
  title: section.title,
407
459
  content: section.content,
@@ -413,35 +465,50 @@ function mapResourceTemplateState(state, doc) {
413
465
  * Populate a resource-instance document with data from a resource-template.
414
466
  * Initializes basic info and sets facet configuration from template facetTargets.
415
467
  */
416
- async function populateResourceInstance(reactor, resourceInstanceDocId, resourceTemplateId, operatorId, customerId, customerName) {
417
- const resourceTemplateDoc = await reactor.getDocument(resourceTemplateId);
468
+ async function populateResourceInstance(reactorClient, resourceInstanceDocId, resourceTemplateId, operatorId, customerId, customerName) {
469
+ const resourceTemplateDoc = await reactorClient.get(resourceTemplateId);
418
470
  if (!resourceTemplateDoc)
419
471
  return;
420
472
  const templateState = resourceTemplateDoc.state.global;
421
473
  // Initialize instance with basic info from template
422
- await reactor.addAction(resourceInstanceDocId, ResourceInstanceV1.actions.initializeInstance({
423
- operatorId,
424
- operatorDocumentType: "powerhouse/builder-profile",
425
- resourceTemplateId,
426
- customerId,
427
- customerName,
428
- templateName: templateState.title,
429
- thumbnailUrl: templateState.thumbnailUrl,
430
- infoLink: templateState.infoLink,
431
- description: templateState.description,
432
- }));
474
+ await reactorClient.execute(resourceInstanceDocId, "main", [
475
+ ResourceInstance.actions.initializeInstance({
476
+ operatorId,
477
+ operatorDocumentType: "powerhouse/builder-profile",
478
+ resourceTemplateId,
479
+ customerId,
480
+ customerName,
481
+ templateName: templateState.title,
482
+ thumbnailUrl: templateState.thumbnailUrl,
483
+ infoLink: templateState.infoLink,
484
+ description: templateState.description,
485
+ }),
486
+ ]);
433
487
  // Populate facet configuration from template's facetTargets
434
488
  for (const facetTarget of templateState.facetTargets) {
435
489
  if (facetTarget.selectedOptions.length > 0) {
436
- await reactor.addAction(resourceInstanceDocId, ResourceInstanceV1.actions.setInstanceFacet({
437
- id: facetTarget.id,
438
- categoryKey: facetTarget.categoryKey,
439
- categoryLabel: facetTarget.categoryLabel,
440
- selectedOption: facetTarget.selectedOptions[0],
441
- }));
490
+ await reactorClient.execute(resourceInstanceDocId, "main", [
491
+ ResourceInstance.actions.setInstanceFacet({
492
+ id: facetTarget.id,
493
+ categoryKey: facetTarget.categoryKey,
494
+ categoryLabel: facetTarget.categoryLabel,
495
+ selectedOption: facetTarget.selectedOptions[0],
496
+ }),
497
+ ]);
442
498
  }
443
499
  }
444
500
  }
501
+ /**
502
+ * Map a DiscountRule to the GraphQL shape, or null
503
+ */
504
+ function mapDiscountRule(rule) {
505
+ if (!rule)
506
+ return null;
507
+ return {
508
+ discountType: rule.discountType,
509
+ discountValue: rule.discountValue,
510
+ };
511
+ }
445
512
  /**
446
513
  * Map ServiceOfferingState from document model to GraphQL response
447
514
  */
@@ -457,14 +524,14 @@ function mapServiceOfferingState(state, doc) {
457
524
  infoLink: state.infoLink || null,
458
525
  status: state.status,
459
526
  lastModified: state.lastModified,
460
- availableBillingCycles: state.availableBillingCycles,
461
- facetTargets: state.facetTargets.map((facet) => ({
527
+ availableBillingCycles: state.availableBillingCycles || [],
528
+ facetTargets: (state.facetTargets || []).map((facet) => ({
462
529
  id: facet.id,
463
530
  categoryKey: facet.categoryKey,
464
531
  categoryLabel: facet.categoryLabel,
465
- selectedOptions: facet.selectedOptions,
532
+ selectedOptions: facet.selectedOptions || [],
466
533
  })),
467
- services: state.services.map((service) => ({
534
+ services: (state.services || []).map((service) => ({
468
535
  id: service.id,
469
536
  title: service.title,
470
537
  description: service.description || null,
@@ -472,61 +539,102 @@ function mapServiceOfferingState(state, doc) {
472
539
  isSetupFormation: service.isSetupFormation,
473
540
  optionGroupId: service.optionGroupId || null,
474
541
  })),
475
- tiers: state.tiers.map((tier) => ({
542
+ tiers: (state.tiers || []).map((tier) => ({
476
543
  id: tier.id,
477
544
  name: tier.name,
478
545
  description: tier.description || null,
479
546
  isCustomPricing: tier.isCustomPricing,
480
- pricingMode: tier.pricingMode,
481
- pricing: tier.pricing
482
- ? {
483
- amount: tier.pricing.amount,
484
- currency: tier.pricing.currency,
485
- }
486
- : null,
547
+ pricingMode: tier.pricingMode || null,
548
+ pricing: {
549
+ amount: tier.pricing?.amount ?? null,
550
+ currency: tier.pricing?.currency ?? "USD",
551
+ },
487
552
  defaultBillingCycle: tier.defaultBillingCycle || null,
488
- billingCycleDiscounts: tier.billingCycleDiscounts.map((d) => ({
489
- cycle: d.cycle,
490
- discountType: d.discountType,
491
- discountValue: d.discountValue,
553
+ billingCycleDiscounts: (tier.billingCycleDiscounts || []).map((d) => ({
554
+ billingCycle: d.billingCycle,
555
+ discountRule: {
556
+ discountType: d.discountRule?.discountType,
557
+ discountValue: d.discountRule?.discountValue,
558
+ },
492
559
  })),
493
- serviceLevels: tier.serviceLevels.map((level) => ({
560
+ serviceLevels: (tier.serviceLevels || []).map((level) => ({
494
561
  id: level.id,
495
562
  serviceId: level.serviceId,
496
563
  level: level.level,
497
- description: level.description || null,
564
+ customValue: level.customValue || null,
565
+ optionGroupId: level.optionGroupId || null,
498
566
  })),
499
- usageLimits: tier.usageLimits.map((limit) => ({
567
+ usageLimits: (tier.usageLimits || []).map((limit) => ({
500
568
  id: limit.id,
501
- name: limit.name,
502
- limit: limit.limit,
503
- unit: limit.unit || null,
569
+ serviceId: limit.serviceId,
570
+ metric: limit.metric,
571
+ unitName: limit.unitName || null,
572
+ freeLimit: limit.freeLimit ?? null,
573
+ paidLimit: limit.paidLimit ?? null,
574
+ resetCycle: limit.resetCycle || null,
575
+ notes: limit.notes || null,
576
+ unitPrice: limit.unitPrice ?? null,
577
+ unitPriceCurrency: limit.unitPriceCurrency || null,
504
578
  })),
505
579
  })),
506
- optionGroups: state.optionGroups.map((group) => ({
580
+ optionGroups: (state.optionGroups || []).map((group) => ({
507
581
  id: group.id,
508
582
  name: group.name,
509
583
  description: group.description || null,
510
584
  isAddOn: group.isAddOn,
511
585
  defaultSelected: group.defaultSelected,
512
- pricingMode: group.pricingMode,
586
+ pricingMode: group.pricingMode || null,
513
587
  standalonePricing: group.standalonePricing
514
588
  ? {
515
- amount: group.standalonePricing.amount,
516
- currency: group.standalonePricing.currency,
589
+ setupCost: group.standalonePricing.setupCost
590
+ ? {
591
+ amount: group.standalonePricing.setupCost.amount,
592
+ currency: group.standalonePricing.setupCost.currency,
593
+ discount: mapDiscountRule(group.standalonePricing.setupCost.discount),
594
+ }
595
+ : null,
596
+ recurringPricing: (group.standalonePricing.recurringPricing || []).map((rp) => ({
597
+ id: rp.id,
598
+ billingCycle: rp.billingCycle,
599
+ amount: rp.amount,
600
+ currency: rp.currency,
601
+ discount: mapDiscountRule(rp.discount),
602
+ })),
517
603
  }
518
604
  : null,
519
605
  tierDependentPricing: (group.tierDependentPricing || []).map((tp) => ({
606
+ id: tp.id,
520
607
  tierId: tp.tierId,
521
- amount: tp.amount,
522
- currency: tp.currency,
608
+ setupCost: tp.setupCost
609
+ ? {
610
+ amount: tp.setupCost.amount,
611
+ currency: tp.setupCost.currency,
612
+ discount: mapDiscountRule(tp.setupCost.discount),
613
+ }
614
+ : null,
615
+ setupCostDiscounts: (tp.setupCostDiscounts || []).map((d) => ({
616
+ billingCycle: d.billingCycle,
617
+ discountRule: {
618
+ discountType: d.discountRule?.discountType,
619
+ discountValue: d.discountRule?.discountValue,
620
+ },
621
+ })),
622
+ recurringPricing: (tp.recurringPricing || []).map((rp) => ({
623
+ id: rp.id,
624
+ billingCycle: rp.billingCycle,
625
+ amount: rp.amount,
626
+ currency: rp.currency,
627
+ discount: mapDiscountRule(rp.discount),
628
+ })),
523
629
  })),
524
630
  costType: group.costType || null,
525
631
  availableBillingCycles: group.availableBillingCycles || [],
526
- billingCycleDiscounts: group.billingCycleDiscounts.map((d) => ({
527
- cycle: d.cycle,
528
- discountType: d.discountType,
529
- discountValue: d.discountValue,
632
+ billingCycleDiscounts: (group.billingCycleDiscounts || []).map((d) => ({
633
+ billingCycle: d.billingCycle,
634
+ discountRule: {
635
+ discountType: d.discountRule?.discountType,
636
+ discountValue: d.discountRule?.discountValue,
637
+ },
530
638
  })),
531
639
  discountMode: group.discountMode || null,
532
640
  price: group.price ?? null,
@@ -534,12 +642,19 @@ function mapServiceOfferingState(state, doc) {
534
642
  })),
535
643
  };
536
644
  }
537
- /**
538
- * Find the drive that contains a given resource template document.
539
- * Uses reactorClient to find the parent drive.
540
- */
541
645
  async function getOperatorDrive(reactorClient, resourceTemplateId) {
542
- const result = await reactorClient.getParents(resourceTemplateId);
543
- const parentDrive = result.results.find((doc) => doc.header.documentType === "powerhouse/document-drive");
544
- return parentDrive;
646
+ // Find all drives
647
+ const { results: drives } = await reactorClient.find({
648
+ type: "powerhouse/document-drive",
649
+ });
650
+ for (const drive of drives) {
651
+ const driveDoc = drive;
652
+ // Check if this drive contains the resource template as a child
653
+ const { results: children } = await reactorClient.getChildren(driveDoc.header.id);
654
+ const hasTemplate = children.some((child) => child.header.id === resourceTemplateId);
655
+ if (hasTemplate) {
656
+ return driveDoc;
657
+ }
658
+ }
659
+ return undefined;
545
660
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/resources-services/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YAoRpB,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/resources-services/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YAsVpB,CAAC"}