diff --git a/service_a/internal/domains/meteo/domain.go b/service_a/internal/domains/meteo/domain.go index e67addf..779f9fe 100644 --- a/service_a/internal/domains/meteo/domain.go +++ b/service_a/internal/domains/meteo/domain.go @@ -33,6 +33,7 @@ type GetMeteoData struct { To string Page int Limit int + Offset int } func (mt *GetMeteoData) Validate() error { @@ -56,6 +57,8 @@ func (mt *GetMeteoData) Validate() error { return ErrMissingOrInvalidToDate } + mt.Offset = (mt.Page - 1) * mt.Limit + return nil } diff --git a/service_a/internal/domains/meteo/repository.go b/service_a/internal/domains/meteo/repository.go index 5baaf33..d1f6a66 100644 --- a/service_a/internal/domains/meteo/repository.go +++ b/service_a/internal/domains/meteo/repository.go @@ -8,6 +8,22 @@ import ( "github.com/jackc/pgx/v5/pgxpool" ) +type Repository interface { + InsertMeteoDataTX(ctx context.Context, params InsertMeteoDataParams) (*InsertMeteoDataResult, error) + UpdateBatchElapsedTime(ctx context.Context, batchID int, elapsedMS int) error + GetMeteoData(ctx context.Context, params GetMeteoData) ([]MeteoData, error) +} + +type pgxRepo struct { + *pgxpool.Pool +} + +func NewPGXRepo(pool *pgxpool.Pool) Repository { + return &pgxRepo{ + pool, + } +} + type InsertMeteoDataParams struct { FileChecksum string Accepted []MeteoData @@ -20,21 +36,6 @@ type InsertMeteoDataResult struct { RejectedCount int } -type Repository interface { - InsertMeteoDataTX(ctx context.Context, params InsertMeteoDataParams) (*InsertMeteoDataResult, error) - UpdateBatchElapsedTime(ctx context.Context, batchID int, elapsedMS int) error -} - -type pgxRepo struct { - *pgxpool.Pool -} - -func NewPGXRepo(pool *pgxpool.Pool) Repository { - return &pgxRepo{ - pool, - } -} - func (pgx *pgxRepo) InsertMeteoDataTX(ctx context.Context, params InsertMeteoDataParams) (*InsertMeteoDataResult, error) { tx, err := pgx.Begin(ctx) if err != nil { @@ -148,3 +149,44 @@ func (pgx *pgxRepo) UpdateBatchElapsedTime(ctx context.Context, batchID int, ela } return nil } + +const getMeteoDataQuery = ` + select location_name, date_of_register, max_temp, min_temp, rainfall, cloudiness + from public.meteo_data + where location_name = $1 + and date_of_register >= $2 + and date_of_register <= $3 + order by date_of_register desc + limit $4 offset $5 +` + +func (pgx *pgxRepo) GetMeteoData(ctx context.Context, params GetMeteoData) ([]MeteoData, error) { + rows, err := pgx.Query(ctx, getMeteoDataQuery, params.Location, params.From, params.To, params.Limit, params.Offset) + if err != nil { + return nil, fmt.Errorf("error querying meteo data: %w", err) + } + defer rows.Close() + + var results []MeteoData + for rows.Next() { + var data MeteoData + err := rows.Scan( + &data.Location, + &data.Timestamp, + &data.MaxTemp, + &data.MinTemp, + &data.Rainfall, + &data.Cloudiness, + ) + if err != nil { + return nil, fmt.Errorf("error scanning row: %w", err) + } + results = append(results, data) + } + + if err = rows.Err(); err != nil { + return nil, fmt.Errorf("error iterating rows: %w", err) + } + + return results, nil +}