diff --git a/internal/expense/database.go b/internal/expense/database.go index 926c84b..ba83669 100644 --- a/internal/expense/database.go +++ b/internal/expense/database.go @@ -1,16 +1,37 @@ package expense -import "nos-comptes/internal/storage/dao/postgresql" +import ( + "github.com/lib/pq" + "nos-comptes/internal/storage/dao/postgresql" +) type Database struct { *postgresql.DatabasePostgreSQL } -func (d Database) GetAllExpensesOfAnAccount(id string) (interface{}, interface{}) { +func (db *Database) CreateExpense(expense *Expense) error { 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 + INSERT INTO public.expense + (account_id, value, type_expense, expense_date, libelle) + VALUES + ($1, $2, $3, $4) + RETURNING id, created_at + ` + + err := db.Session. + QueryRow(q, expense.AccountId, expense.Value, expense.TypeExpense, expense.ExpenseDate, expense.Libelle). + Scan(&expense.ID, &expense.CreatedAt) + if errPq, ok := err.(*pq.Error); ok { + return postgresql.HandlePgError(errPq) + } + return err +} + +func (db Database) GetAllExpensesOfAnAccount(id string) ([]*Expense, error) { + q := ` + SELECT a.id, a.account_id, a.value, a.type_expense, a.expense_date, a.created_at, a.updated_at, a.libelle + FROM public.expense a + WHERE a.account_id = $1 ` rows, err := db.Session.Query(q, id) if err != nil { @@ -18,16 +39,16 @@ func (d Database) GetAllExpensesOfAnAccount(id string) (interface{}, interface{} } defer rows.Close() - as := make([]*Account, 0) + es := make([]*Expense, 0) for rows.Next() { - a := Account{} - err := rows.Scan(&a.ID, &a.UserId, &a.Name, &a.Provider, &a.CreatedAt, &a.UpdatedAt) + e := Expense{} + err := rows.Scan(&e.ID, &e.AccountId, &e.Value, &e.TypeExpense, &e.ExpenseDate, &e.CreatedAt, &e.UpdatedAt, &e.Libelle) if err != nil { return nil, err } - as = append(as, &a) + es = append(es, &e) } - return as, nil + return es, nil } func NewDatabase(db *postgresql.DatabasePostgreSQL) *Database { diff --git a/internal/expense/handler.go b/internal/expense/handler.go index 814431f..c5b3858 100644 --- a/internal/expense/handler.go +++ b/internal/expense/handler.go @@ -5,6 +5,7 @@ import ( "nos-comptes/handler" "nos-comptes/internal/storage/dao/postgresql" "nos-comptes/internal/storage/model" + "nos-comptes/internal/storage/validators" "nos-comptes/internal/utils" "github.com/gin-gonic/gin" @@ -16,17 +17,31 @@ type Context struct { *handler.Context } -func (c *Context) CreateAnExpense(context *gin.Context) { - +func (c *Context) CreateAnExpense(gc *gin.Context) { + accountID := gc.Param("accountId") + var expense Expense + var expenseEditable ExpenseEditable + if err := gc.BindJSON(&expenseEditable); err != nil { + utils.JSONError(gc.Writer, validators.NewDataValidationAPIError(err)) + return + } + expense = Expense{ExpenseEditable: expenseEditable, AccountId: accountID} + err := c.service.CreateExpense(&expense) + if err != nil { + utils.GetLogger().Info(err) + utils.JSONErrorWithMessage(gc.Writer, model.ErrInternalServer, err.Error()) + return + } + utils.JSON(gc.Writer, http.StatusCreated, expense) } -func (c *Context) DeleteExpense(context *gin.Context) { +func (c *Context) DeleteExpense(gc *gin.Context) { } func (c *Context) GetAllExpenses(gc *gin.Context) { accountId := gc.Param("accountId") - accounts, err := c.service.GetAllExpensesOfAnAccount(accountId) + expenses, 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) @@ -36,10 +51,10 @@ func (c *Context) GetAllExpenses(gc *gin.Context) { return } - if len(accounts) == 0 { + if len(expenses) == 0 { utils.JSON(gc.Writer, http.StatusNoContent, nil) } else { - utils.JSON(gc.Writer, http.StatusOK, accounts) + utils.JSON(gc.Writer, http.StatusOK, expenses) } } diff --git a/internal/expense/model.go b/internal/expense/model.go index 95c9202..c68b57a 100644 --- a/internal/expense/model.go +++ b/internal/expense/model.go @@ -10,6 +10,7 @@ type Expense struct { type ExpenseEditable struct { ID string `json:"id,omitempty"` Value float32 `json:"value"` + Libelle string `json:"libelle"` TypeExpense string `json:"typeExpense"` ExpenseDate time.Time `json:"expenseDate,omitempty"` CreatedAt *time.Time `json:"createdAt,omitempty"` diff --git a/internal/expense/service.go b/internal/expense/service.go index 4880344..1b3f2ec 100644 --- a/internal/expense/service.go +++ b/internal/expense/service.go @@ -3,14 +3,16 @@ package expense import ( "nos-comptes/internal/storage/dao" "nos-comptes/internal/storage/model" + "nos-comptes/internal/utils" ) type Service struct { db *Database } -func (s Service) GetAllExpensesOfAnAccount(accountId string) (interface{}, interface{}) { +func (s Service) GetAllExpensesOfAnAccount(accountId string) ([]*Expense, error) { expenses, err := s.db.GetAllExpensesOfAnAccount(accountId) + utils.GetLogger().Info(err) if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: @@ -28,6 +30,11 @@ func (s Service) GetAllExpensesOfAnAccount(accountId string) (interface{}, inter return expenses, nil } +func (s Service) CreateExpense(expense *Expense) error { + + return s.db.CreateExpense(expense) +} + func NewService(database *Database) *Service { return &Service{db: database} } diff --git a/internal/user/handler.go b/internal/user/handler.go index 16e7dfc..b0e3105 100755 --- a/internal/user/handler.go +++ b/internal/user/handler.go @@ -1,7 +1,6 @@ package user import ( - "fmt" "net/http" "nos-comptes/handler" "nos-comptes/internal/storage/dao/postgresql" @@ -45,7 +44,7 @@ func (hc *Context) ConnectUser(c *gin.Context) { oauth2Service, err := oauth2.New(&http.Client{}) if oauth2Service == nil { - fmt.Println(err) + utils.GetLoggerFromCtx(c).WithError(err).Error(err) utils.JSONError(c.Writer, model.ErrInternalServer) return } @@ -53,18 +52,17 @@ func (hc *Context) ConnectUser(c *gin.Context) { tokenInfoCall.IdToken(authorizationHeaderSplitted[1]) tokenInfo, err := tokenInfoCall.Do() if err != nil { - utils.GetLogger().WithError(err).Error(err) + utils.GetLoggerFromCtx(c).WithError(err).Error(err) utils.JSONError(c.Writer, model.ErrBadRequestFormat) return } user, err := hc.service.GetUserFromGoogleID(tokenInfo.UserId) if err != nil { - utils.GetLogger().WithError(err).Error(err) if castedError, ok := err.(*model.APIError); ok { if castedError.Type == model.ErrNotFound.Type { user, err := hc.service.CreateUserFromGoogleToken(tokenInfo.UserId, tokenInfo.Email) if err != nil { - fmt.Println(err) + utils.GetLoggerFromCtx(c).WithError(err).Error(err) utils.JSONError(c.Writer, model.ErrInternalServer) return } @@ -74,6 +72,7 @@ func (hc *Context) ConnectUser(c *gin.Context) { utils.JSONError(c.Writer, *castedError) return } + utils.GetLoggerFromCtx(c).WithError(err).Error(err) utils.JSONError(c.Writer, model.ErrInternalServer) return } @@ -90,7 +89,7 @@ func (hc *Context) CreateUser(c *gin.Context) { oauth2Service, err := oauth2.New(&http.Client{}) if oauth2Service == nil { - fmt.Println(err) + utils.GetLogger().WithError(err).Error(err) utils.JSONError(c.Writer, model.ErrInternalServer) return } @@ -109,7 +108,7 @@ func (hc *Context) CreateUser(c *gin.Context) { if castedError.Type == model.ErrNotFound.Type { user, err := hc.service.CreateUserFromGoogleToken(tokenInfo.UserId, tokenInfo.Email) if err != nil { - fmt.Println(err) + utils.GetLogger().WithError(err).Error(err) utils.JSONError(c.Writer, model.ErrInternalServer) return } @@ -119,6 +118,7 @@ func (hc *Context) CreateUser(c *gin.Context) { utils.JSONError(c.Writer, *castedError) return } + utils.GetLogger().Info(err) utils.JSONError(c.Writer, model.ErrInternalServer) return } diff --git a/liquibase/changelogs/changeset/create-expenses.xml b/liquibase/changelogs/changeset/create-expenses.xml index f2b861b..085c424 100644 --- a/liquibase/changelogs/changeset/create-expenses.xml +++ b/liquibase/changelogs/changeset/create-expenses.xml @@ -11,6 +11,9 @@ + + +