120 lines
2.1 KiB
Go
120 lines
2.1 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/scanner/backend/models"
|
|
)
|
|
|
|
// ScannerService handles scanner operations
|
|
type ScannerService struct {
|
|
state models.ScannerState
|
|
}
|
|
|
|
// NewScannerService creates a new scanner service
|
|
func NewScannerService() *ScannerService {
|
|
return &ScannerService{
|
|
state: models.ScannerState{
|
|
IsScanning: false,
|
|
},
|
|
}
|
|
}
|
|
|
|
// GetScanStatus returns the current scan status
|
|
func (s *ScannerService) IsScanning() bool {
|
|
s.state.Mu.Lock()
|
|
state := s.state.IsScanning
|
|
s.state.Mu.Unlock()
|
|
|
|
return state
|
|
}
|
|
|
|
// StartScan begins a new scanning process
|
|
func (s *ScannerService) StartScan() (bool, error) {
|
|
s.state.Mu.Lock()
|
|
defer s.state.Mu.Unlock()
|
|
|
|
if s.state.IsScanning {
|
|
return false, nil
|
|
}
|
|
|
|
s.state.IsScanning = true
|
|
|
|
go s.scan()
|
|
return true, nil
|
|
}
|
|
|
|
// AbortScan stops an in-progress scan
|
|
func (s *ScannerService) AbortScan() (bool, error) {
|
|
s.state.Mu.Lock()
|
|
defer s.state.Mu.Unlock()
|
|
|
|
if !s.state.IsScanning {
|
|
return false, nil
|
|
}
|
|
|
|
s.state.IsScanning = false
|
|
return true, nil
|
|
}
|
|
|
|
// GetDocuments returns all scanned documents
|
|
func (s *ScannerService) GetDocuments() []models.Document {
|
|
const outputDir = "/home/backend/var/documents"
|
|
|
|
files, err := os.ReadDir(outputDir)
|
|
if err != nil {
|
|
return []models.Document{}
|
|
}
|
|
|
|
documents := []models.Document{}
|
|
for _, file := range files {
|
|
if file.IsDir() {
|
|
continue
|
|
}
|
|
|
|
filename := file.Name()
|
|
if !strings.HasPrefix(filename, "scan_") || !strings.HasSuffix(filename, ".jpg") {
|
|
continue
|
|
}
|
|
|
|
documents = append(documents, models.Document{
|
|
Filename: filename,
|
|
URL: fmt.Sprintf("/api/files/%s", filename),
|
|
})
|
|
}
|
|
|
|
return documents
|
|
}
|
|
|
|
func (s *ScannerService) scan() {
|
|
s.state.Mu.Lock()
|
|
isScanning := s.state.IsScanning
|
|
s.state.Mu.Unlock()
|
|
|
|
if !isScanning {
|
|
return
|
|
}
|
|
|
|
outputDir := "/home/backend/var/documents"
|
|
timestamp := time.Now().Format("20060102150405")
|
|
outputFile := fmt.Sprintf("%s/scan_%s.jpg", outputDir, timestamp)
|
|
|
|
_, err := startScan(outputFile)
|
|
|
|
s.state.Mu.Lock()
|
|
defer s.state.Mu.Unlock()
|
|
|
|
if !s.state.IsScanning {
|
|
return
|
|
}
|
|
|
|
if err != nil {
|
|
fmt.Printf("%v\n", err)
|
|
}
|
|
|
|
s.state.IsScanning = false
|
|
}
|