@the-situation/indexer 0.17.0 → 0.18.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/README.md +43 -4
- package/dist/aggregator/cohort.d.ts +30 -0
- package/dist/aggregator/cohort.d.ts.map +1 -0
- package/dist/aggregator/cohort.js +153 -0
- package/dist/aggregator/cohort.js.map +1 -0
- package/dist/aggregator/daily.d.ts +71 -0
- package/dist/aggregator/daily.d.ts.map +1 -0
- package/dist/aggregator/daily.js +249 -0
- package/dist/aggregator/daily.js.map +1 -0
- package/dist/aggregator/domains.d.ts +20 -0
- package/dist/aggregator/domains.d.ts.map +1 -0
- package/dist/aggregator/domains.js +38 -0
- package/dist/aggregator/domains.js.map +1 -0
- package/dist/aggregator/index.d.ts +31 -0
- package/dist/aggregator/index.d.ts.map +1 -0
- package/dist/aggregator/index.js +100 -0
- package/dist/aggregator/index.js.map +1 -0
- package/dist/aggregator/lifetime.d.ts +52 -0
- package/dist/aggregator/lifetime.d.ts.map +1 -0
- package/dist/aggregator/lifetime.js +222 -0
- package/dist/aggregator/lifetime.js.map +1 -0
- package/dist/aggregator/roi.d.ts +42 -0
- package/dist/aggregator/roi.d.ts.map +1 -0
- package/dist/aggregator/roi.js +153 -0
- package/dist/aggregator/roi.js.map +1 -0
- package/dist/aggregator/sources.d.ts +59 -0
- package/dist/aggregator/sources.d.ts.map +1 -0
- package/dist/aggregator/sources.js +53 -0
- package/dist/aggregator/sources.js.map +1 -0
- package/dist/aggregator/writers.d.ts +22 -0
- package/dist/aggregator/writers.d.ts.map +1 -0
- package/dist/aggregator/writers.js +147 -0
- package/dist/aggregator/writers.js.map +1 -0
- package/dist/api/app.d.ts +177 -13
- package/dist/api/app.d.ts.map +1 -1
- package/dist/api/app.js +4 -3
- package/dist/api/app.js.map +1 -1
- package/dist/api/routes/admin-subscriptions.d.ts +11 -11
- package/dist/api/routes/analytics.d.ts +205 -0
- package/dist/api/routes/analytics.d.ts.map +1 -0
- package/dist/api/routes/analytics.js +122 -0
- package/dist/api/routes/analytics.js.map +1 -0
- package/dist/api/routes/health.d.ts.map +1 -1
- package/dist/api/routes/health.js +2 -0
- package/dist/api/routes/health.js.map +1 -1
- package/dist/api/routes/index.d.ts +1 -0
- package/dist/api/routes/index.d.ts.map +1 -1
- package/dist/api/routes/index.js +1 -0
- package/dist/api/routes/index.js.map +1 -1
- package/dist/api/routes/rankings.d.ts +17 -3
- package/dist/api/routes/rankings.d.ts.map +1 -1
- package/dist/api/routes/rankings.js +44 -5
- package/dist/api/routes/rankings.js.map +1 -1
- package/dist/api/routes/trader-stats.d.ts +11 -2
- package/dist/api/routes/trader-stats.d.ts.map +1 -1
- package/dist/api/routes/trader-stats.js +72 -2
- package/dist/api/routes/trader-stats.js.map +1 -1
- package/dist/client/IndexerClient.d.ts +30 -1
- package/dist/client/IndexerClient.d.ts.map +1 -1
- package/dist/client/IndexerClient.js.map +1 -1
- package/dist/client/IndexerClientLive.d.ts.map +1 -1
- package/dist/client/IndexerClientLive.js +50 -1
- package/dist/client/IndexerClientLive.js.map +1 -1
- package/dist/client/convenience.d.ts +9 -2
- package/dist/client/convenience.d.ts.map +1 -1
- package/dist/client/convenience.js +9 -1
- package/dist/client/convenience.js.map +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/config.d.ts +17 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +39 -3
- package/dist/config.js.map +1 -1
- package/dist/etl/event-indexer.d.ts +1 -1
- package/dist/etl/lp-position-refresher.d.ts +2 -1
- package/dist/etl/lp-position-refresher.d.ts.map +1 -1
- package/dist/etl/lp-position-refresher.js +24 -11
- package/dist/etl/lp-position-refresher.js.map +1 -1
- package/dist/index.js +64 -8
- package/dist/index.js.map +1 -1
- package/dist/layers/ChainReaderLive.d.ts.map +1 -1
- package/dist/layers/ChainReaderLive.js +15 -0
- package/dist/layers/ChainReaderLive.js.map +1 -1
- package/dist/layers/VoyagerClientLive.d.ts +2 -1
- package/dist/layers/VoyagerClientLive.d.ts.map +1 -1
- package/dist/layers/VoyagerClientLive.js +89 -55
- package/dist/layers/VoyagerClientLive.js.map +1 -1
- package/dist/services/ChainReader.d.ts +10 -0
- package/dist/services/ChainReader.d.ts.map +1 -1
- package/dist/services/ChainReader.js.map +1 -1
- package/dist/services/VoyagerRateLimit.d.ts +11 -8
- package/dist/services/VoyagerRateLimit.d.ts.map +1 -1
- package/dist/services/VoyagerRateLimit.js +51 -26
- package/dist/services/VoyagerRateLimit.js.map +1 -1
- package/dist/types/analytics.d.ts +194 -0
- package/dist/types/analytics.d.ts.map +1 -0
- package/dist/types/analytics.js +10 -0
- package/dist/types/analytics.js.map +1 -0
- package/dist/types/api.d.ts +2 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/warehouse/analytics-helpers.d.ts +36 -0
- package/dist/warehouse/analytics-helpers.d.ts.map +1 -0
- package/dist/warehouse/analytics-helpers.js +142 -0
- package/dist/warehouse/analytics-helpers.js.map +1 -0
- package/dist/warehouse/backfill.d.ts +26 -0
- package/dist/warehouse/backfill.d.ts.map +1 -0
- package/dist/warehouse/backfill.js +77 -0
- package/dist/warehouse/backfill.js.map +1 -0
- package/dist/warehouse/connection.d.ts +18 -0
- package/dist/warehouse/connection.d.ts.map +1 -0
- package/dist/warehouse/connection.js +24 -0
- package/dist/warehouse/connection.js.map +1 -0
- package/dist/warehouse/index.d.ts +14 -0
- package/dist/warehouse/index.d.ts.map +1 -0
- package/dist/warehouse/index.js +14 -0
- package/dist/warehouse/index.js.map +1 -0
- package/dist/warehouse/repositories/analytics.d.ts +61 -0
- package/dist/warehouse/repositories/analytics.d.ts.map +1 -0
- package/dist/warehouse/repositories/analytics.js +418 -0
- package/dist/warehouse/repositories/analytics.js.map +1 -0
- package/dist/warehouse/schema.d.ts +9 -0
- package/dist/warehouse/schema.d.ts.map +1 -0
- package/dist/warehouse/schema.js +219 -0
- package/dist/warehouse/schema.js.map +1 -0
- package/dist/warehouse/seed-domains.d.ts +29 -0
- package/dist/warehouse/seed-domains.d.ts.map +1 -0
- package/dist/warehouse/seed-domains.js +223 -0
- package/dist/warehouse/seed-domains.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/analytics/* — analytics endpoints backed by the Postgres warehouse.
|
|
3
|
+
*
|
|
4
|
+
* Routes:
|
|
5
|
+
* GET /api/analytics/overview — platform-wide headline stats
|
|
6
|
+
* GET /api/analytics/domains — per-domain summary list
|
|
7
|
+
* GET /api/analytics/domains/:slug — domain detail (time-series + top-N)
|
|
8
|
+
* GET /api/analytics/cohorts — cohort retention curves
|
|
9
|
+
* GET /api/analytics/roi — ROI distribution + summary stats
|
|
10
|
+
* GET /api/analytics/leaderboard — leaderboard with ?domain= and time window
|
|
11
|
+
* GET /api/analytics/traders/:address — per-trader analytics (per-domain + cohort)
|
|
12
|
+
*
|
|
13
|
+
* These routes are only registered when WAREHOUSE_DATABASE_URL is set.
|
|
14
|
+
*
|
|
15
|
+
* Validation errors throw via parseAnalyticsFilters / parseEntityType — the
|
|
16
|
+
* shared error-handler maps Error → 400 (we tag it explicitly via `set.status`).
|
|
17
|
+
*/
|
|
18
|
+
import { Elysia } from 'elysia';
|
|
19
|
+
import { parseAnalyticsFilters, parseEntityType, } from '../../warehouse/analytics-helpers';
|
|
20
|
+
const ADDRESS_RE = /^0x[0-9a-fA-F]+$/;
|
|
21
|
+
const SLUG_RE = /^[a-z][a-z0-9_-]*$/;
|
|
22
|
+
const NOT_CONFIGURED_BODY = {
|
|
23
|
+
error: 'Analytics warehouse is not configured (set WAREHOUSE_DATABASE_URL).',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Registers analytics routes. When `repo` is null (warehouse not configured),
|
|
27
|
+
* every analytics route returns 503 with a clear message so consumers can
|
|
28
|
+
* fall back gracefully.
|
|
29
|
+
*/
|
|
30
|
+
export const analyticsRoutes = (repo) => new Elysia()
|
|
31
|
+
.get('/api/analytics/overview', async ({ set }) => {
|
|
32
|
+
if (!repo) {
|
|
33
|
+
set.status = 503;
|
|
34
|
+
return NOT_CONFIGURED_BODY;
|
|
35
|
+
}
|
|
36
|
+
return repo.getOverview();
|
|
37
|
+
})
|
|
38
|
+
.get('/api/analytics/domains', async ({ set }) => {
|
|
39
|
+
if (!repo) {
|
|
40
|
+
set.status = 503;
|
|
41
|
+
return NOT_CONFIGURED_BODY;
|
|
42
|
+
}
|
|
43
|
+
return repo.getDomains();
|
|
44
|
+
})
|
|
45
|
+
.get('/api/analytics/domains/:slug', async ({ params, set }) => {
|
|
46
|
+
if (!repo) {
|
|
47
|
+
set.status = 503;
|
|
48
|
+
return NOT_CONFIGURED_BODY;
|
|
49
|
+
}
|
|
50
|
+
const slug = String(params.slug ?? '').toLowerCase();
|
|
51
|
+
if (!SLUG_RE.test(slug)) {
|
|
52
|
+
set.status = 400;
|
|
53
|
+
return { error: `Invalid domain slug: ${slug}` };
|
|
54
|
+
}
|
|
55
|
+
const detail = await repo.getDomainDetail(slug);
|
|
56
|
+
if (!detail) {
|
|
57
|
+
set.status = 404;
|
|
58
|
+
return { error: `Domain not found: ${slug}` };
|
|
59
|
+
}
|
|
60
|
+
return detail;
|
|
61
|
+
})
|
|
62
|
+
.get('/api/analytics/cohorts', async ({ query, set }) => {
|
|
63
|
+
if (!repo) {
|
|
64
|
+
set.status = 503;
|
|
65
|
+
return NOT_CONFIGURED_BODY;
|
|
66
|
+
}
|
|
67
|
+
const q = query;
|
|
68
|
+
try {
|
|
69
|
+
const filters = parseAnalyticsFilters({ domain: q.domain });
|
|
70
|
+
const entityType = parseEntityType(q.entityType ?? q.entity_type);
|
|
71
|
+
return await repo.getCohorts({ entityType, domain: filters.domain });
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
set.status = 400;
|
|
75
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
.get('/api/analytics/roi', async ({ query, set }) => {
|
|
79
|
+
if (!repo) {
|
|
80
|
+
set.status = 503;
|
|
81
|
+
return NOT_CONFIGURED_BODY;
|
|
82
|
+
}
|
|
83
|
+
const q = query;
|
|
84
|
+
try {
|
|
85
|
+
const filters = parseAnalyticsFilters({ domain: q.domain });
|
|
86
|
+
const entityType = parseEntityType(q.entityType ?? q.entity_type);
|
|
87
|
+
return await repo.getRoi({ entityType, domain: filters.domain });
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
set.status = 400;
|
|
91
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
.get('/api/analytics/leaderboard', async ({ query, set }) => {
|
|
95
|
+
if (!repo) {
|
|
96
|
+
set.status = 503;
|
|
97
|
+
return NOT_CONFIGURED_BODY;
|
|
98
|
+
}
|
|
99
|
+
const q = query;
|
|
100
|
+
try {
|
|
101
|
+
const filters = parseAnalyticsFilters(q);
|
|
102
|
+
const limit = Math.min(Math.max(1, Number.parseInt(q.limit ?? '50', 10) || 50), 500);
|
|
103
|
+
return await repo.getLeaderboard({ ...filters, limit });
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
set.status = 400;
|
|
107
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
.get('/api/analytics/traders/:address', async ({ params, set }) => {
|
|
111
|
+
if (!repo) {
|
|
112
|
+
set.status = 503;
|
|
113
|
+
return NOT_CONFIGURED_BODY;
|
|
114
|
+
}
|
|
115
|
+
const address = String(params.address ?? '');
|
|
116
|
+
if (!ADDRESS_RE.test(address)) {
|
|
117
|
+
set.status = 400;
|
|
118
|
+
return { error: `Invalid address: ${address}` };
|
|
119
|
+
}
|
|
120
|
+
return await repo.getTraderAnalytics(address);
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/api/routes/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,eAAO,MAAM,YAAY,GAAI,IAAI,eAAe,EAAE,WAAW,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,eAAO,MAAM,YAAY,GAAI,IAAI,eAAe,EAAE,WAAW,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgC9E,CAAC"}
|
|
@@ -25,6 +25,8 @@ export const healthRoutes = (db, rateLimit) => new Elysia().get('/health', () =>
|
|
|
25
25
|
lastPollAt: null,
|
|
26
26
|
voyager: {
|
|
27
27
|
isLimited: voyagerStatus.isLimited,
|
|
28
|
+
activeKeyCount: voyagerStatus.activeKeyCount,
|
|
29
|
+
limitedKeyCount: voyagerStatus.limitedKeyCount,
|
|
28
30
|
retryInSeconds: voyagerStatus.retryInSeconds,
|
|
29
31
|
escalationLevel: voyagerStatus.escalationLevel,
|
|
30
32
|
message: voyagerStatus.message,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAmB,EAAE,SAAgC,EAAE,EAAE,CACpF,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,GAAmB,EAAE;IAC/C,IAAI,QAAQ,GAAiC,cAAc,CAAC;IAC5D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,IAAI,CAAC;QACH,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,QAAQ,GAAG,WAAW,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;IAE5C,OAAO;QACL,MAAM,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QACxF,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;QACnD,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,cAAc,EAAE,aAAa,CAAC,cAAc;YAC5C,eAAe,EAAE,aAAa,CAAC,eAAe;YAC9C,OAAO,EAAE,aAAa,CAAC,OAAO;SAC/B;KACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAmB,EAAE,SAAgC,EAAE,EAAE,CACpF,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,GAAmB,EAAE;IAC/C,IAAI,QAAQ,GAAiC,cAAc,CAAC;IAC5D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,IAAI,CAAC;QACH,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,QAAQ,GAAG,WAAW,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;IAE5C,OAAO;QACL,MAAM,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QACxF,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;QACnD,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,cAAc,EAAE,aAAa,CAAC,cAAc;YAC5C,eAAe,EAAE,aAAa,CAAC,eAAe;YAC9C,cAAc,EAAE,aAAa,CAAC,cAAc;YAC5C,eAAe,EAAE,aAAa,CAAC,eAAe;YAC9C,OAAO,EAAE,aAAa,CAAC,OAAO;SAC/B;KACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC"}
|
package/dist/api/routes/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC"}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GET /api/rankings —
|
|
2
|
+
* GET /api/rankings — leaderboard with optional ?domain=&from=&to= filters.
|
|
3
|
+
*
|
|
4
|
+
* Filter behaviour:
|
|
5
|
+
* - No filters → SQLite-backed lifetime leaderboard (current behaviour).
|
|
6
|
+
* - domain=<slug>, from=, to= → routed to the warehouse-backed analytics
|
|
7
|
+
* leaderboard, which knows how to slice by domain & time-window. Response
|
|
8
|
+
* shape stays compatible (RankingEntry[]) so existing webapp consumers
|
|
9
|
+
* don't break.
|
|
10
|
+
*
|
|
11
|
+
* If filters are passed but the warehouse is not configured, we 503 — the
|
|
12
|
+
* filtered view requires the warehouse to be running.
|
|
3
13
|
*/
|
|
4
14
|
import { Elysia } from 'elysia';
|
|
5
15
|
import type { DatabaseService } from '../../services/Database';
|
|
6
|
-
|
|
16
|
+
import type { RankingEntry } from '../../types/api';
|
|
17
|
+
import type { AnalyticsRepository } from '../../warehouse/repositories/analytics';
|
|
18
|
+
export declare const rankingRoutes: (db: DatabaseService, analytics: AnalyticsRepository | null) => Elysia<"", {
|
|
7
19
|
decorator: {};
|
|
8
20
|
store: {};
|
|
9
21
|
derive: {};
|
|
@@ -27,7 +39,9 @@ export declare const rankingRoutes: (db: DatabaseService) => Elysia<"", {
|
|
|
27
39
|
query: unknown;
|
|
28
40
|
headers: unknown;
|
|
29
41
|
response: {
|
|
30
|
-
200:
|
|
42
|
+
200: RankingEntry[] | {
|
|
43
|
+
error: string;
|
|
44
|
+
};
|
|
31
45
|
};
|
|
32
46
|
};
|
|
33
47
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rankings.d.ts","sourceRoot":"","sources":["../../../src/api/routes/rankings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rankings.d.ts","sourceRoot":"","sources":["../../../src/api/routes/rankings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAGlF,eAAO,MAAM,aAAa,GACxB,IAAI,eAAe,EACnB,WAAW,mBAAmB,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CnC,CAAC"}
|
|
@@ -1,10 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GET /api/rankings —
|
|
2
|
+
* GET /api/rankings — leaderboard with optional ?domain=&from=&to= filters.
|
|
3
|
+
*
|
|
4
|
+
* Filter behaviour:
|
|
5
|
+
* - No filters → SQLite-backed lifetime leaderboard (current behaviour).
|
|
6
|
+
* - domain=<slug>, from=, to= → routed to the warehouse-backed analytics
|
|
7
|
+
* leaderboard, which knows how to slice by domain & time-window. Response
|
|
8
|
+
* shape stays compatible (RankingEntry[]) so existing webapp consumers
|
|
9
|
+
* don't break.
|
|
10
|
+
*
|
|
11
|
+
* If filters are passed but the warehouse is not configured, we 503 — the
|
|
12
|
+
* filtered view requires the warehouse to be running.
|
|
3
13
|
*/
|
|
4
14
|
import { Elysia } from 'elysia';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
15
|
+
import { parseAnalyticsFilters } from '../../warehouse/analytics-helpers';
|
|
16
|
+
export const rankingRoutes = (db, analytics) => new Elysia().get('/api/rankings', async ({ query, set }) => {
|
|
17
|
+
const q = query;
|
|
18
|
+
const limit = Math.min(Math.max(1, parseInt(q.limit ?? '50', 10) || 50), 200);
|
|
19
|
+
const wantsFiltered = (q.domain != null && q.domain !== '' && q.domain !== 'all') ||
|
|
20
|
+
q.from != null ||
|
|
21
|
+
q.to != null;
|
|
22
|
+
if (!wantsFiltered) {
|
|
23
|
+
return db.rankings.getLeaderboard(limit);
|
|
24
|
+
}
|
|
25
|
+
if (!analytics) {
|
|
26
|
+
set.status = 503;
|
|
27
|
+
return {
|
|
28
|
+
error: 'Filtered rankings require the analytics warehouse, which is not configured.',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
let filters;
|
|
32
|
+
try {
|
|
33
|
+
filters = parseAnalyticsFilters(q);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
set.status = 400;
|
|
37
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
38
|
+
}
|
|
39
|
+
const result = await analytics.getLeaderboard({ ...filters, limit });
|
|
40
|
+
// Backwards-compatible shape — webapp's existing useLeaderboard consumes RankingEntry[].
|
|
41
|
+
const compat = result.entries.map((e) => ({
|
|
42
|
+
trader: e.trader,
|
|
43
|
+
totalPnl: e.totalPnl,
|
|
44
|
+
marketsTraded: e.marketsTraded,
|
|
45
|
+
totalTrades: e.totalTrades,
|
|
46
|
+
}));
|
|
47
|
+
return compat;
|
|
9
48
|
});
|
|
10
49
|
//# sourceMappingURL=rankings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rankings.js","sourceRoot":"","sources":["../../../src/api/routes/rankings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rankings.js","sourceRoot":"","sources":["../../../src/api/routes/rankings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,EAAmB,EACnB,SAAqC,EACrC,EAAE,CACF,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;IACzD,MAAM,CAAC,GAAG,KAKT,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAE9E,MAAM,aAAa,GACjB,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC;QAC3D,CAAC,CAAC,IAAI,IAAI,IAAI;QACd,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC;IAEf,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO;YACL,KAAK,EAAE,6EAA6E;SACrF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,yFAAyF;IACzF,MAAM,MAAM,GAAmB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC,CAAC,CAAC;IACJ,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,CAAC"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GET /api/positions/:trader/stats — aggregated trader statistics.
|
|
3
|
+
*
|
|
4
|
+
* Optional ?domain=<slug> routes the request to the warehouse-backed analytics
|
|
5
|
+
* trader endpoint and returns a domain-filtered subset of the same fields.
|
|
6
|
+
* Time-window filters (?from=, ?to=) are accepted but currently apply only to
|
|
7
|
+
* the warehouse path — they sum daily fact rows in the window.
|
|
3
8
|
*/
|
|
4
9
|
import { Elysia } from 'elysia';
|
|
5
10
|
import type { DatabaseService } from '../../services/Database';
|
|
6
|
-
|
|
11
|
+
import type { TraderStatsResponse } from '../../types/api';
|
|
12
|
+
import type { AnalyticsRepository } from '../../warehouse/repositories/analytics';
|
|
13
|
+
export declare const traderStatsRoutes: (db: DatabaseService, analytics: AnalyticsRepository | null) => Elysia<"", {
|
|
7
14
|
decorator: {};
|
|
8
15
|
store: {};
|
|
9
16
|
derive: {};
|
|
@@ -31,7 +38,9 @@ export declare const traderStatsRoutes: (db: DatabaseService) => Elysia<"", {
|
|
|
31
38
|
query: unknown;
|
|
32
39
|
headers: unknown;
|
|
33
40
|
response: {
|
|
34
|
-
200:
|
|
41
|
+
200: TraderStatsResponse | {
|
|
42
|
+
error: string;
|
|
43
|
+
};
|
|
35
44
|
422: {
|
|
36
45
|
type: "validation";
|
|
37
46
|
on: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trader-stats.d.ts","sourceRoot":"","sources":["../../../src/api/routes/trader-stats.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"trader-stats.d.ts","sourceRoot":"","sources":["../../../src/api/routes/trader-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAGlF,eAAO,MAAM,iBAAiB,GAC5B,IAAI,eAAe,EACnB,WAAW,mBAAmB,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0EnC,CAAC"}
|
|
@@ -1,8 +1,78 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GET /api/positions/:trader/stats — aggregated trader statistics.
|
|
3
|
+
*
|
|
4
|
+
* Optional ?domain=<slug> routes the request to the warehouse-backed analytics
|
|
5
|
+
* trader endpoint and returns a domain-filtered subset of the same fields.
|
|
6
|
+
* Time-window filters (?from=, ?to=) are accepted but currently apply only to
|
|
7
|
+
* the warehouse path — they sum daily fact rows in the window.
|
|
3
8
|
*/
|
|
4
9
|
import { Elysia } from 'elysia';
|
|
5
|
-
|
|
6
|
-
|
|
10
|
+
import { parseAnalyticsFilters } from '../../warehouse/analytics-helpers';
|
|
11
|
+
export const traderStatsRoutes = (db, analytics) => new Elysia().get('/api/positions/:trader/stats', async ({ params, query, set }) => {
|
|
12
|
+
const q = query;
|
|
13
|
+
const wantsFiltered = (q.domain != null && q.domain !== '' && q.domain !== 'all') ||
|
|
14
|
+
q.from != null ||
|
|
15
|
+
q.to != null;
|
|
16
|
+
if (!wantsFiltered) {
|
|
17
|
+
return db.rankings.getTraderStats(params.trader);
|
|
18
|
+
}
|
|
19
|
+
if (!analytics) {
|
|
20
|
+
set.status = 503;
|
|
21
|
+
return {
|
|
22
|
+
error: 'Filtered trader stats require the analytics warehouse, which is not configured.',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
let filters;
|
|
26
|
+
try {
|
|
27
|
+
filters = parseAnalyticsFilters(q);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
set.status = 400;
|
|
31
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
32
|
+
}
|
|
33
|
+
const traderAnalytics = await analytics.getTraderAnalytics(params.trader);
|
|
34
|
+
if (!traderAnalytics.lifetime) {
|
|
35
|
+
// Trader has never traded — return zero stats consistent with TraderStatsResponse shape.
|
|
36
|
+
const empty = {
|
|
37
|
+
trader: params.trader,
|
|
38
|
+
totalPnl: 0,
|
|
39
|
+
unrealizedPnl: 0,
|
|
40
|
+
biggestWin: 0,
|
|
41
|
+
totalTrades: 0,
|
|
42
|
+
marketsTraded: 0,
|
|
43
|
+
firstTradeAt: null,
|
|
44
|
+
lastTradeAt: null,
|
|
45
|
+
};
|
|
46
|
+
return empty;
|
|
47
|
+
}
|
|
48
|
+
if (filters.domain !== 'all') {
|
|
49
|
+
// Domain-filtered slice — read from perDomain.
|
|
50
|
+
const domainSlice = traderAnalytics.perDomain.find((d) => d.slug === filters.domain);
|
|
51
|
+
const stats = {
|
|
52
|
+
trader: params.trader,
|
|
53
|
+
// P&L is not currently tracked per-domain; expose lifetime totals so the
|
|
54
|
+
// client can show "domain stats + portfolio P&L". This is honest about
|
|
55
|
+
// current capability — no fake per-domain P&L.
|
|
56
|
+
totalPnl: traderAnalytics.lifetime.totalPnl,
|
|
57
|
+
unrealizedPnl: traderAnalytics.lifetime.unrealizedPnl,
|
|
58
|
+
biggestWin: 0,
|
|
59
|
+
totalTrades: domainSlice?.tradeCount ?? 0,
|
|
60
|
+
marketsTraded: domainSlice?.marketsTraded ?? 0,
|
|
61
|
+
firstTradeAt: traderAnalytics.lifetime.firstTradeAt,
|
|
62
|
+
lastTradeAt: traderAnalytics.lifetime.lastTradeAt,
|
|
63
|
+
};
|
|
64
|
+
return stats;
|
|
65
|
+
}
|
|
66
|
+
const stats = {
|
|
67
|
+
trader: params.trader,
|
|
68
|
+
totalPnl: traderAnalytics.lifetime.totalPnl,
|
|
69
|
+
unrealizedPnl: traderAnalytics.lifetime.unrealizedPnl,
|
|
70
|
+
biggestWin: 0,
|
|
71
|
+
totalTrades: traderAnalytics.lifetime.totalTrades,
|
|
72
|
+
marketsTraded: traderAnalytics.lifetime.marketsTraded,
|
|
73
|
+
firstTradeAt: traderAnalytics.lifetime.firstTradeAt,
|
|
74
|
+
lastTradeAt: traderAnalytics.lifetime.lastTradeAt,
|
|
75
|
+
};
|
|
76
|
+
return stats;
|
|
7
77
|
});
|
|
8
78
|
//# sourceMappingURL=trader-stats.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trader-stats.js","sourceRoot":"","sources":["../../../src/api/routes/trader-stats.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"trader-stats.js","sourceRoot":"","sources":["../../../src/api/routes/trader-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { Context, type Effect } from 'effect';
|
|
5
5
|
import type { ActivityFeedItem, ActivityFeedQueryParams, CreateSubscriptionInput, SubscriptionResponse, UpdateSubscriptionInput } from '../types/activity';
|
|
6
6
|
import type { AdminCreateMarketBody, AdminUpdateMarketBody, EventResponse, HealthResponse, LPPositionResponse, MarketResponse, MultinoulliSnapshotsResponse, PaginatedResponse, RankingEntry, TraderEventResponse, TraderPositionResponse, TraderStatsResponse } from '../types/api';
|
|
7
|
+
import type { AnalyticsLeaderboardResponse, AnalyticsOverviewResponse, CohortsResponse, DomainDetailResponse, DomainsResponse, EntityType, RoiResponse, TraderAnalyticsResponse } from '../types/analytics';
|
|
7
8
|
declare const IndexerApiError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
8
9
|
readonly _tag: "IndexerApiError";
|
|
9
10
|
} & Readonly<A>;
|
|
@@ -21,6 +22,27 @@ export interface EventQueryParams {
|
|
|
21
22
|
}
|
|
22
23
|
export interface RankingQueryParams {
|
|
23
24
|
readonly limit?: number | undefined;
|
|
25
|
+
/** Optional canonical domain slug (e.g. 'politics'). Defaults to all-domain. */
|
|
26
|
+
readonly domain?: string | undefined;
|
|
27
|
+
/** ISO YYYY-MM-DD inclusive lower bound. */
|
|
28
|
+
readonly from?: string | undefined;
|
|
29
|
+
/** ISO YYYY-MM-DD exclusive upper bound. */
|
|
30
|
+
readonly to?: string | undefined;
|
|
31
|
+
}
|
|
32
|
+
export interface TraderStatsQueryParams {
|
|
33
|
+
readonly domain?: string | undefined;
|
|
34
|
+
readonly from?: string | undefined;
|
|
35
|
+
readonly to?: string | undefined;
|
|
36
|
+
}
|
|
37
|
+
export interface AnalyticsLeaderboardQueryParams extends RankingQueryParams {
|
|
38
|
+
}
|
|
39
|
+
export interface CohortsQueryParams {
|
|
40
|
+
readonly domain?: string | undefined;
|
|
41
|
+
readonly entityType?: EntityType | undefined;
|
|
42
|
+
}
|
|
43
|
+
export interface RoiQueryParams {
|
|
44
|
+
readonly domain?: string | undefined;
|
|
45
|
+
readonly entityType?: EntityType | undefined;
|
|
24
46
|
}
|
|
25
47
|
export interface IndexerClientService {
|
|
26
48
|
readonly health: () => Effect.Effect<HealthResponse, IndexerApiError>;
|
|
@@ -31,8 +53,15 @@ export interface IndexerClientService {
|
|
|
31
53
|
readonly getMarketLPs: (address: string) => Effect.Effect<readonly LPPositionResponse[], IndexerApiError>;
|
|
32
54
|
readonly getTraderPositions: (trader: string) => Effect.Effect<readonly TraderPositionResponse[], IndexerApiError>;
|
|
33
55
|
readonly getTraderEvents: (trader: string, params?: EventQueryParams) => Effect.Effect<PaginatedResponse<TraderEventResponse>, IndexerApiError>;
|
|
34
|
-
readonly getTraderStats: (trader: string) => Effect.Effect<TraderStatsResponse, IndexerApiError>;
|
|
56
|
+
readonly getTraderStats: (trader: string, params?: TraderStatsQueryParams) => Effect.Effect<TraderStatsResponse, IndexerApiError>;
|
|
35
57
|
readonly getRankings: (params?: RankingQueryParams) => Effect.Effect<readonly RankingEntry[], IndexerApiError>;
|
|
58
|
+
readonly getAnalyticsOverview: () => Effect.Effect<AnalyticsOverviewResponse, IndexerApiError>;
|
|
59
|
+
readonly getAnalyticsDomains: () => Effect.Effect<DomainsResponse, IndexerApiError>;
|
|
60
|
+
readonly getAnalyticsDomain: (slug: string) => Effect.Effect<DomainDetailResponse, IndexerApiError>;
|
|
61
|
+
readonly getAnalyticsCohorts: (params?: CohortsQueryParams) => Effect.Effect<CohortsResponse, IndexerApiError>;
|
|
62
|
+
readonly getAnalyticsRoi: (params?: RoiQueryParams) => Effect.Effect<RoiResponse, IndexerApiError>;
|
|
63
|
+
readonly getAnalyticsLeaderboard: (params?: AnalyticsLeaderboardQueryParams) => Effect.Effect<AnalyticsLeaderboardResponse, IndexerApiError>;
|
|
64
|
+
readonly getTraderAnalytics: (address: string) => Effect.Effect<TraderAnalyticsResponse, IndexerApiError>;
|
|
36
65
|
readonly getMultinoulliSnapshots: (address: string, limit?: number) => Effect.Effect<MultinoulliSnapshotsResponse, IndexerApiError>;
|
|
37
66
|
readonly createMarket: (body: AdminCreateMarketBody) => Effect.Effect<{
|
|
38
67
|
success: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexerClient.d.ts","sourceRoot":"","sources":["../../src/client/IndexerClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,4BAA4B,EAC5B,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,cAAc,CAAC;;;;
|
|
1
|
+
{"version":3,"file":"IndexerClient.d.ts","sourceRoot":"","sources":["../../src/client/IndexerClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexerClient.js","sourceRoot":"","sources":["../../src/client/IndexerClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAe,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"IndexerClient.js","sourceRoot":"","sources":["../../src/client/IndexerClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAe,MAAM,QAAQ,CAAC;AAiCpD,wEAAwE;AAExE,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAIrE;CAAG;AAmJL,wEAAwE;AAExE,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAG5D;CAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexerClientLive.d.ts","sourceRoot":"","sources":["../../src/client/IndexerClientLive.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAmB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIjE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA8FD,eAAO,MAAM,iBAAiB,GAAI,QAAQ,mBAAmB,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"IndexerClientLive.d.ts","sourceRoot":"","sources":["../../src/client/IndexerClientLive.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAmB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIjE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA8FD,eAAO,MAAM,iBAAiB,GAAI,QAAQ,mBAAmB,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAuIxF,CAAC"}
|
|
@@ -100,14 +100,63 @@ export const IndexerClientLive = (config) => {
|
|
|
100
100
|
appendEventParams(url, params);
|
|
101
101
|
return fetchJson(url.toString());
|
|
102
102
|
},
|
|
103
|
-
getTraderStats: (trader) =>
|
|
103
|
+
getTraderStats: (trader, params) => {
|
|
104
|
+
const url = new URL(`${base}/api/positions/${trader}/stats`);
|
|
105
|
+
if (params?.domain)
|
|
106
|
+
url.searchParams.set('domain', params.domain);
|
|
107
|
+
if (params?.from)
|
|
108
|
+
url.searchParams.set('from', params.from);
|
|
109
|
+
if (params?.to)
|
|
110
|
+
url.searchParams.set('to', params.to);
|
|
111
|
+
return fetchJson(url.toString());
|
|
112
|
+
},
|
|
104
113
|
getRankings: (params) => {
|
|
105
114
|
const url = new URL(`${base}/api/rankings`);
|
|
106
115
|
if (params?.limit !== undefined) {
|
|
107
116
|
url.searchParams.set('limit', params.limit.toString());
|
|
108
117
|
}
|
|
118
|
+
if (params?.domain)
|
|
119
|
+
url.searchParams.set('domain', params.domain);
|
|
120
|
+
if (params?.from)
|
|
121
|
+
url.searchParams.set('from', params.from);
|
|
122
|
+
if (params?.to)
|
|
123
|
+
url.searchParams.set('to', params.to);
|
|
124
|
+
return fetchJson(url.toString());
|
|
125
|
+
},
|
|
126
|
+
// ── Analytics warehouse ────────────────────────────────────────
|
|
127
|
+
getAnalyticsOverview: () => fetchJson(`${base}/api/analytics/overview`),
|
|
128
|
+
getAnalyticsDomains: () => fetchJson(`${base}/api/analytics/domains`),
|
|
129
|
+
getAnalyticsDomain: (slug) => fetchJson(`${base}/api/analytics/domains/${slug}`),
|
|
130
|
+
getAnalyticsCohorts: (params) => {
|
|
131
|
+
const url = new URL(`${base}/api/analytics/cohorts`);
|
|
132
|
+
if (params?.domain)
|
|
133
|
+
url.searchParams.set('domain', params.domain);
|
|
134
|
+
if (params?.entityType)
|
|
135
|
+
url.searchParams.set('entityType', params.entityType);
|
|
136
|
+
return fetchJson(url.toString());
|
|
137
|
+
},
|
|
138
|
+
getAnalyticsRoi: (params) => {
|
|
139
|
+
const url = new URL(`${base}/api/analytics/roi`);
|
|
140
|
+
if (params?.domain)
|
|
141
|
+
url.searchParams.set('domain', params.domain);
|
|
142
|
+
if (params?.entityType)
|
|
143
|
+
url.searchParams.set('entityType', params.entityType);
|
|
144
|
+
return fetchJson(url.toString());
|
|
145
|
+
},
|
|
146
|
+
getAnalyticsLeaderboard: (params) => {
|
|
147
|
+
const url = new URL(`${base}/api/analytics/leaderboard`);
|
|
148
|
+
if (params?.domain)
|
|
149
|
+
url.searchParams.set('domain', params.domain);
|
|
150
|
+
if (params?.from)
|
|
151
|
+
url.searchParams.set('from', params.from);
|
|
152
|
+
if (params?.to)
|
|
153
|
+
url.searchParams.set('to', params.to);
|
|
154
|
+
if (params?.limit !== undefined) {
|
|
155
|
+
url.searchParams.set('limit', params.limit.toString());
|
|
156
|
+
}
|
|
109
157
|
return fetchJson(url.toString());
|
|
110
158
|
},
|
|
159
|
+
getTraderAnalytics: (address) => fetchJson(`${base}/api/analytics/traders/${address}`),
|
|
111
160
|
getMultinoulliSnapshots: (address, limit) => {
|
|
112
161
|
const url = new URL(`${base}/api/markets/${address}/multinoulli-snapshots`);
|
|
113
162
|
if (limit !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexerClientLive.js","sourceRoot":"","sources":["../../src/client/IndexerClientLive.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"IndexerClientLive.js","sourceRoot":"","sources":["../../src/client/IndexerClientLive.ts"],"names":[],"mappings":"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"}
|