package service import ( "context" "github.com/gochat/gochat/internal/model" "github.com/gochat/gochat/internal/repository" applogger "github.com/gochat/gochat/pkg/logger" ) // FolderService implements business logic for Folder CRUD. type FolderService struct { repo *repository.FolderRepo } func NewFolderService(repo *repository.FolderRepo) *FolderService { return &FolderService{repo: repo} } // CreateFolderRequest is the DTO for creating a folder. type CreateFolderRequest struct { Name string `json:"name" validate:"required,min=2"` Slug string `json:"slug" validate:"required"` Position int `json:"position"` } // UpdateFolderRequest is the DTO for updating a folder. type UpdateFolderRequest struct { Name string `json:"name"` Position *int `json:"position"` } func (s *FolderService) Create(ctx context.Context, portalID uint, req *CreateFolderRequest) (*model.Folder, error) { folder := &model.Folder{ PortalID: portalID, Name: req.Name, } if err := s.repo.Create(ctx, folder); err != nil { applogger.L().Errorf("Create folder: %v", err) return nil, err } return folder, nil } func (s *FolderService) GetByID(ctx context.Context, id uint) (*model.Folder, error) { folder, err := s.repo.GetByID(ctx, id) if err != nil { applogger.L().Errorf("Get folder by ID: %v", err) return nil, err } return folder, nil } func (s *FolderService) Update(ctx context.Context, id uint, req *UpdateFolderRequest) (*model.Folder, error) { folder, err := s.repo.GetByID(ctx, id) if err != nil { applogger.L().Errorf("Get folder for update: %v", err) return nil, err } if req.Name != "" { folder.Name = req.Name } if err := s.repo.Update(ctx, folder); err != nil { applogger.L().Errorf("Update folder: %v", err) return nil, err } return folder, nil } func (s *FolderService) Delete(ctx context.Context, id uint) error { // Check existence first — GORM Delete() returns nil even for non-existent IDs if _, err := s.repo.GetByID(ctx, id); err != nil { applogger.L().Errorf("Find folder for delete: %v", err) return err } if err := s.repo.Delete(ctx, id); err != nil { applogger.L().Errorf("Delete folder: %v", err) return err } return nil } func (s *FolderService) ListByPortalID(ctx context.Context, portalID uint, offset, limit int) ([]model.Folder, int64, error) { folders, count, err := s.repo.FindByPortalID(ctx, portalID, offset, limit) if err != nil { applogger.L().Errorf("List folders by portal: %v", err) return nil, 0, err } return folders, count, nil }