From 82d86fb33ff233bd8e65419453e2e8a04ae8b997 Mon Sep 17 00:00:00 2001 From: Jeffrey Duroyon Date: Wed, 24 Nov 2021 01:07:19 +0100 Subject: [PATCH] feat(expense): starting expense handle --- internal/expense/database.go | 24 ++++++++++++++++++++++++ internal/expense/handler.go | 20 +++++++++++++++++++- internal/expense/model.go | 15 ++++++++++++++- internal/expense/service.go | 28 ++++++++++++++++++++++++++-- 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/internal/expense/database.go b/internal/expense/database.go index b05a86e..926c84b 100644 --- a/internal/expense/database.go +++ b/internal/expense/database.go @@ -6,6 +6,30 @@ type Database struct { *postgresql.DatabasePostgreSQL } +func (d Database) GetAllExpensesOfAnAccount(id string) (interface{}, interface{}) { + q := ` + SELECT a.id, a.user_id, a.name, a.provider, a.created_at, a.updated_at + FROM public.account a + WHERE a.user_id = $1 + ` + rows, err := db.Session.Query(q, id) + if err != nil { + return nil, err + } + defer rows.Close() + + as := make([]*Account, 0) + for rows.Next() { + a := Account{} + err := rows.Scan(&a.ID, &a.UserId, &a.Name, &a.Provider, &a.CreatedAt, &a.UpdatedAt) + if err != nil { + return nil, err + } + as = append(as, &a) + } + return as, nil +} + func NewDatabase(db *postgresql.DatabasePostgreSQL) *Database { return &Database{db} } diff --git a/internal/expense/handler.go b/internal/expense/handler.go index b5e70ce..814431f 100644 --- a/internal/expense/handler.go +++ b/internal/expense/handler.go @@ -1,8 +1,11 @@ package expense import ( + "net/http" "nos-comptes/handler" "nos-comptes/internal/storage/dao/postgresql" + "nos-comptes/internal/storage/model" + "nos-comptes/internal/utils" "github.com/gin-gonic/gin" ) @@ -21,8 +24,23 @@ func (c *Context) DeleteExpense(context *gin.Context) { } -func (c *Context) GetAllExpenses(context *gin.Context) { +func (c *Context) GetAllExpenses(gc *gin.Context) { + accountId := gc.Param("accountId") + accounts, err := c.service.GetAllExpensesOfAnAccount(accountId) + if e, ok := err.(*model.APIError); ok { + utils.GetLoggerFromCtx(gc).WithError(err).WithField("type", e.Type).Error("error GetAllExpenses: get expenses") + utils.JSONErrorWithMessage(gc.Writer, *e, e.Description) + } else if err != nil { + utils.GetLoggerFromCtx(gc).WithError(err).Error("error while get expenses") + utils.JSONError(gc.Writer, model.ErrInternalServer) + return + } + if len(accounts) == 0 { + utils.JSON(gc.Writer, http.StatusNoContent, nil) + } else { + utils.JSON(gc.Writer, http.StatusOK, accounts) + } } func (c *Context) GetAnExpenses(context *gin.Context) { diff --git a/internal/expense/model.go b/internal/expense/model.go index 732731e..95c9202 100644 --- a/internal/expense/model.go +++ b/internal/expense/model.go @@ -1,4 +1,17 @@ package expense -type Account struct { +import "time" + +type Expense struct { + ExpenseEditable + AccountId string `json:"accountId,omitempty"` +} + +type ExpenseEditable struct { + ID string `json:"id,omitempty"` + Value float32 `json:"value"` + TypeExpense string `json:"typeExpense"` + ExpenseDate time.Time `json:"expenseDate,omitempty"` + CreatedAt *time.Time `json:"createdAt,omitempty"` + UpdatedAt *time.Time `json:"updatedAt,omitempty"` } diff --git a/internal/expense/service.go b/internal/expense/service.go index 40dee38..4880344 100644 --- a/internal/expense/service.go +++ b/internal/expense/service.go @@ -1,9 +1,33 @@ package expense +import ( + "nos-comptes/internal/storage/dao" + "nos-comptes/internal/storage/model" +) + type Service struct { - Db *Database + db *Database +} + +func (s Service) GetAllExpensesOfAnAccount(accountId string) (interface{}, interface{}) { + expenses, err := s.db.GetAllExpensesOfAnAccount(accountId) + if e, ok := err.(*dao.Error); ok { + switch { + case e.Type == dao.ErrTypeNotFound: + return nil, &model.ErrNotFound + default: + return nil, &model.ErrInternalServer + } + } else if err != nil { + return nil, &model.ErrInternalServer + } + + if expenses == nil { + return nil, &model.ErrNotFound + } + return expenses, nil } func NewService(database *Database) *Service { - return &Service{Db: database} + return &Service{db: database} }