72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
|
|
package service
|
||
|
|
|
||
|
|
import (
|
||
|
|
"sync"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
type UploadStatus struct {
|
||
|
|
FileName string `json:"fileName"`
|
||
|
|
Size int64 `json:"size"`
|
||
|
|
Progress int `json:"progress"`
|
||
|
|
Status string `json:"status"`
|
||
|
|
ObjectName string `json:"objectName"`
|
||
|
|
BucketName string `json:"bucketName"`
|
||
|
|
StartTime time.Time `json:"startTime"`
|
||
|
|
Error string `json:"error,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type UploadManager interface {
|
||
|
|
Add(uploadID string, status *UploadStatus)
|
||
|
|
UpdateProgress(uploadID string, progress int)
|
||
|
|
UpdateStatus(uploadID string, status string, err error)
|
||
|
|
Get(uploadID string) (*UploadStatus, bool)
|
||
|
|
}
|
||
|
|
|
||
|
|
type uploadManager struct {
|
||
|
|
uploads map[string]*UploadStatus
|
||
|
|
mutex sync.RWMutex
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewUploadManager() UploadManager {
|
||
|
|
return &uploadManager{
|
||
|
|
uploads: make(map[string]*UploadStatus),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Add menambahkan status upload baru
|
||
|
|
func (um *uploadManager) Add(uploadID string, status *UploadStatus) {
|
||
|
|
um.mutex.Lock()
|
||
|
|
defer um.mutex.Unlock()
|
||
|
|
um.uploads[uploadID] = status
|
||
|
|
}
|
||
|
|
|
||
|
|
// UpdateProgress memperbarui progress upload
|
||
|
|
func (um *uploadManager) UpdateProgress(uploadID string, progress int) {
|
||
|
|
um.mutex.Lock()
|
||
|
|
defer um.mutex.Unlock()
|
||
|
|
if status, exists := um.uploads[uploadID]; exists {
|
||
|
|
status.Progress = progress
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// UpdateStatus memperbarui status upload
|
||
|
|
func (um *uploadManager) UpdateStatus(uploadID string, status string, err error) {
|
||
|
|
um.mutex.Lock()
|
||
|
|
defer um.mutex.Unlock()
|
||
|
|
if upload, exists := um.uploads[uploadID]; exists {
|
||
|
|
upload.Status = status
|
||
|
|
if err != nil {
|
||
|
|
upload.Error = err.Error()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get mendapatkan status upload berdasarkan ID
|
||
|
|
func (um *uploadManager) Get(uploadID string) (*UploadStatus, bool) {
|
||
|
|
um.mutex.RLock()
|
||
|
|
defer um.mutex.RUnlock()
|
||
|
|
status, exists := um.uploads[uploadID]
|
||
|
|
return status, exists
|
||
|
|
}
|