chore: update project changes

This commit is contained in:
2026-09-21 15:33:47 +03:30
parent f7366a1985
commit 810448b6e7
8 changed files with 1459 additions and 810 deletions
+11
View File
@@ -19,6 +19,7 @@ func Configure(service string, level slog.Leveler) *slog.Logger {
attr.Key = "timestamp"
case slog.LevelKey:
attr.Key = "severity"
attr.Value = slog.StringValue(levelName(attr.Value))
case slog.MessageKey:
attr.Key = "message"
case slog.SourceKey:
@@ -32,6 +33,16 @@ func Configure(service string, level slog.Leveler) *slog.Logger {
return logger
}
func levelName(value slog.Value) string {
if value.Kind() == slog.KindInt64 {
return slog.Level(value.Int64()).String()
}
if level, ok := value.Any().(slog.Level); ok {
return level.String()
}
return value.String()
}
type traceHandler struct{ slog.Handler }
func (h *traceHandler) Handle(ctx context.Context, record slog.Record) error {
@@ -86,6 +86,42 @@ func (r *JournalRepository) Stats(ctx context.Context) (explorer.Stats, error) {
return stats, nil
}
func (r *JournalRepository) SettlementDashboard(ctx context.Context, limit int) (explorer.SettlementStats, []explorer.Settlement, error) {
if limit <= 0 || limit > 100 {
limit = 12
}
var stats explorer.SettlementStats
if err := r.database.QueryRow(ctx, `SELECT
count(*) FILTER (WHERE status='PENDING'),
count(*) FILTER (WHERE status='RETRYABLE'),
count(*) FILTER (WHERE status='CONFIRMED'),
count(*) FILTER (WHERE status='MANUAL_REVIEW')
FROM kuknos_settlements`).Scan(&stats.Pending, &stats.Retryable, &stats.Confirmed, &stats.ManualReview); err != nil {
return explorer.SettlementStats{}, nil, fmt.Errorf("read settlement stats: %w", err)
}
rows, err := r.database.Query(ctx, `SELECT id, source_service, source_transaction_id, status,
network, transaction_hash, attempts, last_error, updated_at
FROM kuknos_settlements ORDER BY updated_at DESC LIMIT $1`, limit)
if err != nil {
return explorer.SettlementStats{}, nil, fmt.Errorf("list recent settlements: %w", err)
}
defer rows.Close()
settlements := make([]explorer.Settlement, 0, limit)
for rows.Next() {
var settlement explorer.Settlement
if err := rows.Scan(&settlement.ID, &settlement.SourceService, &settlement.SourceTransactionID,
&settlement.Status, &settlement.Network, &settlement.TransactionHash, &settlement.Attempts,
&settlement.LastError, &settlement.UpdatedAt); err != nil {
return explorer.SettlementStats{}, nil, fmt.Errorf("scan recent settlement: %w", err)
}
settlements = append(settlements, settlement)
}
if err := rows.Err(); err != nil {
return explorer.SettlementStats{}, nil, fmt.Errorf("iterate recent settlements: %w", err)
}
return stats, settlements, nil
}
func (r *JournalRepository) TopHolders(ctx context.Context, assetLimit, holderLimit int) ([]explorer.Holder, error) {
if assetLimit <= 0 || assetLimit > 20 {
assetLimit = 5