119 lines
2.9 KiB
Go
119 lines
2.9 KiB
Go
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)
|
|
return
|
|
|
|
transactionAccountID, err := getUUID(c, "account_id")
|
|
if err != nil {
|
|
c.AbortWithError(http.StatusNotAcceptable, fmt.Errorf("account_id: %w", err))
|
|
return
|
|
}
|
|
|
|
amount := postgres.Numeric{}
|
|
amount.Set(payload.Amount)
|
|
|
|
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: payload.Memo,
|
|
Date: time.Time(payload.Date),
|
|
Amount: amount,
|
|
AccountID: transactionAccountID,
|
|
PayeeID: payload.Payee.ID, //TODO handle new payee
|
|
CategoryID: payload.Category.ID, //TODO handle new category
|
|
}
|
|
_, 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: payload.Memo,
|
|
Date: time.Time(payload.Date),
|
|
Amount: amount,
|
|
AccountID: transactionAccountID,
|
|
PayeeID: payload.Payee.ID, //TODO handle new payee
|
|
CategoryID: payload.Category.ID, //TODO handle new category
|
|
}
|
|
err = h.Service.UpdateTransaction(c.Request.Context(), update)
|
|
if err != nil {
|
|
c.AbortWithError(http.StatusInternalServerError, fmt.Errorf("update transaction: %w", err))
|
|
}
|
|
}
|