package handlers import ( "encoding/csv" "io" "net/http" "git.agecem.com/agecem/bottin/v5/data" "git.agecem.com/agecem/bottin/v5/models" "git.agecem.com/agecem/bottin/v5/responses" "github.com/labstack/echo/v4" "github.com/gocarina/gocsv" ) func PostMembres(c echo.Context) error { var response responses.PostMembresResponse client, err := data.NewDataClientFromViper() if err != nil { response.StatusCode = http.StatusInternalServerError response.Message = "Could not establish database connection" response.Error = err.Error() return c.JSON(response.StatusCode, response) } defer client.DB.Close() var membres []models.Membre switch c.Request().Header.Get("Content-Type") { case "application/json": if err := c.Bind(&membres); err != nil { response.StatusCode = http.StatusBadRequest response.Message = "Could not bind membres" response.Error = err.Error() return c.JSON(response.StatusCode, response) } case "text/csv": body := c.Request().Body if body == nil { response.StatusCode = http.StatusBadRequest response.Message = "Request body is empty" return c.JSON(response.StatusCode, response) } defer body.Close() // Parse the CSV data from the request body using gocsv. if err := gocsv.Unmarshal(body, &membres); err != nil { response.StatusCode = http.StatusBadRequest response.Message = "Could not unmarshal into membres" response.Error = err.Error() return c.JSON(response.StatusCode, response) } default: response.StatusCode = http.StatusBadRequest response.Message = "Invalid Content-Type" return c.JSON(response.StatusCode, response) } if len(membres) == 0 { response.StatusCode = http.StatusOK response.Message = "Nothing to do" return c.JSON(response.StatusCode, response) } newMembres, err := client.InsertMembres(membres) if err != nil { response.StatusCode = http.StatusInternalServerError response.Message = "Could not insert membres" response.Error = err.Error() return c.JSON(response.StatusCode, response) } response.StatusCode = http.StatusCreated response.Message = "Insert successful" response.Data.MembresInserted = newMembres return c.JSON(response.StatusCode, response) } func PostProgrammes(c echo.Context) error { var response responses.PostProgrammesResponse client, err := data.NewDataClientFromViper() if err != nil { response.StatusCode = http.StatusInternalServerError response.Message = "Could not establish database connection" response.Error = err.Error() return c.JSON(response.StatusCode, response) } defer client.DB.Close() var programmes []models.Programme switch c.Request().Header.Get("Content-Type") { case "application/json": if err := c.Bind(&programmes); err != nil { response.StatusCode = http.StatusBadRequest response.Message = "Could not bind programmes" response.Error = err.Error() return c.JSON(response.StatusCode, response) } case "text/csv": body := c.Request().Body if body == nil { response.StatusCode = http.StatusBadRequest response.Message = "Request body is empty" return c.JSON(response.StatusCode, response) } defer body.Close() gocsv.SetCSVReader(func(in io.Reader) gocsv.CSVReader { r := csv.NewReader(in) r.Comma = ';' return r // Allows use ; as delimiter }) // Parse the CSV data from the request body using gocsv. if err := gocsv.Unmarshal(body, &programmes); err != nil { response.StatusCode = http.StatusBadRequest response.Message = "Could not unmarshal into programmes" response.Error = err.Error() return c.JSON(response.StatusCode, response) } default: response.StatusCode = http.StatusBadRequest response.Message = "Invalid Content-Type" return c.JSON(response.StatusCode, response) } if len(programmes) == 0 { response.StatusCode = http.StatusOK response.Message = "Nothing to do" return c.JSON(response.StatusCode, response) } newProgrammes, err := client.InsertProgrammes(programmes) if err != nil { response.StatusCode = http.StatusInternalServerError response.Message = "Could not insert programmes" response.Error = err.Error() return c.JSON(response.StatusCode, response) } response.StatusCode = http.StatusCreated response.Message = "Insert successful" response.Data.ProgrammesInserted = newProgrammes return c.JSON(response.StatusCode, response) }