From a226c4d4fabda06537adce2a275ef7085b891026 Mon Sep 17 00:00:00 2001 From: m Date: Wed, 29 Jul 2026 22:58:52 +0200 Subject: [PATCH] fix delete rec folder --- backend/internal/handler/resource.go | 12 +++----- backend/internal/service/resource.go | 46 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/backend/internal/handler/resource.go b/backend/internal/handler/resource.go index 138cb5a..b27e22a 100644 --- a/backend/internal/handler/resource.go +++ b/backend/internal/handler/resource.go @@ -250,18 +250,16 @@ func (h *ResourceHandler) Get(c *gin.Context) { func (h *ResourceHandler) Delete(c *gin.Context) { id := c.Param("id") - storagePath, _ := h.resources.GetStoragePath(id) - variants, _ := h.resources.GetVariantsByResourceID(id) - - if err := h.resources.Delete(id); err != nil { + result, err := h.resources.DeleteRecursive(id) + if err != nil { api.Error(c, http.StatusInternalServerError, "DB_ERROR", "Failed to delete resource") return } - if storagePath != "" { - os.Remove(path.Clean(storagePath)) + for _, p := range result.StoragePaths { + os.Remove(path.Clean(p)) } - for _, v := range variants { + for _, v := range result.Variants { os.Remove(path.Clean(v.StorageKey)) } diff --git a/backend/internal/service/resource.go b/backend/internal/service/resource.go index 5479ff4..beef250 100644 --- a/backend/internal/service/resource.go +++ b/backend/internal/service/resource.go @@ -190,11 +190,57 @@ func (s *ResourceService) Get(id string) (*model.Resource, error) { return &m, nil } +type DeleteResult struct { + StoragePaths []string + Variants []model.Variant +} + func (s *ResourceService) Delete(id string) error { resourceUUID, _ := uuid.Parse(id) return s.queries.DeleteResource(context.Background(), resourceUUID) } +func (s *ResourceService) DeleteRecursive(id string) (*DeleteResult, error) { + resourceUUID, _ := uuid.Parse(id) + + r, err := s.queries.GetResource(context.Background(), resourceUUID) + if err != nil { + return nil, fmt.Errorf("get resource: %w", err) + } + + result := &DeleteResult{} + + if r.IsFolder { + children, err := s.queries.ListResourcesByParentID(context.Background(), uuid.NullUUID{UUID: resourceUUID, Valid: true}) + if err != nil { + return nil, fmt.Errorf("list children: %w", err) + } + + for _, child := range children { + childResult, err := s.DeleteRecursive(child.ID.String()) + if err != nil { + return nil, fmt.Errorf("delete child %s: %w", child.ID, err) + } + result.StoragePaths = append(result.StoragePaths, childResult.StoragePaths...) + result.Variants = append(result.Variants, childResult.Variants...) + } + } + + if err := s.queries.DeleteResource(context.Background(), resourceUUID); err != nil { + return nil, fmt.Errorf("delete resource: %w", err) + } + + storagePath, _ := s.GetStoragePath(id) + if storagePath != "" { + result.StoragePaths = append(result.StoragePaths, storagePath) + } + + variants, _ := s.GetVariantsByResourceID(id) + result.Variants = append(result.Variants, variants...) + + return result, nil +} + func (s *ResourceService) GetStoragePath(id string) (string, error) { resourceUUID, _ := uuid.Parse(id) placement, err := s.queries.GetServerPlacementByResource(context.Background(), resourceUUID)