(chartId, limit = 5)
| 559 | } |
| 560 | |
| 561 | async getTopChartVariants(chartId, limit = 5) { |
| 562 | if (!chartId) return []; |
| 563 | |
| 564 | const variantHashes = await this.store.zrevrange(this.usageKey(chartId), 0, Math.max(0, limit - 1)); |
| 565 | if (!variantHashes || variantHashes.length === 0) { |
| 566 | return []; |
| 567 | } |
| 568 | |
| 569 | return Promise.all(variantHashes.map(async (variantHash) => { |
| 570 | const rawMetadata = await this.store.hget(this.usageMetaKey(chartId), variantHash); |
| 571 | if (!rawMetadata) return null; |
| 572 | |
| 573 | try { |
| 574 | return JSON.parse(rawMetadata); |
| 575 | } catch (_error) { |
| 576 | return null; |
| 577 | } |
| 578 | })).then((variants) => variants.filter(Boolean)); |
| 579 | } |
| 580 | |
| 581 | async buildChartVersion(chartId, timezone = "") { |
| 582 | const chartFingerprint = await db.Chart.findOne({ |
no test coverage detected