package http import ( "fmt" "net/http" "time" "git.javil.eu/jacob1123/budgeteer/postgres" "github.com/gin-gonic/gin" "github.com/google/uuid" ) func getUUID(c *gin.Context, name string) (uuid.UUID, error) { value, succ := c.GetPostForm(name) if !succ { return uuid.UUID{}, fmt.Errorf("not set") } id, err := uuid.Parse(value) if err != nil { return uuid.UUID{}, fmt.Errorf("not a valid uuid: %w", err) } return id, nil } func getNullUUID(c *gin.Context, name string) (uuid.NullUUID, error) { value, succ := c.GetPostForm(name) if !succ { return uuid.NullUUID{}, nil } id, err := uuid.Parse(value) if err != nil { return uuid.NullUUID{}, fmt.Errorf("not a valid uuid: %w", err) } return uuid.NullUUID{ UUID: id, Valid: true, }, nil } func (h *Handler) newTransaction(c *gin.Context) { transactionMemo, _ := c.GetPostForm("memo") transactionAccountID, err := getUUID(c, "account_id") if err != nil { c.AbortWithError(http.StatusNotAcceptable, err) return } transactionCategoryID, err := getNullUUID(c, "category_id") if err != nil { c.AbortWithError(http.StatusNotAcceptable, 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) new := postgres.CreateTransactionParams{ Memo: transactionMemo, Date: transactionDateValue, Amount: amount, AccountID: transactionAccountID, PayeeID: uuid.NullUUID{}, CategoryID: transactionCategoryID, } _, err = h.Service.CreateTransaction(c.Request.Context(), new) if err != nil { c.AbortWithError(http.StatusInternalServerError, fmt.Errorf("create transaction: %w", err)) return } }