package http import ( "encoding/json" "fmt" "net/http" "strings" "time" "git.javil.eu/jacob1123/budgeteer/postgres" "github.com/gin-gonic/gin" "github.com/google/uuid" ) type NewTransactionPayload struct { Date JSONDate `json:"date"` Payee struct { ID uuid.NullUUID Name string } `json:"payee"` Category struct { ID uuid.NullUUID Name string } `json:"category"` Memo string `json:"memo"` Amount string `json:"amount"` BudgetID uuid.UUID `json:"budget_id"` } type JSONDate time.Time // Implement Marshaler and Unmarshaler interface func (j *JSONDate) UnmarshalJSON(b []byte) error { s := strings.Trim(string(b), "\"") t, err := time.Parse("2006-01-02", s) if err != nil { return err } *j = JSONDate(t) return nil } func (j JSONDate) MarshalJSON() ([]byte, error) { return json.Marshal(time.Time(j)) } // Maybe a Format function for printing your date func (j JSONDate) Format(s string) string { t := time.Time(j) return t.Format(s) } func (h *Handler) newTransaction(c *gin.Context) { var payload NewTransactionPayload err := c.BindJSON(&payload) if err != nil { c.AbortWithError(http.StatusInternalServerError, err) return } fmt.Printf("%v\n", payload) /* c.JSON(http.StatusOK, payload)*/ return transactionMemo, _ := c.GetPostForm("memo") transactionAccountID, err := getUUID(c, "account_id") if err != nil { c.AbortWithError(http.StatusNotAcceptable, fmt.Errorf("account_id: %w", err)) return } transactionCategoryID, err := getNullUUIDFromForm(c, "category_id") if err != nil { c.AbortWithError(http.StatusNotAcceptable, fmt.Errorf("category_id: %w", err)) return } transactionPayeeID, err := getNullUUIDFromForm(c, "payee_id") if err != nil { c.AbortWithError(http.StatusNotAcceptable, fmt.Errorf("payee_id: %w", err)) return } transactionDate, succ := c.GetPostForm("date") if !succ { c.AbortWithError(http.StatusNotAcceptable, fmt.Errorf("date missing")) return } transactionDateValue, err := time.Parse("2006-01-02", transactionDate) if err != nil { c.AbortWithError(http.StatusNotAcceptable, fmt.Errorf("date is not a valid date")) return } transactionAmount, succ := c.GetPostForm("amount") if !succ { c.AbortWithError(http.StatusNotAcceptable, fmt.Errorf("amount missing")) return } amount := postgres.Numeric{} amount.Set(transactionAmount) transactionUUID, err := getNullUUIDFromParam(c, "transactionid") if err != nil { c.AbortWithError(http.StatusInternalServerError, fmt.Errorf("parse transaction id: %w", err)) return } if !transactionUUID.Valid { new := postgres.CreateTransactionParams{ Memo: transactionMemo, Date: transactionDateValue, Amount: amount, AccountID: transactionAccountID, PayeeID: transactionPayeeID, CategoryID: transactionCategoryID, } _, err = h.Service.CreateTransaction(c.Request.Context(), new) if err != nil { c.AbortWithError(http.StatusInternalServerError, fmt.Errorf("create transaction: %w", err)) } return } _, delete := c.GetPostForm("delete") if delete { err = h.Service.DeleteTransaction(c.Request.Context(), transactionUUID.UUID) if err != nil { c.AbortWithError(http.StatusInternalServerError, fmt.Errorf("delete transaction: %w", err)) } return } update := postgres.UpdateTransactionParams{ ID: transactionUUID.UUID, Memo: transactionMemo, Date: transactionDateValue, Amount: amount, AccountID: transactionAccountID, PayeeID: transactionPayeeID, CategoryID: transactionCategoryID, } err = h.Service.UpdateTransaction(c.Request.Context(), update) if err != nil { c.AbortWithError(http.StatusInternalServerError, fmt.Errorf("update transaction: %w", err)) } }