Adds type to OpenAPI. Feature done and tested E2E. Adds common utilities package named "golang" to overcome language deficiencies. Issue #27
133 lines
3.3 KiB
Go
133 lines
3.3 KiB
Go
package api
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
|
|
"git.rosemyrtle.work/personal-finance/server/internal/dal"
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
//go:generate go run github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@v2.1.0 --config=api.cfg.yaml ../../docs/openapi.yaml
|
|
|
|
type ServerImpl struct {
|
|
Dal dal.DAL
|
|
}
|
|
|
|
func (server *ServerImpl) GetBanks(ctx echo.Context) error {
|
|
log.Print("GetBanks")
|
|
|
|
banks, err := server.Dal.Banks()
|
|
if err != nil {
|
|
return ctx.NoContent(http.StatusInternalServerError)
|
|
}
|
|
|
|
if len(banks) == 0 {
|
|
return ctx.NoContent(http.StatusNoContent)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, convertBanks(banks))
|
|
}
|
|
|
|
func (server *ServerImpl) GetBankById(ctx echo.Context, bankId string) error {
|
|
log.Printf("GetBankById(%v)", bankId)
|
|
|
|
bank, err := server.Dal.Bank(bankId)
|
|
if err != nil {
|
|
log.Printf("%v", err)
|
|
return ctx.NoContent(http.StatusInternalServerError)
|
|
}
|
|
|
|
if bank == nil {
|
|
return ctx.NoContent(http.StatusNotFound)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, convertBank(*bank))
|
|
}
|
|
|
|
func (server *ServerImpl) GetTransactions(ctx echo.Context, params GetTransactionsParams) error {
|
|
log.Print("GetTransactions")
|
|
|
|
transactions, err := server.Dal.Transactions()
|
|
if err != nil {
|
|
return ctx.NoContent(http.StatusInternalServerError)
|
|
}
|
|
|
|
if len(transactions) == 0 {
|
|
return ctx.NoContent(http.StatusNoContent)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, convertTransactions(transactions))
|
|
}
|
|
|
|
func (server *ServerImpl) GetTransactionById(ctx echo.Context, transactionId int64) error {
|
|
log.Printf("GetTransactionById(%v)", transactionId)
|
|
|
|
transaction, err := server.Dal.Transaction(transactionId)
|
|
if err != nil {
|
|
log.Printf("%v", err)
|
|
return ctx.NoContent(http.StatusInternalServerError)
|
|
}
|
|
|
|
if transaction == nil {
|
|
return ctx.NoContent(http.StatusNotFound)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, entity2transaction(*transaction))
|
|
}
|
|
|
|
func (server *ServerImpl) CreateTransaction(ctx echo.Context) error {
|
|
t := new(Transaction)
|
|
if err := ctx.Bind(t); err != nil {
|
|
log.Printf("%v", err)
|
|
return ctx.NoContent(http.StatusBadRequest)
|
|
}
|
|
|
|
transaction, err := server.Dal.InsertTransaction(transaction2entity(*t))
|
|
if err != nil {
|
|
log.Printf("%v", err)
|
|
return ctx.NoContent(http.StatusInternalServerError)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusCreated, entity2transaction(transaction))
|
|
}
|
|
|
|
func (server *ServerImpl) UpdateTransaction(ctx echo.Context, transactionId int64) error {
|
|
if exists, err := server.Dal.TransactionExists(uint64(transactionId)); err != nil {
|
|
log.Printf("%v", err)
|
|
return ctx.NoContent(http.StatusInternalServerError)
|
|
} else if !exists {
|
|
return ctx.NoContent(http.StatusNotFound)
|
|
}
|
|
|
|
t := new(Transaction)
|
|
if err := ctx.Bind(t); err != nil {
|
|
log.Printf("%v", err)
|
|
return ctx.NoContent(http.StatusBadRequest)
|
|
}
|
|
|
|
transaction := transaction2entity(*t)
|
|
transaction.Id = uint64(transactionId)
|
|
|
|
transaction, err := server.Dal.UpdateTransaction(transaction)
|
|
if err != nil {
|
|
log.Printf("%v", err)
|
|
return ctx.NoContent(http.StatusInternalServerError)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, entity2transaction(transaction))
|
|
}
|
|
|
|
func (server *ServerImpl) GetCategories(ctx echo.Context) error {
|
|
categories, err := server.Dal.Categories()
|
|
if err != nil {
|
|
return ctx.NoContent(http.StatusInternalServerError)
|
|
}
|
|
|
|
if len(categories) == 0 {
|
|
return ctx.NoContent(http.StatusNoContent)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, entities2categories(categories))
|
|
}
|