More management tools
This commit is contained in:
@@ -536,25 +536,41 @@ func handleQueryUpdate(w http.ResponseWriter, r *http.Request, db *bun.DB, req Q
|
||||
return
|
||||
}
|
||||
|
||||
// Convert data map to model
|
||||
dataJSON, err := json.Marshal(req.Data)
|
||||
if err != nil {
|
||||
http.Error(w, "Invalid data", http.StatusBadRequest)
|
||||
if req.Data == nil || len(req.Data) == 0 {
|
||||
http.Error(w, "No update data provided", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(dataJSON, model); err != nil {
|
||||
http.Error(w, "Invalid data format", http.StatusBadRequest)
|
||||
updateQuery := db.NewUpdate().Model(model).Where("id = ?", req.ID)
|
||||
updatedColumns := 0
|
||||
|
||||
for column, value := range req.Data {
|
||||
// Protect immutable/audit columns from accidental overwrite.
|
||||
if column == "id" || column == "created_at" {
|
||||
continue
|
||||
}
|
||||
updateQuery = updateQuery.Set("? = ?", bun.Ident(column), value)
|
||||
updatedColumns++
|
||||
}
|
||||
|
||||
if updatedColumns == 0 {
|
||||
http.Error(w, "No mutable fields to update", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Update in database
|
||||
_, err = db.NewUpdate().Model(model).Where("id = ?", req.ID).Exec(r.Context())
|
||||
// Update only the provided fields.
|
||||
_, err := updateQuery.Exec(r.Context())
|
||||
if err != nil {
|
||||
http.Error(w, fmt.Sprintf("Update failed: %v", err), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Return the latest database row after update.
|
||||
if err := db.NewSelect().Model(model).Where("id = ?", req.ID).Scan(r.Context()); err != nil {
|
||||
http.Error(w, fmt.Sprintf("Update succeeded but reload failed: %v", err), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
writeJSON(w, http.StatusOK, model)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user