Files
reloading-manager/backend/handlers/primers/handler.go
Ron Rise dd383b6fb3
All checks were successful
🧪 ✨ Unit Tests Workflow / 🧪 📜 JavaScript Tests (push) Successful in 7m28s
🧪 ✨ Unit Tests Workflow / 🧪 🐹 GolangCI-Lint (push) Successful in 7m40s
🧪 ✨ Unit Tests Workflow / 🔍 🐹 Go Tests (push) Successful in 10m24s
fix tpyo (#8)
Reviewed-on: Siteworxpro/reloading-manager#8
Co-authored-by: Ron Rise <ron@siteworxpro.com>
Co-committed-by: Ron Rise <ron@siteworxpro.com>
2025-06-10 15:56:03 +00:00

237 lines
5.5 KiB
Go

package primers
import (
"context"
"encoding/json"
"fmt"
"git.siteworxpro.com/reloading-manager/backend/database"
"git.siteworxpro.com/reloading-manager/backend/handlers"
"git.siteworxpro.com/reloading-manager/backend/models/primers"
"github.com/google/uuid"
"github.com/labstack/echo/v4"
"net/http"
)
type PrimerResponse struct {
ID string `json:"id"`
Name string `json:"name"`
Manufacturer handlers.Manufacturer `json:"manufacturer"`
}
func Delete(c echo.Context) error {
db := c.(*database.CustomContext).Db
defer func() {
_ = db.Db.Close(context.Background())
}()
id := c.Param("id")
uid, err := handlers.ParseUuid(id)
if err != nil {
return handlers.BadRequest(c, "Invalid UUID.")
}
err = db.Primer.DeletePrimer(context.Background(), *uid)
if err != nil {
return err
}
return c.JSON(http.StatusNoContent, handlers.Response[string]{})
}
func Post(c echo.Context) error {
db := c.(*database.CustomContext).Db
defer func() {
_ = db.Db.Close(context.Background())
}()
if c.Param("id") != "" {
id := c.Param("id")
uid, err := handlers.ParseUuidOrBadRequest(c, id)
if err != nil || uid == nil {
return echo.NewHTTPError(http.StatusBadRequest, "Invalid UUID.")
}
p, err := db.Primer.GetPrimerById(context.Background(), *uid)
if err != nil {
return handlers.NotFound(c, "Primer not found.")
}
if c.FormValue("name") != "" {
p.Name = c.FormValue("name")
}
if c.FormValue("manufacturer_id") != "" {
mid, err := handlers.ParseUuidOrBadRequest(c, c.FormValue("manufacturer_id"))
if err != nil || mid == nil {
return echo.NewHTTPError(http.StatusBadRequest, "Invalid Manufacturer ID.")
}
p.ManufacturerID = *mid
}
if c.FormValue("meta") != "" {
p.Meta = json.RawMessage(c.Param("meta"))
}
file, _ := c.FormFile("photo")
if file != nil {
photo, err := handlers.ReadFile(c, "photo")
if err != nil {
return err
}
p.Photo = photo
}
err = db.Primer.UpdatePrimer(context.Background(), primers.UpdatePrimerParams{
ID: p.ID,
Name: p.Name,
ManufacturerID: p.ManufacturerID,
Meta: p.Meta,
Photo: p.Photo,
})
if err != nil {
return err
}
return c.JSON(http.StatusOK, handlers.Response[string]{Payload: p.ID.String(), Status: http.StatusText(http.StatusOK)})
}
buf, err := handlers.ReadFile(c, "photo")
if err != nil {
return err
}
name := c.FormValue("name")
manufacturerId := c.FormValue("manufacturer_id")
metaString := c.FormValue("meta")
if name == "" {
return handlers.BadRequest(c, "Name is required.")
}
if manufacturerId == "" {
return handlers.BadRequest(c, "Manufacturer ID is required.")
}
if metaString == "" {
metaString = "{}"
}
meta := []byte(metaString)
newUuid := uuid.New().String()
uid, _ := handlers.ParseUuid(newUuid)
mid, err := handlers.ParseUuidOrBadRequest(c, manufacturerId)
if err != nil || mid == nil {
return echo.NewHTTPError(http.StatusBadRequest, "Invalid Manufacturer ID.")
}
err = db.Primer.InsertPrimer(context.Background(), primers.InsertPrimerParams{
ID: *uid,
Name: name,
ManufacturerID: *mid,
Meta: meta,
Photo: buf,
})
if err != nil {
return err
}
return c.JSON(http.StatusCreated, handlers.Response[struct {
Id string `json:"id"`
}]{
Status: http.StatusText(http.StatusCreated),
Payload: struct {
Id string `json:"id"`
}{Id: newUuid},
})
}
func Photo(c echo.Context) error {
db := c.(*database.CustomContext).Db
defer func() {
_ = db.Db.Close(context.Background())
}()
id := c.Param("id")
uid, err := handlers.ParseUuidOrBadRequest(c, id)
if err != nil || uid == nil {
return echo.NewHTTPError(http.StatusBadRequest, "Invalid UUID.")
}
byId, err := db.Primer.GetPrimerById(context.Background(), *uid)
if err != nil {
return echo.NewHTTPError(http.StatusNotFound, "Not found")
}
mime := http.DetectContentType(byId.Photo)
c.Response().Header().Set("Content-Type", mime)
c.Response().Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
c.Response().Header().Set("Pragma", "no-cache")
c.Response().Header().Set("Expires", "0")
_, err = c.Response().Write(byId.Photo)
return err
}
func Get(c echo.Context) error {
db := c.(*database.CustomContext).Db
defer func() {
_ = db.Db.Close(context.Background())
}()
if c.Param("id") != "" {
id := c.Param("id")
uid, err := handlers.ParseUuidOrBadRequest(c, id)
if err != nil || uid == nil {
return echo.NewHTTPError(http.StatusBadRequest, "Invalid UUID.")
}
row, err := db.Primer.GetPrimerById(context.Background(), *uid)
if err != nil {
return fmt.Errorf("primer not found: %v", err)
}
return c.JSON(http.StatusOK, handlers.Response[PrimerResponse]{
Status: http.StatusText(http.StatusOK),
Payload: PrimerResponse{
ID: row.ID.String(),
Name: row.Name,
Manufacturer: handlers.Manufacturer{
Id: row.ManufacturerID.String(),
Name: row.ManufacturerName,
Url: row.ManufacturerUrl.String,
},
},
})
}
rows, err := db.Primer.GetPrimers(context.Background())
if err != nil {
return err
}
response := handlers.Response[[]PrimerResponse]{
Status: "OK",
Payload: make([]PrimerResponse, 0),
}
for _, row := range rows {
response.Payload = append(response.Payload, PrimerResponse{
ID: row.ID.String(),
Name: row.Name,
Manufacturer: handlers.Manufacturer{
Id: row.ManufacturerID.String(),
Name: row.ManufacturerName,
Url: row.ManufacturerUrl.String,
},
})
}
return c.JSON(http.StatusOK, response)
}