Files
budget-backend/internal/jointexpense/handler.go
kratisto a9bca767a9
Some checks failed
golangci-lint / lint (push) Failing after 1m20s
Test / test (push) Failing after 2m15s
chore: migrate to gitea
2026-01-27 00:40:46 +01:00

134 lines
4.1 KiB
Go

package jointexpense
import (
"encoding/csv"
"net/http"
"time"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/handler"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/internal/jointaccount"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/internal/storage/dao/postgresql"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/internal/storage/model"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/internal/storage/validators"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/internal/utils"
"github.com/gin-gonic/gin"
)
type Context struct {
service *Service
db *Database
jointaccountService *jointaccount.Service
*handler.Context
}
func (c *Context) ImportJointexpenseFromCSV(gc *gin.Context) {
}
func (c *Context) CreateAnJointexpense(gc *gin.Context) {
jointaccountID := gc.Param("jointaccountId")
userId := gc.Param("userId")
csvHeaderFile, err := gc.FormFile("attachment")
if err != nil {
utils.GetLogger().Info(err)
utils.JSONErrorWithMessage(gc.Writer, model.ErrInternalServer, err.Error())
return
}
if err == nil {
csvFile, err := csvHeaderFile.Open()
if err != nil {
utils.GetLogger().Info(err)
utils.JSONErrorWithMessage(gc.Writer, model.ErrInternalServer, err.Error())
return
}
csvr := csv.NewReader(csvFile)
csvr.FieldsPerRecord = -1
csvr.Comma = ';'
filedata, err := csvr.ReadAll()
jointaccount, err := c.jointaccountService.GetASpecificJointaccountForUser(userId, jointaccountID)
if err != nil {
utils.GetLogger().Info(err)
utils.JSONErrorWithMessage(gc.Writer, model.ErrInternalServer, err.Error())
return
}
err = c.service.ProcessCSVFile(filedata, jointaccount)
if err != nil {
utils.JSONErrorWithMessage(gc.Writer, model.ErrInternalServer, err.Error())
return
}
return
}
var jointexpense Jointexpense
var jointexpenseEditable JointexpenseEditable
if err := gc.BindJSON(&jointexpenseEditable); err != nil {
utils.JSONError(gc.Writer, validators.NewDataValidationAPIError(err))
return
}
jointexpense = Jointexpense{JointexpenseEditable: jointexpenseEditable, JointaccountId: jointaccountID}
err = c.service.CreateJointexpense(&jointexpense)
if err != nil {
utils.GetLogger().Info(err)
utils.JSONErrorWithMessage(gc.Writer, model.ErrInternalServer, err.Error())
return
}
utils.JSON(gc.Writer, http.StatusCreated, jointexpense)
}
func (c *Context) DeleteJointexpense(gc *gin.Context) {
}
func (c *Context) GetAllJointexpenses(gc *gin.Context) {
jointaccountId := gc.Param("jointaccountId")
from := gc.Query("from")
to := gc.Query("to")
var jointexpenses []*Jointexpense
var err error
if from != "" || to != "" {
if to == "" {
fromParsed, err := time.Parse("2006-01-02", from)
if err == nil {
to = time.Now().Format("2006-01-02")
} else {
to = fromParsed.AddDate(0, 1, 0).Format("2006-01-02")
}
}
if from == "" {
toParsed, err := time.Parse("2006-01-02", to)
if err == nil {
from = "1900-01-01"
} else {
from = toParsed.AddDate(0, -1, 0).Format("2006-01-02")
}
}
jointexpenses, err = c.service.GetJointexpensesOfAnJointaccountBetween(jointaccountId, from, to)
} else {
jointexpenses, err = c.service.GetAllJointexpensesOfAnJointaccount(jointaccountId)
}
if e, ok := err.(*model.APIError); ok {
utils.GetLoggerFromCtx(gc).WithError(err).WithField("type", e.Type).Error("error GetAllJointexpenses: get jointexpenses")
utils.JSONErrorWithMessage(gc.Writer, *e, e.Description)
} else if err != nil {
utils.GetLoggerFromCtx(gc).WithError(err).Error("error while get jointexpenses")
utils.JSONError(gc.Writer, model.ErrInternalServer)
return
}
if len(jointexpenses) == 0 {
utils.JSON(gc.Writer, http.StatusNoContent, nil)
} else {
utils.JSON(gc.Writer, http.StatusOK, jointexpenses)
}
}
func (c *Context) GetAnJointexpenses(context *gin.Context) {
}
func NewHandler(ctx *handler.Context, db *postgresql.DatabasePostgreSQL) *Context {
database := NewDatabase(db)
service := NewService(database)
jointaccountService := jointaccount.NewService(jointaccount.NewDatabase(db))
return &Context{service: service, db: database, jointaccountService: jointaccountService, Context: ctx}
}