@powerhousedao/analytics-engine-graphql 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnalyticsModel.d.ts +25 -0
- package/dist/AnalyticsModel.js +128 -0
- package/dist/AnalyticsModel.js.map +1 -0
- package/dist/AnalyticsResolvers.d.ts +1 -0
- package/dist/AnalyticsResolvers.js +60 -0
- package/dist/AnalyticsResolvers.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/schema.d.ts +1 -0
- package/dist/schema.js +96 -0
- package/dist/schema.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AnalyticsQueryEngine } from "@powerhousedao/analytics-engine-core";
|
|
2
|
+
export type queryFilter = {
|
|
3
|
+
start?: Date;
|
|
4
|
+
end?: Date;
|
|
5
|
+
granularity?: string;
|
|
6
|
+
metrics: string[];
|
|
7
|
+
dimensions: [Record<string, string>];
|
|
8
|
+
currency?: string;
|
|
9
|
+
};
|
|
10
|
+
type CurrencyConversion = {
|
|
11
|
+
metric: string;
|
|
12
|
+
sourceCurrency: string;
|
|
13
|
+
};
|
|
14
|
+
type MultiCurrencyFilter = queryFilter & {
|
|
15
|
+
conversions: CurrencyConversion[];
|
|
16
|
+
};
|
|
17
|
+
export declare class AnalyticsModel {
|
|
18
|
+
readonly engine: AnalyticsQueryEngine;
|
|
19
|
+
constructor(engine: AnalyticsQueryEngine);
|
|
20
|
+
query(filter: queryFilter): Promise<import("@powerhousedao/analytics-engine-core").GroupedPeriodResults>;
|
|
21
|
+
multiCurrencyQuery(filter: MultiCurrencyFilter): Promise<import("@powerhousedao/analytics-engine-core").GroupedPeriodResults>;
|
|
22
|
+
getDimensions(): Promise<any>;
|
|
23
|
+
getCurrencies(): Promise<string[]>;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { AnalyticsGranularity, AnalyticsPath, } from "@powerhousedao/analytics-engine-core";
|
|
2
|
+
import { DateTime } from "luxon";
|
|
3
|
+
export class AnalyticsModel {
|
|
4
|
+
engine;
|
|
5
|
+
constructor(engine) {
|
|
6
|
+
this.engine = engine;
|
|
7
|
+
//
|
|
8
|
+
}
|
|
9
|
+
async query(filter) {
|
|
10
|
+
if (!filter) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const query = {
|
|
14
|
+
start: filter.start ? DateTime.fromJSDate(filter.start) : null,
|
|
15
|
+
end: filter.end ? DateTime.fromJSDate(filter.end) : null,
|
|
16
|
+
granularity: getGranularity(filter.granularity),
|
|
17
|
+
metrics: filter.metrics,
|
|
18
|
+
currency: getCurrency(filter.currency),
|
|
19
|
+
select: {},
|
|
20
|
+
lod: {},
|
|
21
|
+
};
|
|
22
|
+
if (query.start && !query.start.isValid) {
|
|
23
|
+
query.start = null;
|
|
24
|
+
}
|
|
25
|
+
if (query.end && !query.end.isValid) {
|
|
26
|
+
query.end = null;
|
|
27
|
+
}
|
|
28
|
+
if (filter.dimensions.length < 1) {
|
|
29
|
+
throw new Error("No dimensions provided");
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
filter.dimensions.forEach((dimension) => {
|
|
33
|
+
query.select[dimension.name] = [
|
|
34
|
+
AnalyticsPath.fromString(dimension.select),
|
|
35
|
+
];
|
|
36
|
+
query.lod[dimension.name] = Number(dimension.lod);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const results = await this.engine.execute(query);
|
|
40
|
+
return results;
|
|
41
|
+
// TODO: pull caching interface out into analytics module
|
|
42
|
+
//return measureAnalyticsQueryPerformance('analyticsQuery', 'analyticsQuery', query, false, "high");
|
|
43
|
+
}
|
|
44
|
+
async multiCurrencyQuery(filter) {
|
|
45
|
+
if (!filter) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
const query = {
|
|
49
|
+
start: filter.start ? DateTime.fromJSDate(filter.start) : null,
|
|
50
|
+
end: filter.end ? DateTime.fromJSDate(filter.end) : null,
|
|
51
|
+
granularity: getGranularity(filter.granularity),
|
|
52
|
+
metrics: filter.metrics,
|
|
53
|
+
currency: getCurrency(filter.currency),
|
|
54
|
+
select: {},
|
|
55
|
+
lod: {},
|
|
56
|
+
};
|
|
57
|
+
if (query.start && !query.start.isValid) {
|
|
58
|
+
query.start = null;
|
|
59
|
+
}
|
|
60
|
+
if (query.end && !query.end.isValid) {
|
|
61
|
+
query.end = null;
|
|
62
|
+
}
|
|
63
|
+
if (filter.dimensions.length < 1) {
|
|
64
|
+
throw new Error("No dimensions provided");
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
filter.dimensions.forEach((dimension) => {
|
|
68
|
+
query.select[dimension.name] = [
|
|
69
|
+
AnalyticsPath.fromString(dimension.select),
|
|
70
|
+
];
|
|
71
|
+
query.lod[dimension.name] = Number(dimension.lod);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return this.engine.executeMultiCurrency(query, {
|
|
75
|
+
targetCurrency: query.currency,
|
|
76
|
+
conversions: filter.conversions.map((c) => {
|
|
77
|
+
return {
|
|
78
|
+
metric: c.metric,
|
|
79
|
+
currency: getCurrency(c.sourceCurrency),
|
|
80
|
+
};
|
|
81
|
+
}),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async getDimensions() {
|
|
85
|
+
return await this.engine.getDimensions();
|
|
86
|
+
}
|
|
87
|
+
async getCurrencies() {
|
|
88
|
+
// todo: use knex inside of the analytics engine to select distinct currencies
|
|
89
|
+
return ["DAI", "FTE", "MKR", "USDC", "USDP", "USDT"];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const getGranularity = (granularity) => {
|
|
93
|
+
switch (granularity) {
|
|
94
|
+
case "hourly": {
|
|
95
|
+
return AnalyticsGranularity.Hourly;
|
|
96
|
+
}
|
|
97
|
+
case "daily": {
|
|
98
|
+
return AnalyticsGranularity.Daily;
|
|
99
|
+
}
|
|
100
|
+
case "weekly": {
|
|
101
|
+
return AnalyticsGranularity.Weekly;
|
|
102
|
+
}
|
|
103
|
+
case "monthly": {
|
|
104
|
+
return AnalyticsGranularity.Monthly;
|
|
105
|
+
}
|
|
106
|
+
case "quarterly": {
|
|
107
|
+
return AnalyticsGranularity.Quarterly;
|
|
108
|
+
}
|
|
109
|
+
case "semiAnnual": {
|
|
110
|
+
return AnalyticsGranularity.SemiAnnual;
|
|
111
|
+
}
|
|
112
|
+
case "annual": {
|
|
113
|
+
return AnalyticsGranularity.Annual;
|
|
114
|
+
}
|
|
115
|
+
case "total": {
|
|
116
|
+
return AnalyticsGranularity.Total;
|
|
117
|
+
}
|
|
118
|
+
default: {
|
|
119
|
+
return AnalyticsGranularity.Total;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const getCurrency = (currency) => {
|
|
124
|
+
return currency
|
|
125
|
+
? AnalyticsPath.fromString(currency)
|
|
126
|
+
: AnalyticsPath.fromString("");
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=AnalyticsModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsModel.js","sourceRoot":"","sources":["../src/AnalyticsModel.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,aAAa,GAGd,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAoBjC,MAAM,OAAO,cAAc;IACG;IAA5B,YAA4B,MAA4B;QAA5B,WAAM,GAAN,MAAM,CAAsB;QACtD,EAAE;IACJ,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,MAAmB;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAmB;YAC5B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;YAC9D,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;YACxD,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC;YAC/C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtC,MAAM,EAAE,EAAE;YACV,GAAG,EAAE,EAAE;SACR,CAAC;QAEF,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;gBACtC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;oBAC7B,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC;iBAC3C,CAAC;gBACF,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEjD,OAAO,OAAO,CAAC;QAEf,yDAAyD;QACzD,oGAAoG;IACtG,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,MAA2B;QACzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAmB;YAC5B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;YAC9D,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;YACxD,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC;YAC/C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtC,MAAM,EAAE,EAAE;YACV,GAAG,EAAE,EAAE;SACR,CAAC;QAEF,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;gBACtC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;oBAC7B,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC;iBAC3C,CAAC;gBACF,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE;YAC7C,cAAc,EAAE,KAAK,CAAC,QAAQ;YAC9B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACxC,OAAO;oBACL,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;iBACxC,CAAC;YACJ,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,8EAA8E;QAC9E,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;CACF;AAED,MAAM,cAAc,GAAG,CACrB,WAA+B,EACT,EAAE;IACxB,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,oBAAoB,CAAC,MAAM,CAAC;QACrC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,oBAAoB,CAAC,KAAK,CAAC;QACpC,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,oBAAoB,CAAC,MAAM,CAAC;QACrC,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,oBAAoB,CAAC,OAAO,CAAC;QACtC,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,oBAAoB,CAAC,SAAS,CAAC;QACxC,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,OAAO,oBAAoB,CAAC,UAAU,CAAC;QACzC,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,oBAAoB,CAAC,MAAM,CAAC;QACrC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,oBAAoB,CAAC,KAAK,CAAC;QACpC,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,oBAAoB,CAAC,KAAK,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,QAA4B,EAAE,EAAE;IACnD,OAAO,QAAQ;QACb,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;QACpC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const AnalyticsResolvers: any;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export const AnalyticsResolvers = {
|
|
2
|
+
Query: {
|
|
3
|
+
analytics: (_, __, { dataSources }) => {
|
|
4
|
+
return {};
|
|
5
|
+
},
|
|
6
|
+
},
|
|
7
|
+
AnalyticsQuery: {
|
|
8
|
+
series: async (parent, { filter }, { dataSources }) => {
|
|
9
|
+
const queryEngine = dataSources.db.Analytics;
|
|
10
|
+
const results = await queryEngine.query(filter);
|
|
11
|
+
return results.map((s) => ({
|
|
12
|
+
...s,
|
|
13
|
+
rows: s.rows.map((r) => ({
|
|
14
|
+
...r,
|
|
15
|
+
dimensions: Object.keys(r.dimensions).map((d) => ({
|
|
16
|
+
name: d,
|
|
17
|
+
path: r.dimensions[d]["path"],
|
|
18
|
+
icon: r.dimensions[d]["icon"],
|
|
19
|
+
label: r.dimensions[d]["label"],
|
|
20
|
+
description: r.dimensions[d]["description"],
|
|
21
|
+
})),
|
|
22
|
+
})),
|
|
23
|
+
}));
|
|
24
|
+
},
|
|
25
|
+
metrics: async (parent, { filter }, { dataSources }) => {
|
|
26
|
+
return [
|
|
27
|
+
"Budget",
|
|
28
|
+
"Forecast",
|
|
29
|
+
"Actuals",
|
|
30
|
+
"PaymentsOnChain",
|
|
31
|
+
"PaymentsOffChainIncluded",
|
|
32
|
+
];
|
|
33
|
+
},
|
|
34
|
+
dimensions: async (_, { filter }, { dataSources }) => {
|
|
35
|
+
const queryEngine = dataSources.db.Analytics;
|
|
36
|
+
return await queryEngine.getDimensions();
|
|
37
|
+
},
|
|
38
|
+
currencies: async (_, { filter }, { dataSources }) => {
|
|
39
|
+
return ["MKR", "DAI"];
|
|
40
|
+
},
|
|
41
|
+
multiCurrencySeries: async (_, { filter }, { dataSources }) => {
|
|
42
|
+
const queryEngine = dataSources.db.Analytics;
|
|
43
|
+
const results = await queryEngine.multiCurrencyQuery(filter);
|
|
44
|
+
return results.map((s) => ({
|
|
45
|
+
...s,
|
|
46
|
+
rows: s.rows.map((r) => ({
|
|
47
|
+
...r,
|
|
48
|
+
dimensions: Object.keys(r.dimensions).map((d) => ({
|
|
49
|
+
name: d,
|
|
50
|
+
path: r.dimensions[d]["path"],
|
|
51
|
+
icon: r.dimensions[d]["icon"],
|
|
52
|
+
label: r.dimensions[d]["label"],
|
|
53
|
+
description: r.dimensions[d]["description"],
|
|
54
|
+
})),
|
|
55
|
+
})),
|
|
56
|
+
}));
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=AnalyticsResolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsResolvers.js","sourceRoot":"","sources":["../src/AnalyticsResolvers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const typedefs = "\ntype AnalyticsQuery {\n series(filter: AnalyticsFilter): [AnalyticsPeriod]\n multiCurrencySeries(filter: MultiCurrencyConversions): [AnalyticsPeriod]\n metrics: [String]\n dimensions: [Dimension]\n currencies: [String]\n}\n\ntype AnalyticsPeriod {\n period: String\n start: DateTime\n end: DateTime\n rows: [AnalyticsSeries]\n}\n\ntype AnalyticsSeries {\n dimensions: [AnalyticsSeriesDimension]\n metric: String\n unit: String\n value: Float\n sum: Float\n}\n\ntype AnalyticsSeriesDimension {\n name: String\n path: String\n label: String\n description: String\n icon: String\n}\n\ntype Dimension {\n name: String\n values: [Value]\n}\n\ntype Value {\n path: String\n label: String\n description: String\n icon: String\n}\n\nenum AnalyticsGranularity {\n hourly\n daily\n weekly\n monthly\n quarterly\n semiAnnual\n annual\n total\n}\n\ninput AnalyticsFilterDimension {\n name: String!\n select: String!\n lod: Int!\n}\n\ninput MultiCurrencyConversions {\n start: String\n end: String\n \"Period to group by\"\n granularity: AnalyticsGranularity\n \"List of metrics to filter by, such as 'budget' or 'actuals'\"\n metrics: [String]\n \"List of dimensions to filter by, such as 'budget' or 'project'\"\n dimensions: [AnalyticsFilterDimension]\n currency: String\n conversions: [CurrencyConversion]!\n}\n\ninput CurrencyConversion {\n metric: String!\n sourceCurrency: String!\n}\n\ninput AnalyticsFilter {\n start: String\n end: String\n \"Period to group by\"\n granularity: AnalyticsGranularity\n \"List of metrics to filter by, such as 'budget' or 'actuals'\"\n metrics: [String]\n \"List of dimensions to filter by, such as 'budget' or 'project'\"\n dimensions: [AnalyticsFilterDimension]\n currency: String\n}\n\nextend type Query {\n analytics: AnalyticsQuery\n}\n";
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export const typedefs = `
|
|
2
|
+
type AnalyticsQuery {
|
|
3
|
+
series(filter: AnalyticsFilter): [AnalyticsPeriod]
|
|
4
|
+
multiCurrencySeries(filter: MultiCurrencyConversions): [AnalyticsPeriod]
|
|
5
|
+
metrics: [String]
|
|
6
|
+
dimensions: [Dimension]
|
|
7
|
+
currencies: [String]
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type AnalyticsPeriod {
|
|
11
|
+
period: String
|
|
12
|
+
start: DateTime
|
|
13
|
+
end: DateTime
|
|
14
|
+
rows: [AnalyticsSeries]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type AnalyticsSeries {
|
|
18
|
+
dimensions: [AnalyticsSeriesDimension]
|
|
19
|
+
metric: String
|
|
20
|
+
unit: String
|
|
21
|
+
value: Float
|
|
22
|
+
sum: Float
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type AnalyticsSeriesDimension {
|
|
26
|
+
name: String
|
|
27
|
+
path: String
|
|
28
|
+
label: String
|
|
29
|
+
description: String
|
|
30
|
+
icon: String
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type Dimension {
|
|
34
|
+
name: String
|
|
35
|
+
values: [Value]
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
type Value {
|
|
39
|
+
path: String
|
|
40
|
+
label: String
|
|
41
|
+
description: String
|
|
42
|
+
icon: String
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
enum AnalyticsGranularity {
|
|
46
|
+
hourly
|
|
47
|
+
daily
|
|
48
|
+
weekly
|
|
49
|
+
monthly
|
|
50
|
+
quarterly
|
|
51
|
+
semiAnnual
|
|
52
|
+
annual
|
|
53
|
+
total
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
input AnalyticsFilterDimension {
|
|
57
|
+
name: String!
|
|
58
|
+
select: String!
|
|
59
|
+
lod: Int!
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
input MultiCurrencyConversions {
|
|
63
|
+
start: String
|
|
64
|
+
end: String
|
|
65
|
+
"Period to group by"
|
|
66
|
+
granularity: AnalyticsGranularity
|
|
67
|
+
"List of metrics to filter by, such as 'budget' or 'actuals'"
|
|
68
|
+
metrics: [String]
|
|
69
|
+
"List of dimensions to filter by, such as 'budget' or 'project'"
|
|
70
|
+
dimensions: [AnalyticsFilterDimension]
|
|
71
|
+
currency: String
|
|
72
|
+
conversions: [CurrencyConversion]!
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
input CurrencyConversion {
|
|
76
|
+
metric: String!
|
|
77
|
+
sourceCurrency: String!
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
input AnalyticsFilter {
|
|
81
|
+
start: String
|
|
82
|
+
end: String
|
|
83
|
+
"Period to group by"
|
|
84
|
+
granularity: AnalyticsGranularity
|
|
85
|
+
"List of metrics to filter by, such as 'budget' or 'actuals'"
|
|
86
|
+
metrics: [String]
|
|
87
|
+
"List of dimensions to filter by, such as 'budget' or 'project'"
|
|
88
|
+
dimensions: [AnalyticsFilterDimension]
|
|
89
|
+
currency: String
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
extend type Query {
|
|
93
|
+
analytics: AnalyticsQuery
|
|
94
|
+
}
|
|
95
|
+
`;
|
|
96
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FvB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@powerhousedao/analytics-engine-graphql",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "AGPL-3.0-only",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"dev": "tsc-watch",
|
|
13
|
+
"build": "rm -rf dist/ && tsc",
|
|
14
|
+
"test": "vitest"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@powerhousedao/analytics-engine-core": "^0.3.0",
|
|
18
|
+
"luxon": "^3.5.0"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/luxon": "^3.4.2",
|
|
22
|
+
"tsc-watch": "^6.2.0",
|
|
23
|
+
"typescript": "^5.6.3",
|
|
24
|
+
"vitest": "^2.1.3"
|
|
25
|
+
}
|
|
26
|
+
}
|