package server import ( "net/http" "time" "git.javil.eu/jacob1123/budgeteer/postgres" "github.com/google/uuid" "github.com/labstack/echo/v4" ) type FilterTransactionsRequest struct { CategoryID string `json:"category_id"` PayeeID string `json:"payee_id"` AccountID string `json:"account_id"` FromDate time.Time `json:"from_date"` ToDate time.Time `json:"to_date"` } func (h *Handler) filteredTransactions(c echo.Context) error { budgetID := c.Param("budgetid") budgetUUID, err := uuid.Parse(budgetID) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, err) } var request FilterTransactionsRequest err = c.Bind(&request) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, err) } params := postgres.GetFilteredTransactionsParams{ BudgetID: budgetUUID, FromDate: request.FromDate, ToDate: request.ToDate, } params.CategoryID, params.FilterCategory = parseEmptyUUID(request.CategoryID) accountID, filterAccount := parseEmptyUUID(request.AccountID) params.AccountID, params.FilterAccount = accountID.UUID, filterAccount params.PayeeID, params.FilterPayee = parseEmptyUUID(request.PayeeID) transactions, err := h.Service.GetFilteredTransactions(c.Request().Context(), params) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, err) } return c.JSON(http.StatusOK, TransactionsResponse{nil, transactions}) } func parseEmptyUUID(value string) (uuid.NullUUID, bool) { if value == "" { return uuid.NullUUID{}, false } val, err := uuid.Parse(value) if err != nil { return uuid.NullUUID{}, false } return uuid.NullUUID{val, true}, true } func (h *Handler) problematicTransactions(c echo.Context) error { budgetID := c.Param("budgetid") budgetUUID, err := uuid.Parse(budgetID) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, err) } transactions, err := h.Service.GetProblematicTransactions(c.Request().Context(), budgetUUID) if err != nil { return err } return c.JSON(http.StatusOK, TransactionsResponse{nil, transactions}) } func (h *Handler) transactionsForAccount(c echo.Context) error { accountID := c.Param("accountid") accountUUID, err := uuid.Parse(accountID) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, err) } account, err := h.Service.GetAccount(c.Request().Context(), accountUUID) if err != nil { return echo.NewHTTPError(http.StatusNotFound, err) } transactions, err := h.Service.GetTransactionsForAccount(c.Request().Context(), accountUUID) if err != nil { return echo.NewHTTPError(http.StatusNotFound, err) } return c.JSON(http.StatusOK, TransactionsResponse{&account, transactions}) } type TransactionsResponse struct { Account *postgres.Account Transactions []postgres.DisplayTransaction } type EditAccountRequest struct { Name string `json:"name"` OnBudget bool `json:"onBudget"` IsOpen bool `json:"isOpen"` } func (h *Handler) editAccount(c echo.Context) error { accountID := c.Param("accountid") accountUUID, err := uuid.Parse(accountID) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, err) } var request EditAccountRequest err = c.Bind(&request) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, err) } updateParams := postgres.UpdateAccountParams{ Name: request.Name, OnBudget: request.OnBudget, IsOpen: request.IsOpen, ID: accountUUID, } account, err := h.Service.UpdateAccount(c.Request().Context(), updateParams) if err != nil { return echo.NewHTTPError(http.StatusNotFound, err) } return h.getBudget(c, account.BudgetID) }