It adds the method to the OpenAPI spec and generates a new server config. The requirement for the ID on the Transaction component is removed, so that it can be reused for insertions. It also adds two new middlewares, a logging and a spec validator. If a request does not follow the spec, a 400 is returned immediately. Issue: #18
105 lines
2.3 KiB
Go
105 lines
2.3 KiB
Go
package dal
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
|
|
"git.rosemyrtle.work/personal-finance/server/internal/entity"
|
|
)
|
|
|
|
type DalImpl struct {
|
|
Db *sql.DB
|
|
}
|
|
|
|
func (dal *DalImpl) Transaction(transactionId int64) (*entity.Transaction, error) {
|
|
log.Printf("DAL::Transaction(%v)", transactionId)
|
|
|
|
if dal.Db == nil {
|
|
log.Panic("database not available")
|
|
}
|
|
|
|
rows, err := dal.Db.Query("SELECT t.id, t.date, t.description, t.amount FROM pfbudget.transactions t WHERE t.id = $1", transactionId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
transactions := convert[entity.Transaction](rows)
|
|
if len(transactions) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
return &transactions[0], nil
|
|
}
|
|
|
|
func (dal *DalImpl) Transactions() (entity.Transactions, error) {
|
|
log.Print("DAL::Transactions")
|
|
|
|
if dal.Db == nil {
|
|
log.Panic("database not available")
|
|
}
|
|
|
|
rows, err := dal.Db.Query("SELECT t.id, t.date, t.description, t.amount FROM pfbudget.transactions t")
|
|
if err != nil {
|
|
return entity.Transactions{}, err
|
|
}
|
|
|
|
return convert[entity.Transaction](rows), nil
|
|
}
|
|
|
|
func (dal *DalImpl) InsertTransaction(t entity.Transaction) (entity.Transaction, error) {
|
|
log.Print("DAL::InsertTransaction")
|
|
|
|
if dal.Db == nil {
|
|
log.Panic("database not available")
|
|
}
|
|
|
|
stmt := `
|
|
INSERT INTO pfbudget.transactions (date, description, amount)
|
|
VALUES ($1, $2, $3)
|
|
RETURNING id
|
|
`
|
|
|
|
id := new(uint64)
|
|
if err := dal.Db.QueryRow(stmt, t.Date, t.Description, t.Value).Scan(id); err != nil {
|
|
return entity.Transaction{}, err
|
|
}
|
|
|
|
t.Id = *id
|
|
return t, nil
|
|
}
|
|
|
|
func (dal *DalImpl) Bank(bankId string) (*entity.Bank, error) {
|
|
log.Printf("DAL::Bank(%v)", bankId)
|
|
|
|
if dal.Db == nil {
|
|
log.Panic("database not available")
|
|
}
|
|
|
|
rows, err := dal.Db.Query("SELECT b.name, b.name, n.requisition_id FROM pfbudget.banks b JOIN pfbudget.banks_nordigen n ON b.name = n.name WHERE b.name = $1", bankId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
banks := convert[entity.Bank](rows)
|
|
if len(banks) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
return &banks[0], nil
|
|
}
|
|
|
|
func (dal *DalImpl) Banks() (entity.Banks, error) {
|
|
log.Print("DAL::Banks")
|
|
|
|
if dal.Db == nil {
|
|
log.Panic("database not available")
|
|
}
|
|
|
|
rows, err := dal.Db.Query("SELECT b.name, b.name, n.requisition_id FROM pfbudget.banks b JOIN pfbudget.banks_nordigen n ON b.name = n.name")
|
|
if err != nil {
|
|
return entity.Banks{}, err
|
|
}
|
|
|
|
return convert[entity.Bank](rows), nil
|
|
}
|