Files
zsp-project/backend/internal/service/company_service.go
2026-06-03 20:59:39 +08:00

157 lines
4.2 KiB
Go
Executable File

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)
}