package suggestions import ( "database/sql" "errors" "net/http" "strings" "github.com/go-chi/chi/v5" "gitea.parodia.dev/drwily/petal/internal/db" "gitea.parodia.dev/drwily/petal/internal/llm" ) type translateResponse struct { Translation string `json:"translation"` } // translate renders a suggestion's English explanation into Simplified Chinese // for the Ask Petal bubble, so the ESL reader sees the "why" in her first // language instead of a second copy of the same English text. The explanation is // loaded server-side from the suggestion id (scoped to the local user) and never // trusted from the client, mirroring chat (spec Note #10). func (h *Handler) translate(w http.ResponseWriter, r *http.Request) { sugID := chi.URLParam(r, "id") var explanation string err := h.DB.QueryRow( `SELECT s.explanation FROM suggestions s JOIN documents d ON d.id = s.doc_id WHERE s.id = ? AND d.user_id = ?`, sugID, db.LocalUserID, ).Scan(&explanation) if errors.Is(err, sql.ErrNoRows) { errorJSON(w, http.StatusNotFound, "suggestion not found") return } if err != nil { serverError(w, err) return } explanation = strings.TrimSpace(explanation) if explanation == "" { writeJSON(w, http.StatusOK, translateResponse{Translation: ""}) return } out, err := llm.RunTranslate(r.Context(), h.Client, explanation) if err != nil { errorJSON(w, http.StatusBadGateway, "translate failed: "+err.Error()) return } writeJSON(w, http.StatusOK, translateResponse{Translation: out}) }