75 lines
2.3 KiB
Go
75 lines
2.3 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
"workorders/internal/model"
|
|
)
|
|
|
|
type ResourceHandler struct{ db *sqlx.DB }
|
|
|
|
func NewResourceHandler(db *sqlx.DB) *ResourceHandler { return &ResourceHandler{db: db} }
|
|
|
|
func (h *ResourceHandler) List(w http.ResponseWriter, r *http.Request) {
|
|
woID, err := intParam(r, "id")
|
|
if err != nil {
|
|
respondError(w, http.StatusBadRequest, "invalid id")
|
|
return
|
|
}
|
|
var rows []model.AssignedResource
|
|
err = h.db.Select(&rows, `
|
|
SELECT r.id, r.wo_id, r.resource_type, r.resource_id, r.quantity, r.notes, r.assigned_at,
|
|
ISNULL(p.name, ISNULL(v.unit_number, ISNULL(e.name, m.name))) AS name
|
|
FROM wo_resources r
|
|
LEFT JOIN resource_people p ON r.resource_type='person' AND r.resource_id=p.id
|
|
LEFT JOIN resource_vehicles v ON r.resource_type='vehicle' AND r.resource_id=v.id
|
|
LEFT JOIN resource_equipment e ON r.resource_type='equipment' AND r.resource_id=e.id
|
|
LEFT JOIN resource_materials m ON r.resource_type='material' AND r.resource_id=m.id
|
|
WHERE r.wo_id=@p1`, woID)
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, err.Error())
|
|
return
|
|
}
|
|
respond(w, http.StatusOK, rows)
|
|
}
|
|
|
|
func (h *ResourceHandler) Assign(w http.ResponseWriter, r *http.Request) {
|
|
woID, err := intParam(r, "id")
|
|
if err != nil {
|
|
respondError(w, http.StatusBadRequest, "invalid id")
|
|
return
|
|
}
|
|
var body struct {
|
|
ResourceType string `json:"resource_type"`
|
|
ResourceID int `json:"resource_id"`
|
|
Quantity *float64 `json:"quantity"`
|
|
Notes string `json:"notes"`
|
|
}
|
|
if err := decode(r, &body); err != nil {
|
|
respondError(w, http.StatusBadRequest, "invalid body")
|
|
return
|
|
}
|
|
var rid int
|
|
err = h.db.QueryRow(`
|
|
INSERT INTO wo_resources (wo_id,resource_type,resource_id,quantity,notes)
|
|
OUTPUT INSERTED.id VALUES (@p1,@p2,@p3,@p4,@p5)`,
|
|
woID, body.ResourceType, body.ResourceID, body.Quantity, body.Notes,
|
|
).Scan(&rid)
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, err.Error())
|
|
return
|
|
}
|
|
respond(w, http.StatusCreated, map[string]any{"id": rid})
|
|
}
|
|
|
|
func (h *ResourceHandler) Remove(w http.ResponseWriter, r *http.Request) {
|
|
rid, err := intParam(r, "rid")
|
|
if err != nil {
|
|
respondError(w, http.StatusBadRequest, "invalid rid")
|
|
return
|
|
}
|
|
h.db.Exec(`DELETE FROM wo_resources WHERE id=@p1`, rid)
|
|
respond(w, http.StatusOK, map[string]any{"deleted": rid})
|
|
}
|