Files
Gardomatic/internal/web/care_instructions.go
kleiax 904d14b64c
CI / test (push) Canceled after 0s
Initial commit
2026-09-12 22:22:17 +02:00

94 lines
2.7 KiB
Go

package web
import (
"gardomatic.kleiax.de/lib/client"
"net/http"
"strings"
)
type careInstructionForm struct {
Text string `form:"text"`
Status string `form:"status"`
}
func (app *application) careInstructionSave(w http.ResponseWriter, r *http.Request) {
gardenID, e := app.readPathID(r, "gardenID")
if e != nil {
app.notFound(w)
return
}
speciesID, e := app.readPathID(r, "speciesID")
if e != nil {
app.notFound(w)
return
}
var form careInstructionForm
if e = app.decodePostForm(r, &form); e != nil {
app.clientError(w, http.StatusBadRequest)
return
}
form.Text = strings.TrimSpace(form.Text)
if form.Status == "" {
form.Status = "untested"
}
input := client.CareInstructionInput{Text: &form.Text, Status: &form.Status}
instructionID, _ := app.readPathID(r, "instructionID")
if instructionID > 0 {
_, _, e = client.FromContext(r.Context()).UpdateCareInstruction(r.Context(), gardenID, speciesID, instructionID, input)
} else {
_, _, e = client.FromContext(r.Context()).CreateCareInstruction(r.Context(), gardenID, speciesID, input)
}
if e != nil {
app.handleAPIError(w, r, e)
return
}
if r.Header.Get("HX-Request") == "true" {
apiClient := client.FromContext(r.Context())
instructions, _, loadErr := apiClient.CareInstructions(r.Context(), gardenID, speciesID)
if loadErr != nil {
app.handleAPIError(w, r, loadErr)
return
}
data := app.newTemplateData(r)
garden, _, loadErr := apiClient.Garden(r.Context(), gardenID)
if loadErr != nil {
app.handleAPIError(w, r, loadErr)
return
}
species, _, loadErr := apiClient.Species(r.Context(), gardenID, speciesID)
if loadErr != nil {
app.handleAPIError(w, r, loadErr)
return
}
data.Garden = &garden
data.SpeciesID = speciesID
data.SpeciesGlobal = species.GardenID == nil
data.CareInstructions = instructions
app.renderTemplate(w, http.StatusOK, "species_form.tmpl", "care_instruction_list", data)
return
}
http.Redirect(w, r, pathWithQuery(webPath("species.edit", gardenID, speciesID), "step", "care"), http.StatusSeeOther)
}
func (app *application) careInstructionDelete(w http.ResponseWriter, r *http.Request) {
gardenID, e := app.readPathID(r, "gardenID")
if e != nil {
app.notFound(w)
return
}
speciesID, e := app.readPathID(r, "speciesID")
if e != nil {
app.notFound(w)
return
}
instructionID, e := app.readPathID(r, "instructionID")
if e != nil {
app.notFound(w)
return
}
if _, e = client.FromContext(r.Context()).DeleteCareInstruction(r.Context(), gardenID, speciesID, instructionID); e != nil {
app.handleAPIError(w, r, e)
return
}
http.Redirect(w, r, pathWithQuery(webPath("species.edit", gardenID, speciesID), "step", "care"), http.StatusSeeOther)
}