From 2b15231ed1444df1713fe60c72d0f745b9a7ac35 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Sun, 11 Sep 2022 21:10:04 +0000 Subject: [PATCH] Implement backend --- postgres/categories.sql.go | 18 ++++++++++++ postgres/queries/categories.sql | 5 ++++ server/category_new.go | 49 +++++++++++++++++++++++++++++++++ server/http.go | 3 ++ 4 files changed, 75 insertions(+) create mode 100644 server/category_new.go diff --git a/postgres/categories.sql.go b/postgres/categories.sql.go index 429ccf9..faf8117 100644 --- a/postgres/categories.sql.go +++ b/postgres/categories.sql.go @@ -91,6 +91,24 @@ func (q *Queries) GetCategories(ctx context.Context, budgetID uuid.UUID) ([]GetC return items, nil } +const getCategoryGroupByName = `-- name: GetCategoryGroupByName :one +SELECT category_groups.id, category_groups.budget_id, category_groups.name FROM category_groups +WHERE category_groups.budget_id = $1 +AND category_groups.name = $2 +` + +type GetCategoryGroupByNameParams struct { + BudgetID uuid.UUID + Name string +} + +func (q *Queries) GetCategoryGroupByName(ctx context.Context, arg GetCategoryGroupByNameParams) (CategoryGroup, error) { + row := q.db.QueryRowContext(ctx, getCategoryGroupByName, arg.BudgetID, arg.Name) + var i CategoryGroup + err := row.Scan(&i.ID, &i.BudgetID, &i.Name) + return i, err +} + const getCategoryGroups = `-- name: GetCategoryGroups :many SELECT category_groups.id, category_groups.budget_id, category_groups.name FROM category_groups WHERE category_groups.budget_id = $1 diff --git a/postgres/queries/categories.sql b/postgres/queries/categories.sql index d9c4843..1ae139d 100644 --- a/postgres/queries/categories.sql +++ b/postgres/queries/categories.sql @@ -8,6 +8,11 @@ RETURNING *; SELECT category_groups.* FROM category_groups WHERE category_groups.budget_id = $1; +-- name: GetCategoryGroupByName :one +SELECT category_groups.* FROM category_groups +WHERE category_groups.budget_id = $1 +AND category_groups.name = $2; + -- name: CreateCategory :one INSERT INTO categories (name, category_group_id) diff --git a/server/category_new.go b/server/category_new.go new file mode 100644 index 0000000..0ff86f3 --- /dev/null +++ b/server/category_new.go @@ -0,0 +1,49 @@ +package server + +import ( + "net/http" + + "git.javil.eu/jacob1123/budgeteer/postgres" + "github.com/google/uuid" + "github.com/labstack/echo/v4" +) + +type newCategoryInformation struct { + BudgetID uuid.UUID `json:"budgetId"` + Name string `json:"name"` + Group string `json:"group"` +} + +func (h *Handler) newCategory(c echo.Context) error { + var newCategory newCategoryInformation + if err := c.Bind(&newCategory); err != nil { + return echo.NewHTTPError(http.StatusNotAcceptable, err) + } + + if newCategory.Name == "" { + return echo.NewHTTPError(http.StatusBadRequest, "category name is required") + } + + if newCategory.Group == "" { + // TODO Handle new Group here? + return echo.NewHTTPError(http.StatusBadRequest, "category group is required") + } + + categoryGroup, err := h.Service.GetCategoryGroupByName(c.Request().Context(), postgres.GetCategoryGroupByNameParams{ + BudgetID: newCategory.BudgetID, + Name: newCategory.Group, + }) + if err != nil { + return err + } + + budget, err := h.Service.CreateCategory(c.Request().Context(), postgres.CreateCategoryParams{ + CategoryGroupID: categoryGroup.ID, + Name: newCategory.Name, + }) + if err != nil { + return err + } + + return c.JSON(http.StatusOK, budget) +} diff --git a/server/http.go b/server/http.go index 57b0e01..f5a54e6 100644 --- a/server/http.go +++ b/server/http.go @@ -53,6 +53,9 @@ func (h *Handler) LoadRoutes(router *echo.Echo) { account.POST("/:accountid/reconcile", h.reconcileTransactions) account.POST("/:accountid", h.editAccount) + category := authenticated.Group("/category") + category.POST("/new", h.newCategory) + budget := authenticated.Group("/budget") budget.POST("/new", h.newBudget) budget.GET("/:budgetid", h.budget)