2025-09-25 17:35:50 -03:00

164 lines
4.1 KiB
Go

package router
import (
"encoding/json"
"khairul169/garage-webui/schema"
"khairul169/garage-webui/utils"
"net/http"
)
type S3Config struct{}
// S3ConfigResponse represents S3 configuration response
type S3ConfigResponse struct {
Region string `json:"region"`
Endpoint string `json:"endpoint"`
AdminAPI string `json:"admin_api"`
AdminToken string `json:"admin_token,omitempty"`
WebEndpoint string `json:"web_endpoint,omitempty"`
}
// UpdateS3ConfigRequest represents S3 config update request
type UpdateS3ConfigRequest struct {
Region *string `json:"region,omitempty"`
Endpoint *string `json:"endpoint,omitempty"`
AdminAPI *string `json:"admin_api,omitempty"`
AdminToken *string `json:"admin_token,omitempty"`
WebEndpoint *string `json:"web_endpoint,omitempty"`
}
func (s *S3Config) GetConfig(w http.ResponseWriter, r *http.Request) {
// Check permissions
if !s.checkPermission(r, schema.PermissionSystemAdmin) {
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
return
}
response := S3ConfigResponse{
Region: utils.Garage.GetS3Region(),
Endpoint: utils.Garage.GetS3Endpoint(),
AdminAPI: utils.Garage.GetAdminEndpoint(),
WebEndpoint: utils.Garage.GetWebEndpoint(),
// Don't send admin token for security
}
utils.ResponseSuccess(w, response)
}
func (s *S3Config) UpdateConfig(w http.ResponseWriter, r *http.Request) {
// Check permissions
if !s.checkPermission(r, schema.PermissionSystemAdmin) {
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
return
}
var req UpdateS3ConfigRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
utils.ResponseError(w, err)
return
}
// Update configuration values
if req.Region != nil {
utils.SetEnv("S3_REGION", *req.Region)
}
if req.Endpoint != nil {
utils.SetEnv("S3_ENDPOINT_URL", *req.Endpoint)
}
if req.AdminAPI != nil {
utils.SetEnv("API_BASE_URL", *req.AdminAPI)
}
if req.AdminToken != nil {
utils.SetEnv("API_ADMIN_KEY", *req.AdminToken)
}
// Reload garage configuration
if err := utils.Garage.LoadConfig(); err != nil {
utils.ResponseError(w, err)
return
}
// Return updated config
response := S3ConfigResponse{
Region: utils.Garage.GetS3Region(),
Endpoint: utils.Garage.GetS3Endpoint(),
AdminAPI: utils.Garage.GetAdminEndpoint(),
WebEndpoint: utils.Garage.GetWebEndpoint(),
}
utils.ResponseSuccess(w, response)
}
func (s *S3Config) TestConnection(w http.ResponseWriter, r *http.Request) {
// Check permissions
if !s.checkPermission(r, schema.PermissionSystemAdmin) {
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
return
}
// Test Garage API connection
_, err := utils.Garage.Fetch("/status", &utils.FetchOptions{
Method: "GET",
})
if err != nil {
utils.ResponseErrorStatus(w, err, http.StatusServiceUnavailable)
return
}
utils.ResponseSuccess(w, map[string]interface{}{
"status": "connected",
"message": "Connection to Garage API successful",
})
}
func (s *S3Config) GetStatus(w http.ResponseWriter, r *http.Request) {
// Check permissions
if !s.checkPermission(r, schema.PermissionReadCluster) {
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
return
}
// Get status from Garage API
data, err := utils.Garage.Fetch("/status", &utils.FetchOptions{
Method: "GET",
})
if err != nil {
utils.ResponseError(w, err)
return
}
// Parse response
var status map[string]interface{}
if err := json.Unmarshal(data, &status); err != nil {
utils.ResponseError(w, err)
return
}
// Add our own status info
response := map[string]interface{}{
"garage": status,
"webui_version": "1.1.0",
"authentication": true,
"users_count": len(utils.DB.Users),
"tenants_count": len(utils.DB.Tenants),
"sessions_count": len(utils.DB.Sessions),
}
utils.ResponseSuccess(w, response)
}
func (s *S3Config) checkPermission(r *http.Request, permission schema.Permission) bool {
userID := utils.Session.Get(r, "user_id")
if userID == nil {
return false
}
user, err := utils.DB.GetUser(userID.(string))
if err != nil {
return false
}
return user.HasPermission(permission)
}