package api import ( "encoding/json" "net/http" "archivdms/internal/audit" ) type createTenantRequest struct { Name string `json:"name"` Slug string `json:"slug"` Domain string `json:"domain"` } // handleCreateTenant creates a new tenant. Restricted to superadmin via // requireRole in server.go's route registration. func (s *Server) handleCreateTenant(w http.ResponseWriter, r *http.Request) { sess := sessionFromCtx(r.Context()) var req createTenantRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeError(w, http.StatusBadRequest, "invalid request body") return } if req.Name == "" || req.Slug == "" { writeError(w, http.StatusBadRequest, "name and slug are required") return } tenant, err := s.tenantStore.Create(r.Context(), req.Name, req.Slug, req.Domain) if err != nil { s.audlog.Log(audit.Entry{EventType: audit.EventTenantMgmt, Username: sess.Username, Success: false, Detail: "create_tenant_failed"}) writeError(w, http.StatusBadRequest, "create tenant failed") return } s.audlog.Log(audit.Entry{EventType: audit.EventTenantMgmt, Username: sess.Username, Success: true, Detail: "tenant_created:" + tenant.Slug}) writeJSON(w, http.StatusCreated, tenant) } // handleListTenants lists all tenants. Restricted to superadmin via // requireRole in server.go's route registration. func (s *Server) handleListTenants(w http.ResponseWriter, r *http.Request) { tenants, err := s.tenantStore.List(r.Context()) if err != nil { writeError(w, http.StatusInternalServerError, "list tenants failed") return } writeJSON(w, http.StatusOK, tenants) }