157 lines
4.2 KiB
Go
Executable File
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)
|
|
}
|