package handlers import ( "fmt" "net/http" "git.agecem.com/agecem/bottin-agenda/data" "git.agecem.com/agecem/bottin-agenda/models" "git.agecem.com/agecem/bottin-agenda/responses" "github.com/labstack/echo/v4" ) // GetTransactions lists transactions on GET /v2/transactions http/1.1 func GetTransactions(c echo.Context) error { var statusCode int = http.StatusInternalServerError var response responses.GetTransactionsResponse client, err := data.NewDataClientFromViper() if err != nil { response.Message = fmt.Sprintf("Error during data.NewDataClientFromViper(): %s", err) return c.JSON(statusCode, response) } defer client.DB.Close() transactions, err := client.ListTransactions() response.Data.Transactions = transactions if err != nil { response.Message = fmt.Sprintf("Error during client.ListTransactions(): %s", err) return c.JSON(statusCode, response) } if len(transactions) == 0 { response.Message = "No transactions found" statusCode = http.StatusNotFound return c.JSON(statusCode, response) } response.Message = "List successful" statusCode = http.StatusOK return c.JSON(statusCode, response) } // PostTransactions creates transactions on POST /v2/transactions http/1.1 func PostTransactions(c echo.Context) error { var statusCode int = http.StatusInternalServerError var response responses.PostTransactionsResponse var transactions []models.Transaction if err := c.Bind(&transactions); err != nil { statusCode = http.StatusBadRequest response.Message = fmt.Sprintf("Error during c.Bind(): %s", err) return c.JSON(statusCode, response) } client, err := data.NewDataClientFromViper() if err != nil { response.Message = fmt.Sprintf("Error during data.NewDataClientFromViper(): %s", err) return c.JSON(statusCode, response) } defer client.DB.Close() if len(transactions) == 0 { response.Message = fmt.Sprintf("Nothing to do") statusCode = http.StatusOK return c.JSON(statusCode, response) } // Check for already-existing transactions for _, transaction := range transactions { transaction, err := client.GetTransaction(transaction.MembreID, transaction.IsPerpetual) if err != nil { if err.Error() != "sql: no rows in result set" { response.Message = fmt.Sprintf("Error during client.GetTransaction(): %s", err) } } if transaction.ID != "" { agendaType := "non-perpetual" if transaction.IsPerpetual { agendaType = "perpetual" } response.Message = fmt.Sprintf("Membre %s already received %s", transaction.MembreID, agendaType) statusCode = http.StatusBadRequest return c.JSON(statusCode, response) } } rows, err := client.InsertTransactions(transactions) if err != nil { response.Message = fmt.Sprintf("Error during client.InsertTransactions(): %s", err) return c.JSON(statusCode, response) } response.Data.RowsInserted = rows statusCode = http.StatusCreated response.Message = "Insert successful" return c.JSON(statusCode, response) }