151 lines
5.1 KiB
Go
151 lines
5.1 KiB
Go
package httpapi
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
|
|
)
|
|
|
|
func (s *Server) listFileStorageChannels(w http.ResponseWriter, r *http.Request) {
|
|
items, err := s.store.ListFileStorageChannels(r.Context())
|
|
if err != nil {
|
|
s.logger.Error("list file storage channels failed", "error", err)
|
|
writeError(w, http.StatusInternalServerError, "list file storage channels failed")
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, map[string]any{"items": items})
|
|
}
|
|
|
|
func (s *Server) getFileStorageSettings(w http.ResponseWriter, r *http.Request) {
|
|
settings, err := s.store.GetFileStorageSettings(r.Context())
|
|
if err != nil {
|
|
if store.IsUndefinedDatabaseObject(err) {
|
|
writeJSON(w, http.StatusOK, store.DefaultFileStorageSettings())
|
|
return
|
|
}
|
|
s.logger.Error("get file storage settings failed", "error", err)
|
|
writeError(w, http.StatusInternalServerError, "get file storage settings failed")
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, settings)
|
|
}
|
|
|
|
func (s *Server) updateFileStorageSettings(w http.ResponseWriter, r *http.Request) {
|
|
var input store.FileStorageSettingsInput
|
|
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
|
writeError(w, http.StatusBadRequest, "invalid json body")
|
|
return
|
|
}
|
|
settings, err := s.store.UpdateFileStorageSettings(r.Context(), input)
|
|
if err != nil {
|
|
s.logger.Error("update file storage settings failed", "error", err)
|
|
writeError(w, http.StatusInternalServerError, "update file storage settings failed")
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, settings)
|
|
}
|
|
|
|
func (s *Server) createFileStorageChannel(w http.ResponseWriter, r *http.Request) {
|
|
var input store.FileStorageChannelInput
|
|
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
|
writeError(w, http.StatusBadRequest, "invalid json body")
|
|
return
|
|
}
|
|
if message := validateFileStorageChannelInput(input, nil); message != "" {
|
|
writeError(w, http.StatusBadRequest, message)
|
|
return
|
|
}
|
|
item, err := s.store.CreateFileStorageChannel(r.Context(), input)
|
|
if err != nil {
|
|
if store.IsUniqueViolation(err) {
|
|
writeError(w, http.StatusConflict, "file storage channel key already exists")
|
|
return
|
|
}
|
|
s.logger.Error("create file storage channel failed", "error", err)
|
|
writeError(w, http.StatusInternalServerError, "create file storage channel failed")
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusCreated, item)
|
|
}
|
|
|
|
func (s *Server) updateFileStorageChannel(w http.ResponseWriter, r *http.Request) {
|
|
var input store.FileStorageChannelInput
|
|
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
|
writeError(w, http.StatusBadRequest, "invalid json body")
|
|
return
|
|
}
|
|
existing, err := s.store.GetFileStorageChannel(r.Context(), r.PathValue("channelID"))
|
|
if err != nil {
|
|
if store.IsNotFound(err) {
|
|
writeError(w, http.StatusNotFound, "file storage channel not found")
|
|
return
|
|
}
|
|
s.logger.Error("get file storage channel failed", "error", err)
|
|
writeError(w, http.StatusInternalServerError, "get file storage channel failed")
|
|
return
|
|
}
|
|
if message := validateFileStorageChannelInput(input, &existing); message != "" {
|
|
writeError(w, http.StatusBadRequest, message)
|
|
return
|
|
}
|
|
item, err := s.store.UpdateFileStorageChannel(r.Context(), r.PathValue("channelID"), input)
|
|
if err != nil {
|
|
if store.IsNotFound(err) {
|
|
writeError(w, http.StatusNotFound, "file storage channel not found")
|
|
return
|
|
}
|
|
if store.IsUniqueViolation(err) {
|
|
writeError(w, http.StatusConflict, "file storage channel key already exists")
|
|
return
|
|
}
|
|
s.logger.Error("update file storage channel failed", "error", err)
|
|
writeError(w, http.StatusInternalServerError, "update file storage channel failed")
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, item)
|
|
}
|
|
|
|
func (s *Server) deleteFileStorageChannel(w http.ResponseWriter, r *http.Request) {
|
|
if err := s.store.DeleteFileStorageChannel(r.Context(), r.PathValue("channelID")); err != nil {
|
|
if store.IsNotFound(err) {
|
|
writeError(w, http.StatusNotFound, "file storage channel not found")
|
|
return
|
|
}
|
|
s.logger.Error("delete file storage channel failed", "error", err)
|
|
writeError(w, http.StatusInternalServerError, "delete file storage channel failed")
|
|
return
|
|
}
|
|
w.WriteHeader(http.StatusNoContent)
|
|
}
|
|
|
|
func validateFileStorageChannelInput(input store.FileStorageChannelInput, existing *store.FileStorageChannel) string {
|
|
provider := strings.ToLower(strings.TrimSpace(input.Provider))
|
|
if provider == "" {
|
|
provider = "server_main_openapi"
|
|
}
|
|
status := strings.ToLower(strings.TrimSpace(input.Status))
|
|
if status == "" {
|
|
status = "disabled"
|
|
}
|
|
if strings.TrimSpace(input.ChannelKey) == "" || strings.TrimSpace(input.Name) == "" {
|
|
return "channelKey and name are required"
|
|
}
|
|
if status != "enabled" && status != "disabled" {
|
|
return "status must be enabled or disabled"
|
|
}
|
|
if provider == "server_main_openapi" {
|
|
hasAPIKey := false
|
|
if input.APIKey != nil {
|
|
hasAPIKey = strings.TrimSpace(*input.APIKey) != ""
|
|
} else if existing != nil {
|
|
hasAPIKey = strings.TrimSpace(existing.APIKey) != ""
|
|
}
|
|
if status == "enabled" && !hasAPIKey {
|
|
return "server-main OpenAPI channel requires API key before enabling"
|
|
}
|
|
}
|
|
return ""
|
|
}
|