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 }