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

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
}