github.com/paulwerner/bookkeeper@v0.1.0/store/accountStore.go (about)

     1  package store
     2  
     3  import (
     4  	"database/sql"
     5  
     6  	d "github.com/paulwerner/bookkeeper/pkg/domain"
     7  	"github.com/paulwerner/bookkeeper/pkg/uc"
     8  )
     9  
    10  type accountStore struct {
    11  	db *sql.DB
    12  }
    13  
    14  func NewAccountStore(db *sql.DB) uc.AccountStore {
    15  	return &accountStore{
    16  		db: db,
    17  	}
    18  }
    19  
    20  func (as *accountStore) Create(a d.Account) (*d.Account, error) {
    21  	sqlStatement := `INSERT INTO accounts (
    22  		id, 
    23  		user_id, 
    24  		name, 
    25  		description, 
    26  		type, 
    27  		balance_value, 
    28  		balance_currency
    29  	) VALUES ($1, $2, $3, $4, $5, $6, $7)`
    30  	if _, err := as.db.Exec(sqlStatement, a.ID, a.User.ID, a.Name, a.Description, a.Type, a.BalanceValue, a.BalanceCurrency); err != nil {
    31  		return nil, err
    32  	}
    33  	return as.FindByIDAndUser(a.ID, a.User.ID)
    34  }
    35  
    36  func (as *accountStore) Update(a d.Account) (account *d.Account, err error) {
    37  	sqlStatement := `UPDATE accounts 
    38  	SET name=$2, 
    39  		description=$3, 
    40  		type=$4, 
    41  		balance_value=$5, 
    42  		balance_currency=$6
    43  	WHERE id=$1`
    44  	if _, err := as.db.Exec(sqlStatement, a.ID, a.Name, a.Description, a.Type, a.BalanceValue, a.BalanceCurrency); err != nil {
    45  		return nil, err
    46  	}
    47  	return as.FindByIDAndUser(a.ID, a.User.ID)
    48  }
    49  
    50  func (as *accountStore) FindAll(uID d.UserID) (accounts []d.Account, err error) {
    51  	sqlStatement := `SELECT 
    52  		id,
    53  		user_id,
    54  		name,
    55  		description,
    56  		type,
    57  		balance_value,
    58  		balance_currency
    59  	FROM accounts
    60  	WHERE user_id=$1`
    61  	rows, err := as.db.Query(sqlStatement, uID)
    62  	defer rows.Close()
    63  	if err != nil && err != sql.ErrNoRows {
    64  		err = d.ErrInternalError
    65  		return
    66  	}
    67  	for rows.Next() {
    68  		var a d.Account
    69  		err = rows.Scan(&a.ID, &a.User.ID, &a.Name, &a.Description, &a.Type, &a.BalanceValue, &a.BalanceCurrency)
    70  		if err != nil {
    71  			err = d.ErrInternalError
    72  			return
    73  		}
    74  		accounts = append(accounts, a)
    75  	}
    76  	return
    77  }
    78  
    79  func (as *accountStore) FindByIDAndUser(id d.AccountID, uID d.UserID) (*d.Account, error) {
    80  	var account d.Account
    81  	sqlStatement := `SELECT 
    82  		id, 
    83  		user_id,
    84  		name, 
    85  		description, 
    86  		type, 
    87  		balance_value, 
    88  		balance_currency 
    89  	FROM accounts 
    90  	WHERE id=$1 AND user_id=$2`
    91  	if err := as.db.QueryRow(sqlStatement, id, uID).
    92  		Scan(&account.ID, &account.User.ID, &account.Name, &account.Description, &account.Type, &account.BalanceValue, &account.BalanceCurrency); err != nil {
    93  		switch err {
    94  		case sql.ErrNoRows:
    95  			err = d.ErrNotFound
    96  		default:
    97  			err = d.ErrInternalError
    98  		}
    99  		return nil, err
   100  	}
   101  	return &account, nil
   102  }
   103  
   104  func (as *accountStore) FindByUserAndName(uID d.UserID, name string) (*d.Account, error) {
   105  	var account d.Account
   106  	sqlStatement := `SELECT 
   107  		id, 
   108  		name, 
   109  		description, 
   110  		type, 
   111  		balance_value, 
   112  		balance_currency 
   113  	FROM accounts 
   114  	WHERE user_id=$1 AND name=$2`
   115  	if err := as.db.QueryRow(sqlStatement, uID, name).
   116  		Scan(&account.ID, &account.Name, &account.Description, &account.Type, &account.BalanceValue, &account.BalanceCurrency); err != nil {
   117  		switch err {
   118  		case sql.ErrNoRows:
   119  			err = d.ErrNotFound
   120  		default:
   121  			err = d.ErrInternalError
   122  		}
   123  		return nil, err
   124  	}
   125  	return &account, nil
   126  }