Skip to content

fix(dashboard): unify timezone handling#1231

Draft
ROOOO wants to merge 1 commit into
ding113:devfrom
ROOOO:codex/dashboard-timezone-consistency
Draft

fix(dashboard): unify timezone handling#1231
ROOOO wants to merge 1 commit into
ding113:devfrom
ROOOO:codex/dashboard-timezone-consistency

Conversation

@ROOOO

@ROOOO ROOOO commented May 30, 2026

Copy link
Copy Markdown

Summary

Resolve dashboard, logs, my-usage, and leaderboard date ranges against the configured system timezone. Include timezone in dashboard Redis cache keys and invalidate timezone-sensitive caches when timezone settings change. Normalize statistics bucket serialization to prevent UTC/local date drift.

Problem

Dashboard views (statistics, logs, leaderboard, my-usage) were using inconsistent timezone handling:

  • Date range queries were computed using browser local time or UTC rather than the configured system timezone
  • Redis cache keys did not incorporate the system timezone, causing stale data after timezone changes
  • Statistics bucket normalization used naive Date parsing, causing UTC/local date drift and off-by-one day shifts in charts (e.g. April 28 data showing under April 27)
  • Usage logs date range pickers and filters displayed dates incorrectly when the system timezone differed from the server timezone

Related Issues

Solution

  1. Timezone-aware date resolution — All dashboard date range queries now use resolveSystemTimezone() (DB config -> env TZ -> UTC fallback) and date-fns-tz utilities (toZonedTime, formatInTimeZone, fromZonedTime) to compute dates in the correct timezone
  2. Timezone-scoped Redis cache keys — Dashboard cache keys (overview, statistics, leaderboard) now include tz:<timezone> segment to prevent stale data when timezone changes
  3. Cache invalidation on timezone change — When system timezone is updated via settings, all dashboard caches are invalidated atomically via invalidateAllOverviewCaches, invalidateAllStatisticsCaches, invalidateAllLeaderboardCaches
  4. Bucket normalization fixnormalizeBucketInstant replaces normalizeBucketDate to correctly parse bucket timestamps through the system timezone, preventing UTC/local drift
  5. Chart serialization fixserializeChartBucketDate replaces resolution-dependent date formatting with consistent ISO serialization, ensuring stable date keys across all time ranges

Changes

Core Changes

  • src/repository/statistics.ts (+52/-19) — Replace normalizeBucketDate with normalizeBucketInstant that parses through system timezone; add timezone parameter to all DB query functions
  • src/repository/admin-user-insights.ts (+36/-27) — Add buildSystemTimezoneDateConditions helper for all date range queries; use AT TIME ZONE in SQL conditions
  • src/lib/redis/leaderboard-cache.ts (+23/-5) — Include timezone in all leaderboard cache keys; add invalidateAllLeaderboardCaches
  • src/lib/redis/overview-cache.ts (+30/-6) — Include timezone in overview cache keys; add invalidateAllOverviewCaches; handle legacy key cleanup
  • src/lib/redis/statistics-cache.ts (+42/-14) — Include timezone in statistics cache keys; add invalidateAllStatisticsCaches; handle legacy key cleanup
  • src/actions/statistics.ts (+6/-10) — Replace resolution-dependent date formatting with serializeChartBucketDate for stable chart buckets
  • src/actions/system-config.ts (+17/-0) — Invalidate dashboard caches when timezone setting changes
  • src/app/api/admin/system-config/route.ts (+16/-0) — Same cache invalidation for REST API path

UI Changes

  • src/app/[locale]/dashboard/leaderboard/_components/date-range-picker.tsx (+17/-8) — Use formatInTimeZone / toZonedTime for all date range computation
  • src/app/[locale]/dashboard/leaderboard/user/[userId]/_components/filters/types.ts (+26/-18) — Add timezone parameter to time preset resolution
  • src/app/[locale]/dashboard/logs/_components/filters/active-filters-display.tsx (+10/-3) — Display active filter dates in system timezone
  • src/app/[locale]/dashboard/logs/_components/logs-date-range-picker.tsx (+6/-2) — Use timezone-aware "today" for calendar disabled/ navigation
  • src/app/[locale]/dashboard/logs/_utils/time-range.ts (+13/-18) — Simplify getQuickDateRange to use toZonedTime then plain date-fns formatting
  • src/app/[locale]/my-usage/_components/statistics-summary-card.tsx (+22/-6) — Use formatInTimeZone for default date range; auto-reset range on timezone change
  • src/components/ui/relative-time.tsx (+4/-1) — Accept optional timeZone override prop
  • src/types/dashboard-cache.ts (+30/-6) — Add timezone field to cache key types; add timezone-scoped cache key builders

Test Changes

  • tests/unit/dashboard-logs-time-range-utils.test.ts (+10/-0) — Add test for early-morning UTC in a different timezone
  • tests/unit/dashboard/dashboard-cache-keys.test.ts (+21/-11) — Update cache key tests for timezone-scoped keys
  • tests/unit/redis/leaderboard-cache.test.ts (+29/-1) — Test timezone-scoped Redis keys and cross-timezone behavior
  • tests/unit/redis/overview-cache.test.ts (+35/-14) — Test timezone-scoped keys and invalidation
  • tests/unit/redis/statistics-cache.test.ts (+70/-23) — Test timezone-scoped keys and DB parameter passing
  • tests/unit/repository/admin-user-insights-overview.test.ts (+12/-0) — Add timezone-specific test
  • tests/unit/repository/statistics-timezone-buckets.test.ts (+38/-0) — New file testing bucket normalization with timezone
  • tests/unit/user-insights-filters.test.ts (+17/-0) — Test timezone-aware filter presets

Breaking Changes

None — all changes are backward-compatible:

  • New function parameters are optional with sensible defaults
  • Redis cache keys are extended (not renamed) to include tz:<timezone>, while legacy keys are still cleaned up on invalidation
  • No API surface changes or schema migrations

Testing

Automated Tests

  • ✅ 9 test files updated/added with timezone-specific coverage
  • bunx vitest run specific tests passed
  • bun run typecheck passed
  • bun run lint passed
  • bun run build passed

Manual Testing

  1. Set system timezone to a non-UTC timezone (e.g., Asia/Shanghai UTC+8)
  2. Open dashboard and verify daily statistics chart shows correct date labels
  3. Verify usage logs date range picker shows today in the correct timezone
  4. Verify leaderboard date range picker shows correct date ranges
  5. Verify my-usage statistics card shows correct date range
  6. Change system timezone in settings and verify caches are invalidated (dashboard data refreshes)

Validation

  • bunx vitest run tests/unit/dashboard-logs-time-range-utils.test.ts tests/unit/dashboard/dashboard-cache-keys.test.ts tests/unit/dashboard/leaderboard-view-user-cache-hit-rate.test.tsx tests/unit/redis/leaderboard-cache.test.ts tests/unit/redis/overview-cache.test.ts tests/unit/redis/statistics-cache.test.ts tests/unit/repository/admin-user-insights-overview.test.ts tests/unit/repository/statistics-timezone-buckets.test.ts tests/unit/user-insights-filters.test.ts (passed)
  • bun run typecheck (passed)
  • bun run lint (passed; Biome schema version info only)
  • bun run build (passed; existing Edge Runtime warnings in instrumentation dependencies)

Description enhanced by Claude AI PR Agent

@coderabbitai

coderabbitai Bot commented May 30, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

该PR为整个仪表盘系统添加了时区支持:Redis缓存键包含时区维度、统计查询按时区分桶、日期选择器按时区计算、组件props传递时区配置,确保用户看到符合其系统时区设定的统计数据、日期过滤和相对时间显示。

Changes

时区感知仪表盘缓存和统计

Layer / File(s) Summary
Timezone dimension in Redis cache keys
src/types/dashboard-cache.ts, src/lib/redis/index.ts
StatisticsCacheKey 加入 timezone 字段;buildOverviewCacheKey 和 buildStatisticsCacheKey 的重载签名新增 timezone 参数,生成的 key 包含 tz:{timezone} 段。
Leaderboard cache with timezone support
src/lib/redis/leaderboard-cache.ts
buildCacheKey 在各周期 key 中插入 :tz:${timezone}: 段;新增 invalidateAllLeaderboardCaches 函数使用 scanPattern 批量删除命名空间下所有缓存。
Overview cache with timezone resolution
src/lib/redis/overview-cache.ts
getOverviewWithCache 调用 resolveSystemTimezone 并将时区纳入 cache key 生成;invalidateOverviewCache 改为扫描时区作用域的键;新增 invalidateAllOverviewCaches 删除 overview:* 命名空间。
Statistics cache with timezone and DB fallback
src/lib/redis/statistics-cache.ts
getStatisticsWithCache 解析时区、生成带时区的缓存键;queryDatabase 新增 timezone 参数并传递给仓储函数;Redis 不可用或失效时回退到带时区的数据库查询。
Statistics repository with timezone normalization
src/repository/statistics.ts
新增 normalizeBucketInstant 函数按指定时区解析分桶时间;getTimeBuckets、zeroFillUserStats、zeroFillKeyStats、zeroFillMixedOthersStats 均增加 timezone 参数;公开查询函数 getUserStatisticsFromDB、getKeyStatisticsFromDB、getMixedStatisticsFromDB 新增可选 timezoneOverride 参数。
Admin overview metrics with timezone filtering
src/repository/admin-user-insights.ts
新增 buildSystemTimezoneDateConditions 生成带时区换算的 SQL 条件;getUserOverviewMetrics、getUserModelBreakdown、getUserProviderBreakdown 使用该助手生成时区感知的日期过滤。
Server-side timezone-triggered cache invalidation
src/actions/system-config.ts, src/app/api/admin/system-config/route.ts
系统设置更新时,若 timezone 被修改则并行失效 overview、statistics、leaderboard 等所有时区敏感缓存;失效失败仅记录警告,不阻断更新流程。
Chart statistics date serialization
src/actions/statistics.ts
新增 serializeChartBucketDate 将日期值统一序列化为 ISO 字符串;替代原先按 resolution 分支的格式化逻辑。
Dashboard leaderboard date picker with timezone
src/app/[locale]/dashboard/leaderboard/_components/date-range-picker.tsx
新增 formatDateInSystemTimeZone 工具函数;getDateRangeForPeriod 增加 timeZone 参数;DateRangePicker 通过 useTimeZone 获取时区、计算 today 值,用于日历禁用规则和下一周期按钮禁用条件同步。
User insights preset date filters with timezone
src/app/[locale]/dashboard/leaderboard/user/[userId]/_components/filters/types.ts, src/app/[locale]/dashboard/leaderboard/user/[userId]/_components/user-insights-view.tsx
resolveTimePresetDates 增加可选 timeZone 和 now 参数,使用 toZonedTime 和 format 重写日期计算;UserInsightsView 通过 useTimeZone 获取时区并传入该函数。
Logs date range utilities and picker with timezone
src/app/[locale]/dashboard/logs/_utils/time-range.ts, src/app/[locale]/dashboard/logs/_components/logs-date-range-picker.tsx, src/app/[locale]/dashboard/logs/_components/filters/active-filters-display.tsx
getQuickDateRange 改为先用 toZonedTime 将 now 转为目标时区 baseDate 再计算日期;LogsDateRangePicker 新增时区推导的 today 值同步日历和导航禁用规则;ActiveFiltersDisplay 新增 serverTimeZone 属性,按时区格式化日期范围展示。
Timezone propagation through component props
src/app/[locale]/dashboard/logs/_components/usage-logs-view-virtualized.tsx, src/app/[locale]/dashboard/logs/_components/virtualized-logs-table.tsx, src/app/[locale]/my-usage/_components/usage-logs-section.tsx, src/app/[locale]/my-usage/_components/usage-logs-table.tsx, src/components/ui/relative-time.tsx
VirtualizedLogsTable、UsageLogsTable、RelativeTime 组件均新增可选 serverTimeZone 属性;RelativeTime 优先使用 timeZone 覆盖值,回退到 useTimeZone();父组件将 serverTimeZone 传递给子组件用于统一时区显示。
Statistics card with automatic timezone-aware updates
src/app/[locale]/my-usage/_components/statistics-summary-card.tsx
新增 getDefaultDateRange 按时区计算同一天的起止日期;引入 effectiveTimeZone、autoDateRangeRef、previousTimeZoneRef 控制自动日期更新行为,仅在用户未手动选择日期时随时区变化自动重置范围。
Comprehensive test coverage for timezone functionality
tests/unit/dashboard-logs-time-range-utils.test.ts, tests/unit/dashboard/dashboard-cache-keys.test.ts, tests/unit/dashboard/leaderboard-view-user-cache-hit-rate.test.tsx, tests/unit/redis/leaderboard-cache.test.ts, tests/unit/redis/overview-cache.test.ts, tests/unit/redis/statistics-cache.test.ts, tests/unit/repository/admin-user-insights-overview.test.ts, tests/unit/repository/statistics-timezone-buckets.test.ts, tests/unit/user-insights-filters.test.ts
添加对缓存 key 包含时区的断言、时区下统计分桶序列化的验证、不同时区下日期范围计算的测试;mock resolveSystemTimezone 使缓存和查询逻辑在测试中使用固定时区;验证 Redis scan/del 按时区模式匹配的行为。

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes


Possibly related PRs

  • ding113/claude-code-hub#657: 该 PR 修改了仪表盘日志时间范围和日期选择器流程以支持服务端时区,与本 PR 在日志日期过滤和时区感知日期计算方面存在代码级关联。
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 29.41% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR标题与变更集高度相关,准确总结了主要变更:统一时区处理。标题简洁清晰,涵盖核心改动内容。
Description check ✅ Passed PR描述与变更集紧密相关,详细阐述了问题、解决方案、变更内容和测试验证,与代码变更完全对应。
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch codex/dashboard-timezone-consistency

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot added bug Something isn't working area:UI area:statistics labels May 30, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces comprehensive timezone support across the dashboard, logs, and statistics views, ensuring that date ranges, relative times, and database queries are resolved using the configured system timezone. Additionally, it updates Redis cache keys to include the timezone context and automatically invalidates these caches when the system timezone is updated. The review feedback suggests a minor optimization in the leaderboard's DateRangePicker to reuse the already-zoned baseDate variable instead of redundantly recalculating the timezone formatting.

}
default:
return { startDate: "2020-01-01", endDate: formatDate(new Date()) };
return { startDate: "2020-01-01", endDate: formatDateInSystemTimeZone(now, timeZone) };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since baseDate is already computed as the zoned time in the target timezone (toZonedTime(now, timeZone)), we can directly use formatDate(baseDate) instead of calling formatDateInSystemTimeZone(now, timeZone). This improves consistency with the other cases in the switch statement and avoids redundant timezone calculations.

Suggested change
return { startDate: "2020-01-01", endDate: formatDateInSystemTimeZone(now, timeZone) };
return { startDate: "2020-01-01", endDate: formatDate(baseDate) };

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
src/actions/system-config.ts (1)

159-169: ⚡ Quick win

仅在时区实际发生变化时才失效全部仪表盘缓存。

当前条件只判断 validated.timezone !== undefined。若设置表单在每次保存时都携带 timezone 字段(部分更新表单通常会回传完整负载),那么即使时区未改变,每次保存都会清空全部 overview/statistics/leaderboard 缓存,导致随后大量请求回源数据库重算。建议改为比较保存前后的实际值。

此处已有 beforeupdated,可直接对比:

♻️ 建议改动
-    if (validated.timezone !== undefined) {
+    if (validated.timezone !== undefined && before?.timezone !== updated.timezone) {
       await Promise.all([
         invalidateAllOverviewCaches(),
         invalidateAllStatisticsCaches(),
         invalidateAllLeaderboardCaches(),
       ]).catch((error) => {
         logger.warn("[SystemSettings] Failed to invalidate timezone-sensitive dashboard caches", {
           error,
         });
       });
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/actions/system-config.ts` around lines 159 - 169, 当前逻辑只判断
validated.timezone !== undefined 导致每次保存都会失效缓存;请改为比较保存前后实际时区值(使用 before.timezone
和 updated.timezone)并且仅当二者不相等时才调用 invalidateAllOverviewCaches,
invalidateAllStatisticsCaches, invalidateAllLeaderboardCaches,保留原有的
Promise.all(...).catch(...) 错误捕获与 logger.warn;确保对 undefined/null
情况也能正确判断变化(例如使用严格不等 !== 或显式比较字符串化后的值)。
src/app/[locale]/my-usage/_components/statistics-summary-card.tsx (1)

39-44: 💤 Low value

初始状态可能使用不正确的时区计算

useState 的初始化函数在组件首次挂载时执行,此时 serverTimeZone 可能尚未从父组件加载完成(如上下文代码片段所示,serverTimeZone 是异步获取的)。这意味着初始 dateRange 可能使用 providerTimeZone(或 "UTC")计算,而非 serverTimeZone

虽然 Lines 62-67 的 effect 会在 effectiveTimeZone 变化时重置 dateRange,但这依赖于 autoDateRangeRef.currenttrue。当前逻辑是正确的,但建议添加注释说明这一行为,以避免后续维护时产生困惑。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/app/`[locale]/my-usage/_components/statistics-summary-card.tsx around
lines 39 - 44, The initial dateRange state (created via useState calling
getDefaultDateRange(effectiveTimeZone)) can be computed before serverTimeZone is
available, so document this behavior: add a clear comment next to the dateRange
state initialization explaining that the first render may use
providerTimeZone/UTC, and that the effect which watches effectiveTimeZone (the
logic that compares effectiveTimeZone with previousTimeZoneRef and resets
dateRange when autoDateRangeRef.current is true) will update the dateRange once
the correct serverTimeZone arrives; reference getDefaultDateRange,
dateRange/setDateRange, effectiveTimeZone, autoDateRangeRef and
previousTimeZoneRef in the comment so maintainers understand why the lazy init
is safe.
tests/unit/repository/admin-user-insights-overview.test.ts (1)

71-74: ⚡ Quick win

移除该测试中的无用 messageRequest mock 字段getUserOverviewMetrics 仅使用 usageLedger(由 LEDGER_BILLING_CONDITION 引入的 usageLedger.blockedBy/endpoint),未引用 messageRequest.blockedBy/endpoint;当前用例断言也不涉及 messageRequest,因此测试里这段 messageRequest mock(lines 71-74)可删以避免误导。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unit/repository/admin-user-insights-overview.test.ts` around lines 71 -
74, Remove the unused messageRequest mock fields from the test: delete the
messageRequest object (the blockedBy and endpoint properties) since
getUserOverviewMetrics only reads usageLedger via LEDGER_BILLING_CONDITION
(usageLedger.blockedBy / usageLedger.endpoint) and the assertions in this test
do not reference messageRequest; update the test setup to rely solely on
usageLedger/LEDGER_BILLING_CONDITION values and remove any references to
messageRequest in the test fixture.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/actions/system-config.ts`:
- Around line 159-169: 当前逻辑只判断 validated.timezone !== undefined
导致每次保存都会失效缓存;请改为比较保存前后实际时区值(使用 before.timezone 和 updated.timezone)并且仅当二者不相等时才调用
invalidateAllOverviewCaches, invalidateAllStatisticsCaches,
invalidateAllLeaderboardCaches,保留原有的 Promise.all(...).catch(...) 错误捕获与
logger.warn;确保对 undefined/null 情况也能正确判断变化(例如使用严格不等 !== 或显式比较字符串化后的值)。

In `@src/app/`[locale]/my-usage/_components/statistics-summary-card.tsx:
- Around line 39-44: The initial dateRange state (created via useState calling
getDefaultDateRange(effectiveTimeZone)) can be computed before serverTimeZone is
available, so document this behavior: add a clear comment next to the dateRange
state initialization explaining that the first render may use
providerTimeZone/UTC, and that the effect which watches effectiveTimeZone (the
logic that compares effectiveTimeZone with previousTimeZoneRef and resets
dateRange when autoDateRangeRef.current is true) will update the dateRange once
the correct serverTimeZone arrives; reference getDefaultDateRange,
dateRange/setDateRange, effectiveTimeZone, autoDateRangeRef and
previousTimeZoneRef in the comment so maintainers understand why the lazy init
is safe.

In `@tests/unit/repository/admin-user-insights-overview.test.ts`:
- Around line 71-74: Remove the unused messageRequest mock fields from the test:
delete the messageRequest object (the blockedBy and endpoint properties) since
getUserOverviewMetrics only reads usageLedger via LEDGER_BILLING_CONDITION
(usageLedger.blockedBy / usageLedger.endpoint) and the assertions in this test
do not reference messageRequest; update the test setup to rely solely on
usageLedger/LEDGER_BILLING_CONDITION values and remove any references to
messageRequest in the test fixture.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c95f11f7-ddd3-4de3-9789-bc92681d0320

📥 Commits

Reviewing files that changed from the base of the PR and between ed95b48 and 98bcbc5.

📒 Files selected for processing (32)
  • src/actions/statistics.ts
  • src/actions/system-config.ts
  • src/app/[locale]/dashboard/leaderboard/_components/date-range-picker.tsx
  • src/app/[locale]/dashboard/leaderboard/user/[userId]/_components/filters/types.ts
  • src/app/[locale]/dashboard/leaderboard/user/[userId]/_components/user-insights-view.tsx
  • src/app/[locale]/dashboard/logs/_components/filters/active-filters-display.tsx
  • src/app/[locale]/dashboard/logs/_components/logs-date-range-picker.tsx
  • src/app/[locale]/dashboard/logs/_components/usage-logs-filters.tsx
  • src/app/[locale]/dashboard/logs/_components/usage-logs-view-virtualized.tsx
  • src/app/[locale]/dashboard/logs/_components/virtualized-logs-table.tsx
  • src/app/[locale]/dashboard/logs/_utils/time-range.ts
  • src/app/[locale]/my-usage/_components/statistics-summary-card.tsx
  • src/app/[locale]/my-usage/_components/usage-logs-section.tsx
  • src/app/[locale]/my-usage/_components/usage-logs-table.tsx
  • src/app/api/admin/system-config/route.ts
  • src/components/ui/relative-time.tsx
  • src/lib/redis/index.ts
  • src/lib/redis/leaderboard-cache.ts
  • src/lib/redis/overview-cache.ts
  • src/lib/redis/statistics-cache.ts
  • src/repository/admin-user-insights.ts
  • src/repository/statistics.ts
  • src/types/dashboard-cache.ts
  • tests/unit/dashboard-logs-time-range-utils.test.ts
  • tests/unit/dashboard/dashboard-cache-keys.test.ts
  • tests/unit/dashboard/leaderboard-view-user-cache-hit-rate.test.tsx
  • tests/unit/redis/leaderboard-cache.test.ts
  • tests/unit/redis/overview-cache.test.ts
  • tests/unit/redis/statistics-cache.test.ts
  • tests/unit/repository/admin-user-insights-overview.test.ts
  • tests/unit/repository/statistics-timezone-buckets.test.ts
  • tests/unit/user-insights-filters.test.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:statistics area:UI bug Something isn't working

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

1 participant