package service import ( "fmt" "mime/multipart" "os" "path/filepath" "time" "github.com/rovina/zsp-backend/internal/model" "github.com/rovina/zsp-backend/internal/repository" "github.com/rovina/zsp-backend/pkg/utils" ) type CompanyService interface { CreateFolder(name, description, category string) (*model.CompanyFolder, error) ListFolders() ([]model.CompanyFolder, error) GetFolderByID(id uint) (*model.CompanyFolder, error) UpdateFolder(id uint, name, description, category string) error DeleteFolder(id uint) error UploadFiles(folderID *uint, companyName, fileCategory, expireDate, description string, files []*multipart.FileHeader) (int, error) ListFiles(folderID *uint) ([]model.CompanyFile, error) GetFileByID(id uint) (*model.CompanyFile, error) UpdateFile(id uint, companyName, fileCategory, expireDate, description string, folderID *uint) error DeleteFile(id uint) error } type companyService struct { repo repository.CompanyRepository } func NewCompanyService(repo repository.CompanyRepository) CompanyService { return &companyService{repo: repo} } func (s *companyService) CreateFolder(name, description, category string) (*model.CompanyFolder, error) { f := &model.CompanyFolder{ Name: name, Description: description, Category: category, CreateTime: time.Now(), UpdateTime: time.Now(), } if err := s.repo.CreateFolder(f); err != nil { return nil, err } return f, nil } func (s *companyService) ListFolders() ([]model.CompanyFolder, error) { return s.repo.ListFolders() } func (s *companyService) GetFolderByID(id uint) (*model.CompanyFolder, error) { return s.repo.GetFolderByID(id) } func (s *companyService) UpdateFolder(id uint, name, description, category string) error { f, err := s.repo.GetFolderByID(id) if err != nil { return err } f.Name = name f.Description = description f.Category = category f.UpdateTime = time.Now() return s.repo.UpdateFolder(f) } func (s *companyService) DeleteFolder(id uint) error { return s.repo.DeleteFolder(id) } func (s *companyService) UploadFiles(folderID *uint, companyName, fileCategory, expireDate, description string, files []*multipart.FileHeader) (int, error) { basePath := "./data/company/files" if err := os.MkdirAll(basePath, os.ModePerm); err != nil { return 0, err } var expire *time.Time if expireDate != "" { if t, err := time.Parse("2006-01-02", expireDate); err == nil { expire = &t } } count := 0 for _, fh := range files { filename := fmt.Sprintf("%d_%s", time.Now().UnixNano(), fh.Filename) savePath := filepath.Join(basePath, filename) if err := utils.SaveUploadedFile(fh, savePath); err != nil { return count, err } ext := filepath.Ext(fh.Filename) if len(ext) > 0 { ext = ext[1:] } file := &model.CompanyFile{ FolderID: 0, FileName: fh.Filename, FileType: ext, FileSize: fh.Size, UploadTime: time.Now(), CompanyName: companyName, FileCategory: fileCategory, ExpireDate: expire, Description: description, FileURL: "files/" + filename, } if folderID != nil && *folderID > 0 { file.FolderID = *folderID } if err := s.repo.CreateFile(file); err != nil { return count, err } count++ } return count, nil } func (s *companyService) ListFiles(folderID *uint) ([]model.CompanyFile, error) { return s.repo.ListFiles(folderID) } func (s *companyService) GetFileByID(id uint) (*model.CompanyFile, error) { return s.repo.GetFileByID(id) } func (s *companyService) UpdateFile(id uint, companyName, fileCategory, expireDate, description string, folderID *uint) error { f, err := s.repo.GetFileByID(id) if err != nil { return err } f.CompanyName = companyName f.FileCategory = fileCategory f.Description = description if expireDate != "" { if t, err := time.Parse("2006-01-02", expireDate); err == nil { f.ExpireDate = &t } } else { f.ExpireDate = nil } if folderID != nil { f.FolderID = *folderID } return s.repo.UpdateFile(f) } func (s *companyService) DeleteFile(id uint) error { return s.repo.DeleteFile(id) }