feat: implement AI gateway phase one runtime
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
package httpapi
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
|
||||
)
|
||||
|
||||
func (s *Server) listPricingRuleSets(w http.ResponseWriter, r *http.Request) {
|
||||
items, err := s.store.ListPricingRuleSets(r.Context())
|
||||
if err != nil {
|
||||
s.logger.Error("list pricing rule sets failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "list pricing rule sets failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, map[string]any{"items": items})
|
||||
}
|
||||
|
||||
func (s *Server) createPricingRuleSet(w http.ResponseWriter, r *http.Request) {
|
||||
var input store.PricingRuleSetInput
|
||||
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
||||
writeError(w, http.StatusBadRequest, "invalid json body")
|
||||
return
|
||||
}
|
||||
if !validPricingRuleSetInput(input) {
|
||||
writeError(w, http.StatusBadRequest, "ruleSetKey, name and at least one rule are required")
|
||||
return
|
||||
}
|
||||
item, err := s.store.CreatePricingRuleSet(r.Context(), input)
|
||||
if err != nil {
|
||||
if store.IsUniqueViolation(err) {
|
||||
writeError(w, http.StatusConflict, "pricing rule set key already exists")
|
||||
return
|
||||
}
|
||||
s.logger.Error("create pricing rule set failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "create pricing rule set failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusCreated, item)
|
||||
}
|
||||
|
||||
func (s *Server) updatePricingRuleSet(w http.ResponseWriter, r *http.Request) {
|
||||
var input store.PricingRuleSetInput
|
||||
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
||||
writeError(w, http.StatusBadRequest, "invalid json body")
|
||||
return
|
||||
}
|
||||
if !validPricingRuleSetInput(input) {
|
||||
writeError(w, http.StatusBadRequest, "ruleSetKey, name and at least one rule are required")
|
||||
return
|
||||
}
|
||||
item, err := s.store.UpdatePricingRuleSet(r.Context(), r.PathValue("ruleSetID"), input)
|
||||
if err != nil {
|
||||
if store.IsNotFound(err) {
|
||||
writeError(w, http.StatusNotFound, "pricing rule set not found")
|
||||
return
|
||||
}
|
||||
if store.IsUniqueViolation(err) {
|
||||
writeError(w, http.StatusConflict, "pricing rule set key already exists")
|
||||
return
|
||||
}
|
||||
s.logger.Error("update pricing rule set failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "update pricing rule set failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, item)
|
||||
}
|
||||
|
||||
func (s *Server) deletePricingRuleSet(w http.ResponseWriter, r *http.Request) {
|
||||
if err := s.store.DeletePricingRuleSet(r.Context(), r.PathValue("ruleSetID")); err != nil {
|
||||
if store.IsNotFound(err) {
|
||||
writeError(w, http.StatusNotFound, "pricing rule set not found")
|
||||
return
|
||||
}
|
||||
s.logger.Error("delete pricing rule set failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "delete pricing rule set failed")
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func validPricingRuleSetInput(input store.PricingRuleSetInput) bool {
|
||||
if strings.TrimSpace(input.RuleSetKey) == "" || strings.TrimSpace(input.Name) == "" || len(input.Rules) == 0 {
|
||||
return false
|
||||
}
|
||||
for _, rule := range input.Rules {
|
||||
if strings.TrimSpace(rule.ResourceType) == "" || strings.TrimSpace(rule.Unit) == "" {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
Reference in New Issue
Block a user