package app import ( "encoding/json" "log" "net/http" "strings" ) /* Handlers for processing submission data. */ var formSubmitHandlers = map[string]func(w http.ResponseWriter, r *http.Request, form *Form) error{ /* Save submission to database. */ "save": func(w http.ResponseWriter, r *http.Request, form *Form) error { databaseValues := make(map[string][]string) for _, field := range form.Fields { databaseValues[field.ID] = field.Values } jsonValues, err := json.Marshal(databaseValues) if err != nil { return err } record := FormSubmissionRecord{ CreatedBy: getUserID(r), FormName: form.Name, Data: string(jsonValues), } if err := createFormSubmissionRecord(db, &record); err != nil { return err } return nil }, "add_character": formSubmitAddCharacterSubmit, "save_document": formSubmitSaveDocument, } /* Handle form submit. */ func (f *Form) Submit(w http.ResponseWriter, r *http.Request) (bool, error) { if r.Method != "POST" { return false, nil } log.Printf(" >> submit form %s", f.Name) r.ParseForm() // set values and validate isValid := true for name, values := range r.Form { name, _ = strings.CutSuffix(name, "[]") field := f.GetFieldByName(name) if field != nil { field.Values = values // validate if field.Required { field.Validators = append(field.Validators, "required") } for _, validator := range field.Validators { if formValidators[validator] != nil { if err := formValidators[validator](field.Values, f); err != nil { field.Error = err.Error() isValid = false break } } } } } // run all submit handlers if isValid { for _, handler := range f.SubmitHandlers { if formSubmitHandlers[handler] != nil { log.Printf(" >> run submit handler %s", handler) if err := formSubmitHandlers[handler](w, r, f); err != nil { return true, err } } } } return isValid, nil }