@powerhousedao/network-admin 0.0.41 → 0.0.42

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 (52) hide show
  1. package/dist/scripts/sow-mirror/mirror_sow_state.d.ts +3 -0
  2. package/dist/scripts/sow-mirror/mirror_sow_state.d.ts.map +1 -0
  3. package/dist/scripts/sow-mirror/mirror_sow_state.js +441 -0
  4. package/dist/subgraphs/index.d.ts +5 -0
  5. package/dist/subgraphs/index.d.ts.map +1 -1
  6. package/dist/subgraphs/index.js +5 -0
  7. package/dist/subgraphs/networks/index.d.ts +11 -0
  8. package/dist/subgraphs/networks/index.d.ts.map +1 -0
  9. package/dist/subgraphs/networks/index.js +11 -0
  10. package/dist/subgraphs/networks/resolvers.d.ts +3 -0
  11. package/dist/subgraphs/networks/resolvers.d.ts.map +1 -0
  12. package/dist/subgraphs/networks/resolvers.js +42 -0
  13. package/dist/subgraphs/networks/schema.d.ts +3 -0
  14. package/dist/subgraphs/networks/schema.d.ts.map +1 -0
  15. package/dist/subgraphs/networks/schema.js +39 -0
  16. package/dist/subgraphs/payment-terms/index.d.ts +11 -0
  17. package/dist/subgraphs/payment-terms/index.d.ts.map +1 -0
  18. package/dist/subgraphs/payment-terms/index.js +11 -0
  19. package/dist/subgraphs/payment-terms/resolvers.d.ts +3 -0
  20. package/dist/subgraphs/payment-terms/resolvers.d.ts.map +1 -0
  21. package/dist/subgraphs/payment-terms/resolvers.js +277 -0
  22. package/dist/subgraphs/payment-terms/schema.d.ts +3 -0
  23. package/dist/subgraphs/payment-terms/schema.d.ts.map +1 -0
  24. package/dist/subgraphs/payment-terms/schema.js +324 -0
  25. package/dist/subgraphs/request-for-proposals/index.d.ts +11 -0
  26. package/dist/subgraphs/request-for-proposals/index.d.ts.map +1 -0
  27. package/dist/subgraphs/request-for-proposals/index.js +11 -0
  28. package/dist/subgraphs/request-for-proposals/resolvers.d.ts +3 -0
  29. package/dist/subgraphs/request-for-proposals/resolvers.d.ts.map +1 -0
  30. package/dist/subgraphs/request-for-proposals/resolvers.js +145 -0
  31. package/dist/subgraphs/request-for-proposals/schema.d.ts +3 -0
  32. package/dist/subgraphs/request-for-proposals/schema.d.ts.map +1 -0
  33. package/dist/subgraphs/request-for-proposals/schema.js +232 -0
  34. package/dist/subgraphs/workstream/index.d.ts +11 -0
  35. package/dist/subgraphs/workstream/index.d.ts.map +1 -0
  36. package/dist/subgraphs/workstream/index.js +11 -0
  37. package/dist/subgraphs/workstream/resolvers.d.ts +3 -0
  38. package/dist/subgraphs/workstream/resolvers.d.ts.map +1 -0
  39. package/dist/subgraphs/workstream/resolvers.js +181 -0
  40. package/dist/subgraphs/workstream/schema.d.ts +3 -0
  41. package/dist/subgraphs/workstream/schema.d.ts.map +1 -0
  42. package/dist/subgraphs/workstream/schema.js +206 -0
  43. package/dist/subgraphs/workstreams/index.d.ts +11 -0
  44. package/dist/subgraphs/workstreams/index.d.ts.map +1 -0
  45. package/dist/subgraphs/workstreams/index.js +11 -0
  46. package/dist/subgraphs/workstreams/resolvers.d.ts +3 -0
  47. package/dist/subgraphs/workstreams/resolvers.d.ts.map +1 -0
  48. package/dist/subgraphs/workstreams/resolvers.js +380 -0
  49. package/dist/subgraphs/workstreams/schema.d.ts +3 -0
  50. package/dist/subgraphs/workstreams/schema.d.ts.map +1 -0
  51. package/dist/subgraphs/workstreams/schema.js +326 -0
  52. package/package.json +1 -1
@@ -0,0 +1,206 @@
1
+ import { gql } from "graphql-tag";
2
+ export const schema = gql `
3
+ """
4
+ Subgraph definition for Workstream (powerhouse/workstream)
5
+ """
6
+ type WorkstreamState {
7
+ code: String
8
+ title: String
9
+ status: WorkstreamStatus!
10
+ client: ClientInfo # eventually tie it to the AID?
11
+ rfp: RFP
12
+ initialProposal: Proposal
13
+ alternativeProposals: [Proposal!]!
14
+ sow: PHID
15
+ paymentTerms: PHID
16
+ paymentRequests: [PHID!]!
17
+ }
18
+
19
+ enum WorkstreamStatus {
20
+ RFP_DRAFT
21
+ PREWORK_RFC # RFP status change to RFC
22
+ RFP_CANCELLED
23
+ OPEN_FOR_PROPOSALS
24
+ PROPOSAL_SUBMITTED
25
+ NOT_AWARDED
26
+ AWARDED
27
+ IN_PROGRESS
28
+ FINISHED
29
+ }
30
+
31
+ type Proposal {
32
+ id: OID!
33
+ sow: PHID! # a link with a fixed label (i.e, sow)
34
+ paymentTerms: PHID! # a link with a fixed label (i.e., payment terms)
35
+ status: ProposalStatus!
36
+ author: ProposalAuthor! # eventually an AID
37
+ }
38
+
39
+ enum ProposalStatus {
40
+ DRAFT
41
+ SUBMITTED
42
+ ACCEPTED
43
+ REJECTED
44
+ }
45
+
46
+ type ClientInfo {
47
+ id: PHID!
48
+ name: String
49
+ icon: URL
50
+ }
51
+
52
+ type RFP {
53
+ id: PHID!
54
+ title: String!
55
+ }
56
+
57
+ type ProposalAuthor {
58
+ id: PHID!
59
+ name: String
60
+ icon: URL
61
+ }
62
+
63
+ """
64
+ Queries: Workstream
65
+ """
66
+ type WorkstreamQueries {
67
+ getDocument(docId: PHID!, driveId: PHID): Workstream
68
+ getDocuments(driveId: String!): [Workstream!]
69
+ }
70
+
71
+ type Query {
72
+ Workstream: WorkstreamQueries
73
+ }
74
+
75
+ """
76
+ Mutations: Workstream
77
+ """
78
+ type Mutation {
79
+ Workstream_createDocument(name: String!, driveId: String): String
80
+
81
+ Workstream_editWorkstream(
82
+ driveId: String
83
+ docId: PHID
84
+ input: Workstream_EditWorkstreamInput
85
+ ): Int
86
+ Workstream_editClientInfo(
87
+ driveId: String
88
+ docId: PHID
89
+ input: Workstream_EditClientInfoInput
90
+ ): Int
91
+ Workstream_setRequestForProposal(
92
+ driveId: String
93
+ docId: PHID
94
+ input: Workstream_SetRequestForProposalInput
95
+ ): Int
96
+ Workstream_addPaymentRequest(
97
+ driveId: String
98
+ docId: PHID
99
+ input: Workstream_AddPaymentRequestInput
100
+ ): Int
101
+ Workstream_removePaymentRequest(
102
+ driveId: String
103
+ docId: PHID
104
+ input: Workstream_RemovePaymentRequestInput
105
+ ): Int
106
+ Workstream_editInitialProposal(
107
+ driveId: String
108
+ docId: PHID
109
+ input: Workstream_EditInitialProposalInput
110
+ ): Int
111
+ Workstream_addAlternativeProposal(
112
+ driveId: String
113
+ docId: PHID
114
+ input: Workstream_AddAlternativeProposalInput
115
+ ): Int
116
+ Workstream_editAlternativeProposal(
117
+ driveId: String
118
+ docId: PHID
119
+ input: Workstream_EditAlternativeProposalInput
120
+ ): Int
121
+ Workstream_removeAlternativeProposal(
122
+ driveId: String
123
+ docId: PHID
124
+ input: Workstream_RemoveAlternativeProposalInput
125
+ ): Int
126
+ }
127
+
128
+ """
129
+ Module: Workstream
130
+ """
131
+ input Workstream_EditWorkstreamInput {
132
+ code: String
133
+ title: String
134
+ status: WorkstreamStatusInput
135
+ sowId: PHID
136
+ paymentTerms: PHID
137
+ }
138
+
139
+ enum WorkstreamStatusInput {
140
+ RFP_DRAFT
141
+ PREWORK_RFC # RFP status change to RFC
142
+ RFP_CANCELLED
143
+ OPEN_FOR_PROPOSALS
144
+ PROPOSAL_SUBMITTED
145
+ NOT_AWARDED
146
+ AWARDED
147
+ IN_PROGRESS
148
+ FINISHED
149
+ }
150
+ input Workstream_EditClientInfoInput {
151
+ clientId: PHID!
152
+ name: String
153
+ icon: String
154
+ }
155
+ input Workstream_SetRequestForProposalInput {
156
+ rfpId: PHID!
157
+ title: String!
158
+ }
159
+ input Workstream_AddPaymentRequestInput {
160
+ id: PHID!
161
+ }
162
+ input Workstream_RemovePaymentRequestInput {
163
+ id: PHID!
164
+ }
165
+
166
+ """
167
+ Module: Proposals
168
+ """
169
+ input Workstream_EditInitialProposalInput {
170
+ id: ID!
171
+ sowId: PHID
172
+ paymentTermsId: PHID
173
+ status: ProposalStatusInput
174
+ proposalAuthor: ProposalAuthorInput
175
+ }
176
+
177
+ enum ProposalStatusInput {
178
+ DRAFT
179
+ SUBMITTED
180
+ ACCEPTED
181
+ REJECTED
182
+ }
183
+
184
+ input ProposalAuthorInput {
185
+ id: PHID!
186
+ name: String
187
+ icon: URL
188
+ }
189
+ input Workstream_AddAlternativeProposalInput {
190
+ id: ID!
191
+ sowId: PHID
192
+ paymentTermsId: PHID
193
+ status: ProposalStatusInput
194
+ proposalAuthor: ProposalAuthorInput
195
+ }
196
+ input Workstream_EditAlternativeProposalInput {
197
+ id: ID!
198
+ sowId: PHID
199
+ paymentTermsId: PHID
200
+ status: ProposalStatusInput
201
+ proposalAuthor: ProposalAuthorInput
202
+ }
203
+ input Workstream_RemoveAlternativeProposalInput {
204
+ id: ID!
205
+ }
206
+ `;
@@ -0,0 +1,11 @@
1
+ import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
+ import type { DocumentNode } from "graphql";
3
+ export declare class WorkstreamsSubgraph extends BaseSubgraph {
4
+ name: string;
5
+ typeDefs: DocumentNode;
6
+ resolvers: Record<string, unknown>;
7
+ additionalContextFields: {};
8
+ onSetup(): Promise<void>;
9
+ onDisconnect(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../subgraphs/workstreams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,IAAI,SAAiB;IACrB,QAAQ,EAAE,YAAY,CAAU;IAChC,SAAS,0BAAsB;IAC/B,uBAAuB,KAAM;IACvB,OAAO;IACP,YAAY;CACnB"}
@@ -0,0 +1,11 @@
1
+ import { BaseSubgraph } from "@powerhousedao/reactor-api";
2
+ import { schema } from "./schema.js";
3
+ import { getResolvers } from "./resolvers.js";
4
+ export class WorkstreamsSubgraph extends BaseSubgraph {
5
+ name = "workstreams";
6
+ typeDefs = schema;
7
+ resolvers = getResolvers(this);
8
+ additionalContextFields = {};
9
+ async onSetup() { }
10
+ async onDisconnect() { }
11
+ }
@@ -0,0 +1,3 @@
1
+ import { type ISubgraph } from "@powerhousedao/reactor-api";
2
+ export declare const getResolvers: (subgraph: ISubgraph) => Record<string, unknown>;
3
+ //# sourceMappingURL=resolvers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../subgraphs/workstreams/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAmC5D,eAAO,MAAM,YAAY,GAAI,UAAU,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAqdxE,CAAC"}
@@ -0,0 +1,380 @@
1
+ import {} from "@powerhousedao/reactor-api";
2
+ import { WorkstreamsProcessor } from "../../processors/workstreams/index.js";
3
+ import {} from "../../document-models/request-for-proposals/index.js";
4
+ import {} from "../../document-models/workstream/index.js";
5
+ export const getResolvers = (subgraph) => {
6
+ const reactor = subgraph.reactor;
7
+ const db = subgraph.relationalDb;
8
+ const deriveSlug = (name) => name.toLowerCase().trim().split(/\s+/).join("-");
9
+ const getCandidateDrives = async () => {
10
+ try {
11
+ const drives = await reactor.getDrives?.();
12
+ if (Array.isArray(drives) && drives.length > 0)
13
+ return drives;
14
+ }
15
+ catch { }
16
+ return [];
17
+ };
18
+ const loadLinkedDocument = async (id) => {
19
+ if (!id)
20
+ return null;
21
+ try {
22
+ const linked = await reactor.getDocument(id);
23
+ return { id, stateJSON: linked.state.global };
24
+ }
25
+ catch {
26
+ return { id, stateJSON: null };
27
+ }
28
+ };
29
+ const loadRfpDetails = async (rfpRef) => {
30
+ if (!rfpRef?.id) {
31
+ return null;
32
+ }
33
+ try {
34
+ const rfpDoc = await reactor.getDocument(rfpRef.id);
35
+ const rfpState = rfpDoc.state.global;
36
+ return {
37
+ id: rfpRef.id,
38
+ code: rfpState?.code ?? null,
39
+ title: rfpRef.title ?? rfpState?.title ?? null,
40
+ status: rfpState?.status ?? null,
41
+ summary: rfpState?.summary ?? null,
42
+ submissionDeadline: rfpState?.deadline ?? null,
43
+ budgetMin: rfpState?.budgetRange?.min ?? null,
44
+ budgetMax: rfpState?.budgetRange?.max ?? null,
45
+ budgetCurrency: rfpState?.budgetRange?.currency ?? null,
46
+ eligibilityCriteria: rfpState?.eligibilityCriteria ?? null,
47
+ evaluationCriteria: rfpState?.evaluationCriteria ?? null,
48
+ briefing: rfpState?.briefing ?? null,
49
+ };
50
+ }
51
+ catch {
52
+ return {
53
+ id: rfpRef.id,
54
+ code: null,
55
+ title: rfpRef.title ?? null,
56
+ status: null,
57
+ summary: null,
58
+ submissionDeadline: null,
59
+ budgetMin: null,
60
+ budgetMax: null,
61
+ budgetCurrency: null,
62
+ eligibilityCriteria: null,
63
+ evaluationCriteria: null,
64
+ briefing: null,
65
+ };
66
+ }
67
+ };
68
+ const hydrateWorkstreamRow = async (row) => {
69
+ try {
70
+ const doc = await reactor.getDocument(row.workstream_phid);
71
+ const state = doc.state.global;
72
+ const initialProposalBase = state.initialProposal
73
+ ? {
74
+ id: state.initialProposal.id,
75
+ status: state.initialProposal.status,
76
+ author: state.initialProposal.author,
77
+ }
78
+ : null;
79
+ const alternativeProposalsBase = (state.alternativeProposals || []).map((p) => ({
80
+ id: p.id,
81
+ status: p.status,
82
+ author: p.author,
83
+ }));
84
+ const [topSowDoc, topPaymentTermsDoc, initialSowDoc, initialPaymentTermsDoc, altSowDocs, altPaymentDocs, rfpDetails,] = await Promise.all([
85
+ loadLinkedDocument(state.sow || row.sow_phid || null),
86
+ loadLinkedDocument(state.paymentTerms || null),
87
+ loadLinkedDocument(state.initialProposal?.sow || row.sow_phid || null),
88
+ loadLinkedDocument(state.initialProposal?.paymentTerms || null),
89
+ Promise.all((state.alternativeProposals || []).map((p) => loadLinkedDocument(p.sow || null))),
90
+ Promise.all((state.alternativeProposals || []).map((p) => loadLinkedDocument(p.paymentTerms || null))),
91
+ loadRfpDetails(state.rfp || null),
92
+ ]);
93
+ const client = state.client ??
94
+ (row.network_phid
95
+ ? { id: row.network_phid, name: row.network_slug, icon: null }
96
+ : null);
97
+ return {
98
+ code: state.code || null,
99
+ title: state.title || row.workstream_title || null,
100
+ status: state.status || row.workstream_status || null,
101
+ client,
102
+ rfp: rfpDetails,
103
+ initialProposal: initialProposalBase
104
+ ? {
105
+ ...initialProposalBase,
106
+ sow: initialSowDoc?.stateJSON || null,
107
+ paymentTerms: initialPaymentTermsDoc?.stateJSON || null,
108
+ }
109
+ : null,
110
+ alternativeProposals: alternativeProposalsBase.map((proposal, index) => ({
111
+ ...proposal,
112
+ sow: altSowDocs[index]?.stateJSON || null,
113
+ paymentTerms: altPaymentDocs[index]?.stateJSON || null,
114
+ })),
115
+ sow: topSowDoc?.stateJSON || null,
116
+ paymentTerms: topPaymentTermsDoc?.stateJSON || null,
117
+ paymentRequests: state.paymentRequests || [],
118
+ };
119
+ }
120
+ catch {
121
+ return {
122
+ code: row.workstream_title || null,
123
+ title: row.workstream_title || null,
124
+ status: row.workstream_status || null,
125
+ client: row.network_phid
126
+ ? { id: row.network_phid, name: row.network_slug, icon: null }
127
+ : null,
128
+ rfp: null,
129
+ initialProposal: null,
130
+ alternativeProposals: [],
131
+ sow: null,
132
+ paymentTerms: null,
133
+ paymentRequests: [],
134
+ };
135
+ }
136
+ };
137
+ const applyWorkstreamFilters = (qb, filters, wantedSlug) => {
138
+ if (filters.workstreamId) {
139
+ qb = qb.where("workstream_phid", "=", filters.workstreamId);
140
+ }
141
+ else if (filters.workstreamSlug) {
142
+ qb = qb.where("workstream_slug", "=", filters.workstreamSlug);
143
+ }
144
+ if (filters.networkId) {
145
+ qb = qb.where("network_phid", "=", filters.networkId);
146
+ }
147
+ else if (filters.networkSlug) {
148
+ qb = qb.where("network_slug", "=", filters.networkSlug);
149
+ }
150
+ else if (filters.networkName && wantedSlug) {
151
+ qb = qb.where("network_slug", "=", wantedSlug);
152
+ }
153
+ const statuses = (filters.workstreamStatuses || []).filter((status) => Boolean(status));
154
+ if (statuses.length > 0) {
155
+ qb = qb.where("workstream_status", "in", statuses);
156
+ }
157
+ else if (filters.workstreamStatus) {
158
+ qb = qb.where("workstream_status", "=", filters.workstreamStatus);
159
+ }
160
+ return qb;
161
+ };
162
+ const applyScopeOfWorkFilters = (qb, filters, wantedSlug) => {
163
+ if (filters.workstreamId) {
164
+ qb = qb.where("workstream_phid", "=", filters.workstreamId);
165
+ }
166
+ else if (filters.workstreamSlug) {
167
+ qb = qb.where("workstream_slug", "=", filters.workstreamSlug);
168
+ }
169
+ if (filters.networkId) {
170
+ qb = qb.where("network_phid", "=", filters.networkId);
171
+ }
172
+ else if (filters.networkSlug) {
173
+ qb = qb.where("network_slug", "=", filters.networkSlug);
174
+ }
175
+ else if (filters.networkName && wantedSlug) {
176
+ qb = qb.where("network_slug", "=", wantedSlug);
177
+ }
178
+ if (filters.workstreamStatus) {
179
+ qb = qb.where("workstream_status", "=", filters.workstreamStatus);
180
+ }
181
+ return qb;
182
+ };
183
+ return {
184
+ Query: {
185
+ processorWorkstreams: async (parent, args) => {
186
+ const drives = await getCandidateDrives();
187
+ const allProcessorWorkstreams = await Promise.all(drives.map(async (driveId) => {
188
+ return WorkstreamsProcessor.query(driveId, db)
189
+ .selectFrom("workstreams")
190
+ .selectAll()
191
+ .execute();
192
+ }));
193
+ // Flatten the array of arrays into a single array
194
+ const flattenedWorkstreams = allProcessorWorkstreams.flat();
195
+ return flattenedWorkstreams.map((workstream) => ({
196
+ network_phid: workstream.network_phid,
197
+ network_slug: workstream.network_slug,
198
+ workstream_phid: workstream.workstream_phid,
199
+ workstream_slug: workstream.workstream_slug,
200
+ workstream_title: workstream.workstream_title,
201
+ workstream_status: workstream.workstream_status,
202
+ sow_phid: workstream.sow_phid,
203
+ roadmap_oid: workstream.roadmap_oid,
204
+ final_milestone_target: workstream.final_milestone_target,
205
+ initial_proposal_status: workstream.initial_proposal_status,
206
+ initial_proposal_author: workstream.initial_proposal_author,
207
+ }));
208
+ },
209
+ workstream: async (parent, args) => {
210
+ const filters = args.filter || {};
211
+ const candidateDrives = await getCandidateDrives();
212
+ const wantedSlug = filters.networkSlug ||
213
+ (filters.networkName ? deriveSlug(filters.networkName) : undefined);
214
+ let resolved = null;
215
+ for (const driveId of candidateDrives) {
216
+ let qb = WorkstreamsProcessor.query(driveId, db)
217
+ .selectFrom("workstreams")
218
+ .selectAll();
219
+ qb = applyWorkstreamFilters(qb, filters, wantedSlug);
220
+ const row = await qb.executeTakeFirst();
221
+ if (!row)
222
+ continue;
223
+ resolved = await hydrateWorkstreamRow(row);
224
+ break;
225
+ }
226
+ return resolved;
227
+ },
228
+ workstreams: async (parent, args) => {
229
+ const filters = args.filter || {};
230
+ const candidateDrives = await getCandidateDrives();
231
+ // Check if any filters are provided
232
+ const hasFilters = filters.networkId ||
233
+ filters.networkSlug ||
234
+ filters.networkName ||
235
+ filters.workstreamStatus ||
236
+ (filters.workstreamStatuses &&
237
+ filters.workstreamStatuses.length > 0);
238
+ const wantedSlug = filters.networkSlug ||
239
+ (filters.networkName ? deriveSlug(filters.networkName) : undefined);
240
+ const results = [];
241
+ for (const driveId of candidateDrives) {
242
+ let qb = WorkstreamsProcessor.query(driveId, db)
243
+ .selectFrom("workstreams")
244
+ .selectAll();
245
+ // Only apply filters if any are provided
246
+ if (hasFilters) {
247
+ const filterArgs = {
248
+ networkId: filters.networkId,
249
+ networkSlug: filters.networkSlug,
250
+ networkName: filters.networkName,
251
+ workstreamStatus: filters.workstreamStatus,
252
+ workstreamStatuses: filters.workstreamStatuses,
253
+ };
254
+ qb = applyWorkstreamFilters(qb, filterArgs, wantedSlug);
255
+ }
256
+ const rows = await qb.execute();
257
+ if (rows.length === 0) {
258
+ continue;
259
+ }
260
+ for (const row of rows) {
261
+ const hydrated = await hydrateWorkstreamRow(row);
262
+ results.push(hydrated);
263
+ }
264
+ }
265
+ return results;
266
+ },
267
+ rfpByWorkstream: async (parent, args) => {
268
+ const filters = args.filter || {};
269
+ const candidateDrives = await getCandidateDrives();
270
+ const wantedSlug = filters.networkSlug ||
271
+ (filters.networkName ? deriveSlug(filters.networkName) : undefined);
272
+ const results = [];
273
+ for (const driveId of candidateDrives) {
274
+ let qb = WorkstreamsProcessor.query(driveId, db)
275
+ .selectFrom("workstreams")
276
+ .selectAll();
277
+ qb = applyWorkstreamFilters(qb, filters, wantedSlug);
278
+ const rows = await qb.execute();
279
+ if (rows.length === 0) {
280
+ continue;
281
+ }
282
+ for (const row of rows) {
283
+ const hydrated = await hydrateWorkstreamRow(row);
284
+ results.push({
285
+ code: hydrated.code,
286
+ title: hydrated.title,
287
+ status: hydrated.status,
288
+ rfp: hydrated.rfp,
289
+ });
290
+ }
291
+ if (filters.workstreamId || filters.workstreamSlug) {
292
+ break;
293
+ }
294
+ }
295
+ return results;
296
+ },
297
+ scopeOfWorkByNetworkOrStatus: async (parent, args) => {
298
+ const filters = args.filter || {};
299
+ const candidateDrives = await getCandidateDrives();
300
+ const wantedSlug = filters.networkSlug ||
301
+ (filters.networkName ? deriveSlug(filters.networkName) : undefined);
302
+ const results = [];
303
+ for (const driveId of candidateDrives) {
304
+ let qb = WorkstreamsProcessor.query(driveId, db)
305
+ .selectFrom("workstreams")
306
+ .selectAll();
307
+ qb = applyScopeOfWorkFilters(qb, filters, wantedSlug);
308
+ const rows = await qb.execute();
309
+ if (rows.length === 0) {
310
+ continue;
311
+ }
312
+ for (const row of rows) {
313
+ const hydrated = await hydrateWorkstreamRow(row);
314
+ // Collect SOWs based on proposalRole filter
315
+ const sowDocs = [];
316
+ if (!filters.proposalRole) {
317
+ // If no proposalRole specified, include all SOWs
318
+ if (hydrated.sow) {
319
+ sowDocs.push(hydrated.sow);
320
+ }
321
+ if (hydrated.initialProposal?.sow) {
322
+ sowDocs.push(hydrated.initialProposal.sow);
323
+ }
324
+ for (const altProposal of hydrated.alternativeProposals || []) {
325
+ if (altProposal.sow) {
326
+ sowDocs.push(altProposal.sow);
327
+ }
328
+ }
329
+ }
330
+ else if (filters.proposalRole === "INITIAL") {
331
+ if (hydrated.initialProposal?.sow) {
332
+ sowDocs.push(hydrated.initialProposal.sow);
333
+ }
334
+ }
335
+ else if (filters.proposalRole === "ALTERNATIVE") {
336
+ for (const altProposal of hydrated.alternativeProposals || []) {
337
+ if (altProposal.sow) {
338
+ sowDocs.push(altProposal.sow);
339
+ }
340
+ }
341
+ }
342
+ else if (filters.proposalRole === "AWARDED") {
343
+ // For AWARDED, we check if the workstream status is AWARDED
344
+ // and return the initial proposal's SOW (as it's typically the awarded one)
345
+ if (hydrated.status === "AWARDED" && hydrated.initialProposal?.sow) {
346
+ sowDocs.push(hydrated.initialProposal.sow);
347
+ }
348
+ }
349
+ // Filter out null/undefined SOWs and add to results
350
+ for (const sow of sowDocs) {
351
+ if (sow) {
352
+ results.push(sow);
353
+ }
354
+ }
355
+ }
356
+ if (filters.workstreamId || filters.workstreamSlug) {
357
+ break;
358
+ }
359
+ }
360
+ return results;
361
+ },
362
+ },
363
+ SOW_Progress: {
364
+ __resolveType(obj) {
365
+ if (obj && typeof obj === "object") {
366
+ if (Object.prototype.hasOwnProperty.call(obj, "total") && Object.prototype.hasOwnProperty.call(obj, "completed")) {
367
+ return "SOW_StoryPoint";
368
+ }
369
+ if (Object.prototype.hasOwnProperty.call(obj, "value")) {
370
+ return "SOW_Percentage";
371
+ }
372
+ if (Object.prototype.hasOwnProperty.call(obj, "done")) {
373
+ return "SOW_Binary";
374
+ }
375
+ }
376
+ return null;
377
+ }
378
+ }
379
+ };
380
+ };
@@ -0,0 +1,3 @@
1
+ import type { DocumentNode } from "graphql";
2
+ export declare const schema: DocumentNode;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/workstreams/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YAoUpB,CAAC"}