Files
greeneclipse 8580c996c3 Initial commit of Descrybe v2 without local scratch artifacts.
Drop one-shot tmp/axe scripts and agent i18n scratch so the Gitea tree is deployable.
2026-08-09 22:47:43 +02:00

67 lines
1.6 KiB
Go

package httpapi
import (
"errors"
"net/http"
"strings"
"github.com/descrybe/descrybe-v2/apps/api/internal/seo"
"github.com/google/uuid"
)
func (s *Server) handleSEORecommendations(w http.ResponseWriter, r *http.Request) {
cid, ok := CompanyIDFromContext(r.Context())
if !ok || cid == uuid.Nil {
Error(w, http.StatusUnauthorized, "unauthorized")
return
}
if s.SEO == nil {
Error(w, http.StatusServiceUnavailable, "seo service unavailable")
return
}
report, err := s.SEO.Recommendations(r.Context(), cid)
if err != nil {
Error(w, http.StatusInternalServerError, "seo analysis failed")
return
}
JSON(w, http.StatusOK, report)
}
func (s *Server) handleSEOApply(w http.ResponseWriter, r *http.Request) {
cid, ok := CompanyIDFromContext(r.Context())
if !ok || cid == uuid.Nil {
Error(w, http.StatusUnauthorized, "unauthorized")
return
}
if s.SEO == nil {
Error(w, http.StatusServiceUnavailable, "seo service unavailable")
return
}
var body seo.ApplyRequest
if err := DecodeJSON(r, &body); err != nil {
Error(w, http.StatusBadRequest, "invalid json")
return
}
productID, err := uuid.Parse(strings.TrimSpace(body.ProductID))
if err != nil {
Error(w, http.StatusBadRequest, "invalid product_id")
return
}
result, err := s.SEO.Apply(r.Context(), cid, productID, body.Mode)
if err != nil {
switch {
case writePlanGate(w, err):
return
case errors.Is(err, seo.ErrNotFound):
Error(w, http.StatusNotFound, "not found")
return
default:
ClientOrLog(w, http.StatusBadRequest, "seo apply failed", err, seo.ClientError)
return
}
}
JSON(w, http.StatusOK, result)
}