Continue migration to echo

This commit is contained in:
2022-08-20 22:44:59 +00:00
parent 014c3818ba
commit 51902cd65d
10 changed files with 76 additions and 99 deletions

View File

@ -12,22 +12,19 @@ type newBudgetInformation struct {
func (h *Handler) newBudget(c echo.Context) error {
var newBudget newBudgetInformation
if err := c.BindJSON(&newBudget); err != nil {
if err := c.Bind(&newBudget); err != nil {
return echo.NewHTTPError(http.StatusNotAcceptable, err)
return
}
if newBudget.Name == "" {
c.AbortWithStatusJSON(http.StatusBadRequest, ErrorResponse{"budget name is required"})
return
return echo.NewHTTPError(http.StatusBadRequest, "budget name is required")
}
userID := MustGetToken(c).GetID()
budget, err := h.Service.NewBudget(c.Request().Context(), newBudget.Name, userID)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
c.JSON(http.StatusOK, budget)
return c.JSON(http.StatusOK, budget)
}

View File

@ -31,28 +31,25 @@ func (h *Handler) budgetingForMonth(c echo.Context) error {
budgetID := c.Param("budgetid")
budgetUUID, err := uuid.Parse(budgetID)
if err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, ErrorResponse{"budgetid missing from URL"})
return
return echo.NewHTTPError(http.StatusBadRequest, "budgetid missing from URL")
}
budget, err := h.Service.GetBudget(c.Request().Context(), budgetUUID)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err)
return
}
month, err := getDate(c)
if err != nil {
c.Redirect(http.StatusTemporaryRedirect, "/budget/"+budget.ID.String())
return
}
data, err := h.getBudgetingViewForMonth(c.Request().Context(), budget, month)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
c.JSON(http.StatusOK, data)
return c.JSON(http.StatusOK, data)
}
func (h *Handler) getBudgetingViewForMonth(ctx context.Context, budget postgres.Budget, month Month) (BudgetingForMonthResponse, error) {

View File

@ -18,28 +18,24 @@ func (h *Handler) setCategoryAssignment(c echo.Context) error {
categoryID := c.Param("categoryid")
categoryUUID, err := uuid.Parse(categoryID)
if err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, ErrorResponse{"categoryid missing from URL"})
return
return echo.NewHTTPError(http.StatusBadRequest, "categoryid missing from URL")
}
var request SetCategoryAssignmentRequest
err = c.BindJSON(&request)
err = c.Bind(&request)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("invalid payload: %w", err))
return
}
date, err := getDate(c)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("date invalid: %w", err))
return
}
var amount numeric.Numeric
err = amount.Set(request.Assigned)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("parse amount: %w", err))
return
}
updateArgs := postgres.UpdateAssignmentParams{
@ -49,7 +45,8 @@ func (h *Handler) setCategoryAssignment(c echo.Context) error {
}
err = h.Service.UpdateAssignment(c.Request().Context(), updateArgs)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("update assignment: %w", err))
return
return fmt.Errorf("update assignment: %w", err)
}
return nil
}

View File

@ -13,6 +13,7 @@ import (
"git.javil.eu/jacob1123/budgeteer/postgres"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
// Handler handles incoming requests.
@ -36,7 +37,10 @@ func (h *Handler) Serve() {
// LoadRoutes initializes all the routes.
func (h *Handler) LoadRoutes(router *echo.Echo) {
router.Use(enableCachingForStaticFiles())
router.Use(h.ServeStatic)
router.Use(middleware.StaticWithConfig(middleware.StaticConfig{
Filesystem: h.StaticFS,
HTML5: true,
}))
api := router.Group("/api/v1")

View File

@ -7,7 +7,6 @@ import (
"git.javil.eu/jacob1123/budgeteer"
"git.javil.eu/jacob1123/budgeteer/postgres"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/labstack/echo/v4"
)
@ -18,8 +17,8 @@ const (
ParamName = "token"
)
func MustGetToken(c *gin.Context) budgeteer.Token { //nolint:ireturn
token := c.MustGet(ParamName)
func MustGetToken(c echo.Context) budgeteer.Token { //nolint:ireturn
token := c.Get(ParamName)
if token, ok := token.(budgeteer.Token); ok {
return token
}
@ -27,16 +26,16 @@ func MustGetToken(c *gin.Context) budgeteer.Token { //nolint:ireturn
panic("Token is not a valid Token")
}
func (h *Handler) verifyLogin(c echo.Context) (budgeteer.Token, *ErrorResponse) { //nolint:ireturn
func (h *Handler) verifyLogin(c echo.Context) (budgeteer.Token, error) { //nolint:ireturn
tokenString := c.Request().Header.Get(HeaderName)
if len(tokenString) <= len(Bearer) {
return nil, &ErrorResponse{"no authorization header supplied"}
return nil, echo.NewHTTPError(http.StatusUnauthorized, "no authorization header supplied")
}
tokenString = tokenString[7:]
token, err := h.TokenVerifier.VerifyToken(tokenString)
if err != nil {
return nil, &ErrorResponse{fmt.Sprintf("verify token '%s': %s", tokenString, err)}
return nil, fmt.Errorf("verify token '%s': %s", tokenString, err)
}
return token, nil
@ -107,16 +106,16 @@ func (h *Handler) registerPost(c echo.Context) error {
var register registerInformation
err := c.Bind(&register)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, ErrorResponse{"error parsing body"})
return echo.NewHTTPError(http.StatusBadRequest, "error parsing body")
}
if register.Email == "" || register.Password == "" || register.Name == "" {
return echo.NewHTTPError(http.StatusBadRequest, ErrorResponse{"e-mail, password and name are required"})
return echo.NewHTTPError(http.StatusBadRequest, "e-mail, password and name are required")
}
_, err = h.Service.GetUserByUsername(c.Request().Context(), register.Email)
if err == nil {
return echo.NewHTTPError(http.StatusBadRequest, ErrorResponse{"email is already taken"})
return echo.NewHTTPError(http.StatusBadRequest, "email is already taken")
}
hash, err := h.CredentialsVerifier.Hash(register.Password)

View File

@ -8,7 +8,6 @@ import (
"git.javil.eu/jacob1123/budgeteer/postgres"
"git.javil.eu/jacob1123/budgeteer/postgres/numeric"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/labstack/echo/v4"
)
@ -30,40 +29,35 @@ type NewTransactionPayload struct {
func (h *Handler) updateTransaction(c echo.Context) error {
var payload NewTransactionPayload
err := c.BindJSON(&payload)
err := c.Bind(&payload)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err)
return
}
amount, err := numeric.Parse(payload.Amount)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("amount: %w", err))
return
}
transactionID := c.Param("transactionid")
transactionUUID, err := uuid.Parse(transactionID)
if err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, ErrorResponse{"transactionid missing from URL"})
return
return echo.NewHTTPError(http.StatusBadRequest, "transactionid missing from URL")
}
h.UpdateTransaction(payload, amount, transactionUUID, c)
return h.UpdateTransaction(payload, amount, transactionUUID, c)
}
func (h *Handler) newTransaction(c echo.Context) error {
var payload NewTransactionPayload
err := c.BindJSON(&payload)
err := c.Bind(&payload)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err)
return
}
amount, err := numeric.Parse(payload.Amount)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("amount: %w", err))
return
}
newTransaction := postgres.CreateTransactionParams{
@ -79,7 +73,6 @@ func (h *Handler) newTransaction(c echo.Context) error {
groupID, err := h.CreateTransferForOtherAccount(newTransaction, amount, payload, c)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
}
newTransaction.GroupID = groupID
@ -94,16 +87,14 @@ func (h *Handler) newTransaction(c echo.Context) error {
transactionUUID, err := h.Service.CreateTransaction(c.Request().Context(), newTransaction)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("create transaction: %w", err))
return
}
transaction, err := h.Service.GetTransaction(c.Request().Context(), transactionUUID)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("get transaction: %w", err))
return
}
c.JSON(http.StatusOK, transaction)
return c.JSON(http.StatusOK, transaction)
}
func (h *Handler) UpdateTransaction(payload NewTransactionPayload, amount numeric.Numeric, transactionUUID uuid.UUID, c echo.Context) error {
@ -112,7 +103,7 @@ func (h *Handler) UpdateTransaction(payload NewTransactionPayload, amount numeri
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("delete transaction: %w", err))
}
return
return nil
}
editTransaction := postgres.UpdateTransactionParams{
@ -127,19 +118,17 @@ func (h *Handler) UpdateTransaction(payload NewTransactionPayload, amount numeri
err := h.Service.UpdateTransaction(c.Request().Context(), editTransaction)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("edit transaction: %w", err))
return
}
transaction, err := h.Service.GetTransaction(c.Request().Context(), transactionUUID)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("get transaction: %w", err))
return
}
c.JSON(http.StatusOK, transaction)
return c.JSON(http.StatusOK, transaction)
}
func (h *Handler) CreateTransferForOtherAccount(newTransaction postgres.CreateTransactionParams, amount numeric.Numeric, payload NewTransactionPayload, c *gin.Context) (uuid.NullUUID, error) {
func (h *Handler) CreateTransferForOtherAccount(newTransaction postgres.CreateTransactionParams, amount numeric.Numeric, payload NewTransactionPayload, c echo.Context) (uuid.NullUUID, error) {
newTransaction.GroupID = uuid.NullUUID{UUID: uuid.New(), Valid: true}
newTransaction.Amount = amount.Neg()
newTransaction.AccountID = payload.Payee.ID.UUID

View File

@ -5,10 +5,10 @@ import (
"strconv"
"time"
"github.com/gin-gonic/gin"
"github.com/labstack/echo/v4"
)
func getDate(c *gin.Context) (Month, error) {
func getDate(c echo.Context) (Month, error) {
var year, month int
yearString := c.Param("year")
monthString := c.Param("month")

View File

@ -9,109 +9,98 @@ import (
)
func (h *Handler) importYNAB(c echo.Context) error {
budgetID, succ := c.Params.Get("budgetid")
if !succ {
c.AbortWithStatusJSON(http.StatusBadRequest, ErrorResponse{"no budget_id specified"})
return
budgetID := c.Param("budgetid")
if budgetID == "" {
return echo.NewHTTPError(http.StatusBadRequest, "no budget_id specified")
}
budgetUUID, err := uuid.Parse(budgetID)
if !succ {
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err)
return
}
ynab, err := postgres.NewYNABImport(c.Request().Context(), h.Service.Queries, budgetUUID)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
transactionsFile, err := c.FormFile("transactions")
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
transactions, err := transactionsFile.Open()
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
err = ynab.ImportTransactions(c.Request().Context(), transactions)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
assignmentsFile, err := c.FormFile("assignments")
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
assignments, err := assignmentsFile.Open()
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
err = ynab.ImportAssignments(c.Request().Context(), assignments)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
return nil
}
func (h *Handler) exportYNABTransactions(c echo.Context) error {
budgetID, succ := c.Params.Get("budgetid")
if !succ {
c.AbortWithStatusJSON(http.StatusBadRequest, ErrorResponse{"no budget_id specified"})
return
budgetID := c.Param("budgetid")
if budgetID == "" {
return echo.NewHTTPError(http.StatusBadRequest, "no budget_id specified")
}
budgetUUID, err := uuid.Parse(budgetID)
if !succ {
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err)
return
}
ynab, err := postgres.NewYNABExport(c.Request().Context(), h.Service.Queries, budgetUUID)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
err = ynab.ExportTransactions(c.Request().Context(), c.Writer)
err = ynab.ExportTransactions(c.Request().Context(), c.Response().Writer)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
return err
}
return nil
}
func (h *Handler) exportYNABAssignments(c echo.Context) error {
budgetID, succ := c.Params.Get("budgetid")
if !succ {
c.AbortWithStatusJSON(http.StatusBadRequest, ErrorResponse{"no budget_id specified"})
return
budgetID := c.Param("budgetid")
if budgetID == "" {
return echo.NewHTTPError(http.StatusBadRequest, "no budget_id specified")
}
budgetUUID, err := uuid.Parse(budgetID)
if !succ {
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err)
return
}
ynab, err := postgres.NewYNABExport(c.Request().Context(), h.Service.Queries, budgetUUID)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
}
err = ynab.ExportAssignments(c.Request().Context(), c.Writer)
err = ynab.ExportAssignments(c.Request().Context(), c.Response().Writer)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
return
}
return nil
}