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

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