amb-monitor/repository/postgres/block_timestamps.go

59 lines
1.6 KiB
Go

package postgres
import (
"context"
"database/sql"
"errors"
"fmt"
"tokenbridge-monitor/db"
"tokenbridge-monitor/entity"
sq "github.com/Masterminds/squirrel"
)
type blockTimestampsRepo basePostgresRepo
func NewBlockTimestampsRepo(table string, db *db.DB) entity.BlockTimestampsRepo {
return (*blockTimestampsRepo)(newBasePostgresRepo(table, db))
}
func (r *blockTimestampsRepo) Ensure(ctx context.Context, ts *entity.BlockTimestamp) error {
q, args, err := sq.Insert(r.table).
Columns("chain_id", "block_number", "timestamp").
Values(ts.ChainID, ts.BlockNumber, ts.Timestamp).
Suffix("ON CONFLICT (chain_id, block_number) DO UPDATE SET updated_at = NOW(), timestamp = EXCLUDED.timestamp").
PlaceholderFormat(sq.Dollar).
ToSql()
if err != nil {
return fmt.Errorf("can't build query: %w", err)
}
_, err = r.db.ExecContext(ctx, q, args...)
if err != nil {
return fmt.Errorf("can't insert block timestamp: %w", err)
}
return nil
}
func (r *blockTimestampsRepo) GetByBlockNumber(ctx context.Context, chainID string, blockNumber uint) (*entity.BlockTimestamp, error) {
q, args, err := sq.Select("*").
From(r.table).
Where(sq.Eq{
"chain_id": chainID,
"block_number": blockNumber,
}).
PlaceholderFormat(sq.Dollar).
ToSql()
if err != nil {
return nil, fmt.Errorf("can't build query: %w", err)
}
ts := new(entity.BlockTimestamp)
err = r.db.GetContext(ctx, ts, q, args...)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, db.ErrNotFound
}
return nil, fmt.Errorf("can't get block timestamp: %w", err)
}
return ts, nil
}