mirror of
https://github.com/chrislusf/seaweedfs
synced 2025-07-04 18:52:47 +02:00
255 lines
7.2 KiB
Go
255 lines
7.2 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/seaweedfs/seaweedfs/weed/admin/dash"
|
|
"github.com/seaweedfs/seaweedfs/weed/admin/view/app"
|
|
"github.com/seaweedfs/seaweedfs/weed/admin/view/layout"
|
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
)
|
|
|
|
// UserHandlers contains all the HTTP handlers for user management
|
|
type UserHandlers struct {
|
|
adminServer *dash.AdminServer
|
|
}
|
|
|
|
// NewUserHandlers creates a new instance of UserHandlers
|
|
func NewUserHandlers(adminServer *dash.AdminServer) *UserHandlers {
|
|
return &UserHandlers{
|
|
adminServer: adminServer,
|
|
}
|
|
}
|
|
|
|
// ShowObjectStoreUsers renders the object store users management page
|
|
func (h *UserHandlers) ShowObjectStoreUsers(c *gin.Context) {
|
|
// Get object store users data from the server
|
|
usersData := h.getObjectStoreUsersData(c)
|
|
|
|
// Render HTML template
|
|
c.Header("Content-Type", "text/html")
|
|
usersComponent := app.ObjectStoreUsers(usersData)
|
|
layoutComponent := layout.Layout(c, usersComponent)
|
|
err := layoutComponent.Render(c.Request.Context(), c.Writer)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to render template: " + err.Error()})
|
|
return
|
|
}
|
|
}
|
|
|
|
// GetUsers returns the list of users as JSON
|
|
func (h *UserHandlers) GetUsers(c *gin.Context) {
|
|
users, err := h.adminServer.GetObjectStoreUsers()
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get users: " + err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"users": users})
|
|
}
|
|
|
|
// CreateUser handles user creation
|
|
func (h *UserHandlers) CreateUser(c *gin.Context) {
|
|
var req dash.CreateUserRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
// Validate required fields
|
|
if req.Username == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
|
|
return
|
|
}
|
|
|
|
user, err := h.adminServer.CreateObjectStoreUser(req)
|
|
if err != nil {
|
|
glog.Errorf("Failed to create user %s: %v", req.Username, err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create user: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusCreated, gin.H{
|
|
"message": "User created successfully",
|
|
"user": user,
|
|
})
|
|
}
|
|
|
|
// UpdateUser handles user updates
|
|
func (h *UserHandlers) UpdateUser(c *gin.Context) {
|
|
username := c.Param("username")
|
|
if username == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
|
|
return
|
|
}
|
|
|
|
var req dash.UpdateUserRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
user, err := h.adminServer.UpdateObjectStoreUser(username, req)
|
|
if err != nil {
|
|
glog.Errorf("Failed to update user %s: %v", username, err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "User updated successfully",
|
|
"user": user,
|
|
})
|
|
}
|
|
|
|
// DeleteUser handles user deletion
|
|
func (h *UserHandlers) DeleteUser(c *gin.Context) {
|
|
username := c.Param("username")
|
|
if username == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
|
|
return
|
|
}
|
|
|
|
err := h.adminServer.DeleteObjectStoreUser(username)
|
|
if err != nil {
|
|
glog.Errorf("Failed to delete user %s: %v", username, err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete user: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "User deleted successfully",
|
|
})
|
|
}
|
|
|
|
// GetUserDetails returns detailed information about a specific user
|
|
func (h *UserHandlers) GetUserDetails(c *gin.Context) {
|
|
username := c.Param("username")
|
|
if username == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
|
|
return
|
|
}
|
|
|
|
user, err := h.adminServer.GetObjectStoreUserDetails(username)
|
|
if err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "User not found: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, user)
|
|
}
|
|
|
|
// CreateAccessKey creates a new access key for a user
|
|
func (h *UserHandlers) CreateAccessKey(c *gin.Context) {
|
|
username := c.Param("username")
|
|
if username == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
|
|
return
|
|
}
|
|
|
|
accessKey, err := h.adminServer.CreateAccessKey(username)
|
|
if err != nil {
|
|
glog.Errorf("Failed to create access key for user %s: %v", username, err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create access key: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusCreated, gin.H{
|
|
"message": "Access key created successfully",
|
|
"access_key": accessKey,
|
|
})
|
|
}
|
|
|
|
// DeleteAccessKey deletes an access key for a user
|
|
func (h *UserHandlers) DeleteAccessKey(c *gin.Context) {
|
|
username := c.Param("username")
|
|
accessKeyId := c.Param("accessKeyId")
|
|
|
|
if username == "" || accessKeyId == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Username and access key ID are required"})
|
|
return
|
|
}
|
|
|
|
err := h.adminServer.DeleteAccessKey(username, accessKeyId)
|
|
if err != nil {
|
|
glog.Errorf("Failed to delete access key %s for user %s: %v", accessKeyId, username, err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete access key: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "Access key deleted successfully",
|
|
})
|
|
}
|
|
|
|
// GetUserPolicies returns the policies for a user
|
|
func (h *UserHandlers) GetUserPolicies(c *gin.Context) {
|
|
username := c.Param("username")
|
|
if username == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
|
|
return
|
|
}
|
|
|
|
policies, err := h.adminServer.GetUserPolicies(username)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get user policies: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"policies": policies})
|
|
}
|
|
|
|
// UpdateUserPolicies updates the policies for a user
|
|
func (h *UserHandlers) UpdateUserPolicies(c *gin.Context) {
|
|
username := c.Param("username")
|
|
if username == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
|
|
return
|
|
}
|
|
|
|
var req dash.UpdateUserPoliciesRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
err := h.adminServer.UpdateUserPolicies(username, req.Actions)
|
|
if err != nil {
|
|
glog.Errorf("Failed to update policies for user %s: %v", username, err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user policies: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "User policies updated successfully",
|
|
})
|
|
}
|
|
|
|
// getObjectStoreUsersData retrieves object store users data from the server
|
|
func (h *UserHandlers) getObjectStoreUsersData(c *gin.Context) dash.ObjectStoreUsersData {
|
|
username := c.GetString("username")
|
|
if username == "" {
|
|
username = "admin"
|
|
}
|
|
|
|
// Get object store users
|
|
users, err := h.adminServer.GetObjectStoreUsers()
|
|
if err != nil {
|
|
glog.Errorf("Failed to get object store users: %v", err)
|
|
// Return empty data on error
|
|
return dash.ObjectStoreUsersData{
|
|
Username: username,
|
|
Users: []dash.ObjectStoreUser{},
|
|
TotalUsers: 0,
|
|
LastUpdated: time.Now(),
|
|
}
|
|
}
|
|
|
|
return dash.ObjectStoreUsersData{
|
|
Username: username,
|
|
Users: users,
|
|
TotalUsers: len(users),
|
|
LastUpdated: time.Now(),
|
|
}
|
|
}
|