mirror of
https://github.com/khairul169/garage-webui.git
synced 2025-10-14 23:09:32 +07:00
190 lines
4.1 KiB
Go
190 lines
4.1 KiB
Go
package router
|
|
|
|
import (
|
|
"encoding/json"
|
|
"khairul169/garage-webui/schema"
|
|
"khairul169/garage-webui/utils"
|
|
"net/http"
|
|
)
|
|
|
|
type Tenants struct{}
|
|
|
|
func (t *Tenants) GetAll(w http.ResponseWriter, r *http.Request) {
|
|
// Check permissions
|
|
if !t.checkPermission(r, schema.PermissionReadTenants) {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
|
|
return
|
|
}
|
|
|
|
tenants, err := utils.DB.ListTenants()
|
|
if err != nil {
|
|
utils.ResponseError(w, err)
|
|
return
|
|
}
|
|
|
|
utils.ResponseSuccess(w, tenants)
|
|
}
|
|
|
|
func (t *Tenants) GetOne(w http.ResponseWriter, r *http.Request) {
|
|
tenantID := r.PathValue("id")
|
|
if tenantID == "" {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// Check permissions
|
|
if !t.checkPermission(r, schema.PermissionReadTenants) {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
|
|
return
|
|
}
|
|
|
|
tenant, err := utils.DB.GetTenant(tenantID)
|
|
if err != nil {
|
|
utils.ResponseErrorStatus(w, err, http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
utils.ResponseSuccess(w, tenant)
|
|
}
|
|
|
|
func (t *Tenants) Create(w http.ResponseWriter, r *http.Request) {
|
|
// Check permissions
|
|
if !t.checkPermission(r, schema.PermissionWriteTenants) {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
|
|
return
|
|
}
|
|
|
|
var req schema.CreateTenantRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
utils.ResponseError(w, err)
|
|
return
|
|
}
|
|
|
|
// Validate request
|
|
if req.Name == "" {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
tenant, err := utils.DB.CreateTenant(&req)
|
|
if err != nil {
|
|
utils.ResponseError(w, err)
|
|
return
|
|
}
|
|
|
|
utils.ResponseSuccess(w, tenant)
|
|
}
|
|
|
|
func (t *Tenants) Update(w http.ResponseWriter, r *http.Request) {
|
|
tenantID := r.PathValue("id")
|
|
if tenantID == "" {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// Check permissions
|
|
if !t.checkPermission(r, schema.PermissionWriteTenants) {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
|
|
return
|
|
}
|
|
|
|
var req schema.UpdateTenantRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
utils.ResponseError(w, err)
|
|
return
|
|
}
|
|
|
|
tenant, err := utils.DB.UpdateTenant(tenantID, &req)
|
|
if err != nil {
|
|
utils.ResponseError(w, err)
|
|
return
|
|
}
|
|
|
|
utils.ResponseSuccess(w, tenant)
|
|
}
|
|
|
|
func (t *Tenants) Delete(w http.ResponseWriter, r *http.Request) {
|
|
tenantID := r.PathValue("id")
|
|
if tenantID == "" {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// Check permissions
|
|
if !t.checkPermission(r, schema.PermissionDeleteTenants) {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
|
|
return
|
|
}
|
|
|
|
err := utils.DB.DeleteTenant(tenantID)
|
|
if err != nil {
|
|
utils.ResponseError(w, err)
|
|
return
|
|
}
|
|
|
|
utils.ResponseSuccess(w, map[string]bool{"success": true})
|
|
}
|
|
|
|
func (t *Tenants) GetStats(w http.ResponseWriter, r *http.Request) {
|
|
tenantID := r.PathValue("id")
|
|
if tenantID == "" {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// Check permissions
|
|
if !t.checkPermission(r, schema.PermissionReadTenants) {
|
|
utils.ResponseErrorStatus(w, nil, http.StatusForbidden)
|
|
return
|
|
}
|
|
|
|
// Get tenant
|
|
tenant, err := utils.DB.GetTenant(tenantID)
|
|
if err != nil {
|
|
utils.ResponseErrorStatus(w, err, http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
// Get stats from Garage API
|
|
// This would need to be implemented to get actual usage statistics
|
|
// For now, return basic info
|
|
stats := map[string]interface{}{
|
|
"tenant": tenant,
|
|
"bucket_count": 0,
|
|
"key_count": 0,
|
|
"total_size": 0,
|
|
"user_count": t.getUserCountForTenant(tenantID),
|
|
}
|
|
|
|
utils.ResponseSuccess(w, stats)
|
|
}
|
|
|
|
func (t *Tenants) 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)
|
|
}
|
|
|
|
func (t *Tenants) getUserCountForTenant(tenantID string) int {
|
|
users, err := utils.DB.ListUsers()
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
|
|
count := 0
|
|
for _, user := range users {
|
|
if user.TenantID != nil && *user.TenantID == tenantID {
|
|
count++
|
|
}
|
|
}
|
|
|
|
return count
|
|
} |