167 lines
4.6 KiB
Go
Raw Permalink Normal View History

2025-07-18 20:10:29 +07:00
package service
import (
"context"
"fmt"
"apskel-pos-be/internal/models"
"apskel-pos-be/internal/processor"
"mime/multipart"
"github.com/google/uuid"
)
type FileService interface {
UploadFile(ctx context.Context, file *multipart.FileHeader, req *models.UploadFileRequest, organizationID, userID uuid.UUID) (*models.FileResponse, error)
GetFileByID(ctx context.Context, id uuid.UUID) (*models.FileResponse, error)
UpdateFile(ctx context.Context, id uuid.UUID, req *models.UpdateFileRequest) (*models.FileResponse, error)
ListFiles(ctx context.Context, req *models.ListFilesRequest) (*models.ListFilesResponse, error)
GetFileByOrganizationID(ctx context.Context, organizationID uuid.UUID) ([]*models.FileResponse, error)
GetFileByUserID(ctx context.Context, userID uuid.UUID) ([]*models.FileResponse, error)
}
type FileServiceImpl struct {
fileProcessor processor.FileProcessor
}
func NewFileServiceImpl(fileProcessor processor.FileProcessor) *FileServiceImpl {
return &FileServiceImpl{
fileProcessor: fileProcessor,
}
}
func (s *FileServiceImpl) UploadFile(ctx context.Context, file *multipart.FileHeader, req *models.UploadFileRequest, organizationID, userID uuid.UUID) (*models.FileResponse, error) {
if err := s.validateUploadFileRequest(req); err != nil {
return nil, fmt.Errorf("validation error: %w", err)
}
if organizationID == uuid.Nil {
return nil, fmt.Errorf("organization ID is required")
}
if userID == uuid.Nil {
return nil, fmt.Errorf("user ID is required")
}
// Process file upload
response, err := s.fileProcessor.UploadFile(ctx, file, req, organizationID, userID)
if err != nil {
return nil, fmt.Errorf("failed to upload file: %w", err)
}
return response, nil
}
func (s *FileServiceImpl) GetFileByID(ctx context.Context, id uuid.UUID) (*models.FileResponse, error) {
if id == uuid.Nil {
return nil, fmt.Errorf("invalid file ID")
}
response, err := s.fileProcessor.GetFileByID(ctx, id)
if err != nil {
return nil, fmt.Errorf("failed to get file: %w", err)
}
return response, nil
}
func (s *FileServiceImpl) UpdateFile(ctx context.Context, id uuid.UUID, req *models.UpdateFileRequest) (*models.FileResponse, error) {
// Validate inputs
if id == uuid.Nil {
return nil, fmt.Errorf("invalid file ID")
}
// Validate request
if err := s.validateUpdateFileRequest(req); err != nil {
return nil, fmt.Errorf("validation error: %w", err)
}
// Process file update
response, err := s.fileProcessor.UpdateFile(ctx, id, req)
if err != nil {
return nil, fmt.Errorf("failed to update file: %w", err)
}
return response, nil
}
func (s *FileServiceImpl) ListFiles(ctx context.Context, req *models.ListFilesRequest) (*models.ListFilesResponse, error) {
// Validate request
if err := s.validateListFilesRequest(req); err != nil {
return nil, fmt.Errorf("validation error: %w", err)
}
// Process file listing
response, err := s.fileProcessor.ListFiles(ctx, req)
if err != nil {
return nil, fmt.Errorf("failed to list files: %w", err)
}
return response, nil
}
func (s *FileServiceImpl) GetFileByOrganizationID(ctx context.Context, organizationID uuid.UUID) ([]*models.FileResponse, error) {
// Validate organization ID
if organizationID == uuid.Nil {
return nil, fmt.Errorf("invalid organization ID")
}
// Get files by organization
response, err := s.fileProcessor.GetFileByOrganizationID(ctx, organizationID)
if err != nil {
return nil, fmt.Errorf("failed to get files by organization: %w", err)
}
return response, nil
}
func (s *FileServiceImpl) GetFileByUserID(ctx context.Context, userID uuid.UUID) ([]*models.FileResponse, error) {
// Validate user ID
if userID == uuid.Nil {
return nil, fmt.Errorf("invalid user ID")
}
// Get files by user
response, err := s.fileProcessor.GetFileByUserID(ctx, userID)
if err != nil {
return nil, fmt.Errorf("failed to get files by user: %w", err)
}
return response, nil
}
// Validation methods
func (s *FileServiceImpl) validateUploadFileRequest(req *models.UploadFileRequest) error {
if req == nil {
return fmt.Errorf("request cannot be nil")
}
// File type validation is handled in the processor
return nil
}
func (s *FileServiceImpl) validateUpdateFileRequest(req *models.UpdateFileRequest) error {
if req == nil {
return fmt.Errorf("request cannot be nil")
}
// Additional validation can be added here if needed
return nil
}
func (s *FileServiceImpl) validateListFilesRequest(req *models.ListFilesRequest) error {
if req == nil {
return fmt.Errorf("request cannot be nil")
}
if req.Page < 1 {
return fmt.Errorf("page must be greater than 0")
}
if req.Limit < 1 || req.Limit > 100 {
return fmt.Errorf("limit must be between 1 and 100")
}
return nil
}