1
This commit is contained in:
100
internal/database/postgres/balance.go
Normal file
100
internal/database/postgres/balance.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package pgdb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
dberrors "git-molva.ru/Molva/molva-backend/services/api_gateway/internal/database/errors"
|
||||
dbtypes "git-molva.ru/Molva/molva-backend/services/api_gateway/internal/database/types"
|
||||
"github.com/Masterminds/squirrel"
|
||||
)
|
||||
|
||||
func (c *client) GetBalance(
|
||||
ctx context.Context,
|
||||
request *dbtypes.BalanceGetRequest,
|
||||
) (*dbtypes.BalanceGetResponse, error) {
|
||||
if request == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var (
|
||||
psql = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar)
|
||||
|
||||
balancesTable = fmt.Sprintf("%s.%s", c.config.Schema, BalancesTableName)
|
||||
)
|
||||
|
||||
getBalance := psql.Select(
|
||||
"raw_balance", "clean_balance",
|
||||
).From(balancesTable).
|
||||
Where(squirrel.Eq{"owner_id": request.OwnerId})
|
||||
|
||||
query, args, err := getBalance.ToSql()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: error building get balance query: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
row := c.db.QueryRowContext(ctx, query, args...)
|
||||
|
||||
var (
|
||||
balance dbtypes.Balance
|
||||
)
|
||||
|
||||
if err := row.Scan(&balance.RawBalance, &balance.CleanBalance); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, dberrors.ErrNotFound
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%w: error scanning row: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
return &dbtypes.BalanceGetResponse{
|
||||
Balance: &balance,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *client) createBalance(
|
||||
ctx context.Context,
|
||||
driver Driver,
|
||||
request *dbtypes.BalanceCreateRequest,
|
||||
) error {
|
||||
if request == nil {
|
||||
return fmt.Errorf("%w: request is nil", dberrors.ErrBadRequest)
|
||||
}
|
||||
|
||||
var (
|
||||
psql = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar)
|
||||
|
||||
balancesTable = fmt.Sprintf("%s.%s", c.config.Schema, BalancesTableName)
|
||||
)
|
||||
|
||||
createBalance := psql.Insert(balancesTable).
|
||||
Columns(
|
||||
"id", "owner_id", "raw_balance", "clean_balance",
|
||||
).
|
||||
Values(
|
||||
request.Id, request.OwnerId, request.RawBalance, request.CleanBalance,
|
||||
)
|
||||
|
||||
query, args, err := createBalance.ToSql()
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: error building 'create balance' query: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
res, err := driver.ExecContext(ctx, query, args...)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: error executing 'create balance' query: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
rowsAffected, err := res.RowsAffected()
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: error getting rows affected for 'create balance' query: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
if rowsAffected == 0 {
|
||||
return dberrors.ErrInternal
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user