You've already forked reloading-manager
No changes made
This commit is contained in:
215
backend/handlers/loads/handler.go
Normal file
215
backend/handlers/loads/handler.go
Normal file
@@ -0,0 +1,215 @@
|
||||
package loads
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.s.int/reloading-manager/backend/database"
|
||||
"git.s.int/reloading-manager/backend/handlers"
|
||||
"git.s.int/reloading-manager/backend/handlers/bullets"
|
||||
"git.s.int/reloading-manager/backend/handlers/primers"
|
||||
"git.s.int/reloading-manager/backend/models/loads"
|
||||
"github.com/labstack/echo/v4"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type loadResponseResults struct {
|
||||
Id string `json:"id"`
|
||||
Cartridge string `json:"cartridge"`
|
||||
Col float32 `json:"col"`
|
||||
Powder handlers.Powder `json:"powder"`
|
||||
PowderGr float32 `json:"powder_gr"`
|
||||
Primer primers.PrimerResponse `json:"primer"`
|
||||
Bullet bullets.BulletResponse `json:"bullet"`
|
||||
}
|
||||
|
||||
type loadResponse struct {
|
||||
Total int `json:"total"`
|
||||
Results []loadResponseResults `json:"results"`
|
||||
}
|
||||
|
||||
type ResultChan[T any] struct {
|
||||
Result T
|
||||
Err error
|
||||
}
|
||||
|
||||
func Post(c echo.Context) error {
|
||||
db := c.(*database.CustomContext).Db
|
||||
defer db.Db.Close(context.Background())
|
||||
|
||||
cartridgeID, err := handlers.ParseUuid(c.FormValue("cartridge_id"))
|
||||
if err != nil {
|
||||
return handlers.BadRequest(c, "cartridge_id is not a valid UUID")
|
||||
}
|
||||
|
||||
powderId, err := handlers.ParseUuid(c.FormValue("powder_id"))
|
||||
if err != nil {
|
||||
return handlers.BadRequest(c, "powder_id is not a valid UUID")
|
||||
}
|
||||
|
||||
primerId, err := handlers.ParseUuid(c.FormValue("primer_id"))
|
||||
if err != nil {
|
||||
return handlers.BadRequest(c, "primer_id is not a valid UUID")
|
||||
}
|
||||
|
||||
bulletId, err := handlers.ParseUuid(c.FormValue("bullet_id"))
|
||||
if err != nil {
|
||||
return handlers.BadRequest(c, "bullet_id is not a valid UUID")
|
||||
}
|
||||
|
||||
file, err := handlers.ReadFile(c, "photo")
|
||||
if err != nil {
|
||||
return handlers.BadRequest(c, "photo is not valid")
|
||||
}
|
||||
|
||||
meta := c.FormValue("meta")
|
||||
if meta == "" {
|
||||
meta = "{}"
|
||||
}
|
||||
|
||||
powderGr := c.FormValue("powder_gr")
|
||||
if powderGr == "" {
|
||||
return handlers.BadRequest(c, "powder_gr is not valid")
|
||||
}
|
||||
|
||||
powderGrFl, err := handlers.ParseFloat32(powderGr)
|
||||
if err != nil {
|
||||
return handlers.BadRequest(c, "powder_gr is not valid")
|
||||
}
|
||||
|
||||
col := c.FormValue("col")
|
||||
if col == "" {
|
||||
return handlers.BadRequest(c, "col is not valid")
|
||||
}
|
||||
colFl, err := handlers.ParseFloat32(col)
|
||||
if err != nil {
|
||||
return handlers.BadRequest(c, "col is not valid")
|
||||
}
|
||||
|
||||
uid, err := db.Loads.CreateLoad(context.Background(), loads.CreateLoadParams{
|
||||
CartridgeID: *cartridgeID,
|
||||
Col: colFl,
|
||||
PowderID: *powderId,
|
||||
PowderGr: powderGrFl,
|
||||
PrimerID: *primerId,
|
||||
BulletID: *bulletId,
|
||||
Photo: file,
|
||||
Meta: []byte(meta),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusCreated, handlers.Response[string]{Payload: uid.String()})
|
||||
}
|
||||
|
||||
func Get(c echo.Context) error {
|
||||
db := c.(*database.CustomContext).Db
|
||||
defer db.Db.Close(context.Background())
|
||||
|
||||
cTotal := make(chan ResultChan[int64])
|
||||
cResults := make(chan ResultChan[[]loadResponseResults])
|
||||
|
||||
go func(c chan ResultChan[int64]) {
|
||||
db := database.GetNewDatabase()
|
||||
defer db.Db.Close(context.Background())
|
||||
|
||||
total, err := db.Loads.TotalLoads(context.Background())
|
||||
|
||||
if err != nil {
|
||||
c <- ResultChan[int64]{Err: err}
|
||||
} else {
|
||||
c <- ResultChan[int64]{Result: total}
|
||||
}
|
||||
|
||||
}(cTotal)
|
||||
|
||||
go func(ch chan ResultChan[[]loadResponseResults]) {
|
||||
|
||||
rows, err := db.Loads.GetLoads(context.Background(), loads.GetLoadsParams{
|
||||
Limit: handlers.ParseInt32WithDefault(c.QueryParam("limit"), 50),
|
||||
Offset: handlers.ParseInt32WithDefault(c.QueryParam("offset"), 0),
|
||||
|
||||
OrderBy: "cartridge_name asc",
|
||||
|
||||
SearchCartridge: c.QueryParam("search_cartridge") != "",
|
||||
Cartridge: c.QueryParam("search_cartridge"),
|
||||
SearchBullet: c.QueryParam("search_bullet") != "",
|
||||
Bullet: c.QueryParam("search_bullet") + "%",
|
||||
SearchBulletManufacturer: c.QueryParam("search_bullet_manufacturer") != "",
|
||||
BulletManufacturer: c.QueryParam("search_bullet_manufacturer") + "%",
|
||||
SearchPrimer: c.QueryParam("search_primer") != "",
|
||||
Primer: c.QueryParam("search_primer") + "%",
|
||||
SearchPrimerManufacturer: c.QueryParam("search_primer_manufacturer") != "",
|
||||
PrimeManufacturer: c.QueryParam("search_primer_manufacturer") + "%",
|
||||
SearchPowder: c.QueryParam("search_powder") != "",
|
||||
Powder: c.QueryParam("search_powder") + "%",
|
||||
SearchPowderManufacturer: c.QueryParam("search_powder_manufacturer") != "",
|
||||
PowderManufacturer: c.QueryParam("search_powder_manufacturer") + "%",
|
||||
|
||||
SearchCartridgeID: c.QueryParam("search_cartridge_id") != "",
|
||||
CartridgeID: *handlers.ParseUuidOrEmpty(c.QueryParam("search_cartridge_id")),
|
||||
SearchBulletID: c.QueryParam("search_bullet_id") != "",
|
||||
BulletID: *handlers.ParseUuidOrEmpty(c.QueryParam("search_bullet_id")),
|
||||
SearchPrimerID: c.QueryParam("search_primer_id") != "",
|
||||
PrimerID: *handlers.ParseUuidOrEmpty(c.QueryParam("search_primer_id")),
|
||||
SearchPowderID: c.QueryParam("search_powder_id") != "",
|
||||
PowderID: *handlers.ParseUuidOrEmpty(c.QueryParam("search_powder_id")),
|
||||
})
|
||||
if err != nil {
|
||||
ch <- ResultChan[[]loadResponseResults]{Err: err}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
results := make([]loadResponseResults, 0)
|
||||
for _, row := range rows {
|
||||
results = append(results, loadResponseResults{
|
||||
Id: row.ID.String(),
|
||||
Cartridge: row.CartridgeName,
|
||||
Col: row.Col,
|
||||
Powder: handlers.Powder{
|
||||
Id: row.PowderID.String(),
|
||||
Name: row.PowderName,
|
||||
Meta: string(row.PowderMeta),
|
||||
Manufacturer: handlers.Manufacturer{
|
||||
Name: row.PowderManufacturerName,
|
||||
Url: row.PowderManufacturerUrl.String,
|
||||
},
|
||||
},
|
||||
PowderGr: row.PowderGr,
|
||||
Primer: primers.PrimerResponse{
|
||||
ID: row.PrimerID.String(),
|
||||
Name: row.PrimerName,
|
||||
Manufacturer: handlers.Manufacturer{
|
||||
Name: row.PrimerManufacturerName,
|
||||
Url: row.PrimerManufacturerUrl.String,
|
||||
},
|
||||
},
|
||||
Bullet: bullets.BulletResponse{
|
||||
Id: row.BulletID.String(),
|
||||
Name: row.BulletName,
|
||||
Diameter: row.BulletDiameter,
|
||||
Weight: row.BulletWeight,
|
||||
Manufacturer: handlers.Manufacturer{
|
||||
Name: row.BulletManufacturerName,
|
||||
Url: row.BulletManufacturerUrl.String,
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
ch <- ResultChan[[]loadResponseResults]{Result: results}
|
||||
}(cResults)
|
||||
|
||||
total := <-cTotal
|
||||
if total.Err != nil {
|
||||
return total.Err
|
||||
}
|
||||
|
||||
results := <-cResults
|
||||
if results.Err != nil {
|
||||
return results.Err
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, handlers.Response[loadResponse]{Status: http.StatusText(http.StatusOK), Payload: loadResponse{Total: int(total.Result), Results: results.Result}})
|
||||
}
|
||||
Reference in New Issue
Block a user