fix save history
This commit is contained in:
@@ -8,25 +8,36 @@ import (
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func (s *Service) SaveHistory(transfers []*Transfer) {
|
||||
func (s *Service) SaveHistory() {
|
||||
if !s.config.GetSaveHistory() {
|
||||
return
|
||||
}
|
||||
configDir := config.GetConfigDir()
|
||||
historyPath := filepath.Join(configDir, "history.json")
|
||||
historyJson, err := json.Marshal(transfers)
|
||||
tempPath := historyPath + ".tmp"
|
||||
|
||||
// 序列化传输列表
|
||||
historyJson, err := json.MarshalIndent(s.GetTransferList(), "", " ")
|
||||
if err != nil {
|
||||
slog.Error("Failed to marshal history", "error", err, "component", "transfer")
|
||||
return
|
||||
}
|
||||
file, err := os.OpenFile(historyPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
|
||||
if err != nil {
|
||||
|
||||
// 写入临时文件
|
||||
if err := os.WriteFile(tempPath, historyJson, 0644); err != nil {
|
||||
slog.Error("Failed to write temp history file", "error", err, "component", "transfer")
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
_, err = file.Write(historyJson)
|
||||
if err != nil {
|
||||
slog.Error("Failed to write history", "error", err)
|
||||
|
||||
// 原子性重命名
|
||||
if err := os.Rename(tempPath, historyPath); err != nil {
|
||||
slog.Error("Failed to rename temp history file", "error", err, "component", "transfer")
|
||||
// 清理临时文件
|
||||
_ = os.Remove(tempPath)
|
||||
return
|
||||
}
|
||||
|
||||
slog.Info("History saved successfully", "path", historyPath, "component", "transfer")
|
||||
}
|
||||
|
||||
func (s *Service) LoadHistory() {
|
||||
|
||||
@@ -32,7 +32,7 @@ func (s *Service) handleAsk(c *gin.Context) {
|
||||
}
|
||||
|
||||
// 检查是否已经存在
|
||||
if _, exists := s.transferList.Load(task.ID); exists {
|
||||
if _, exists := s.transfers.Load(task.ID); exists {
|
||||
// 如果已经存在,说明是网络重试,直接忽略
|
||||
return
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ type Service struct {
|
||||
|
||||
// pendingRequests 存储等待用户确认的通道
|
||||
// Key: TransferID, Value: *Transfer
|
||||
transferList sync.Map
|
||||
transfers sync.Map
|
||||
|
||||
discoveryService *discovery.Service
|
||||
|
||||
@@ -90,9 +90,13 @@ func (s *Service) Start() {
|
||||
}()
|
||||
}
|
||||
|
||||
func (s *Service) GetTransferSyncMap() *sync.Map {
|
||||
return &s.transfers
|
||||
}
|
||||
|
||||
func (s *Service) GetTransferList() []*Transfer {
|
||||
var requests []*Transfer = make([]*Transfer, 0)
|
||||
s.transferList.Range(func(key, value any) bool {
|
||||
s.transfers.Range(func(key, value any) bool {
|
||||
transfer := value.(*Transfer)
|
||||
requests = append(requests, transfer)
|
||||
return true
|
||||
@@ -105,7 +109,7 @@ func (s *Service) GetTransferList() []*Transfer {
|
||||
}
|
||||
|
||||
func (s *Service) GetTransfer(transferID string) (*Transfer, bool) {
|
||||
val, ok := s.transferList.Load(transferID)
|
||||
val, ok := s.transfers.Load(transferID)
|
||||
if !ok {
|
||||
return nil, false
|
||||
}
|
||||
@@ -126,15 +130,13 @@ func (s *Service) CancelTransfer(transferID string) {
|
||||
|
||||
func (s *Service) StoreTransfersToList(transfers []*Transfer) {
|
||||
for _, transfer := range transfers {
|
||||
s.transferList.Store(transfer.ID, transfer)
|
||||
s.transfers.Store(transfer.ID, transfer)
|
||||
}
|
||||
s.SaveHistory(transfers)
|
||||
s.NotifyTransferListUpdate()
|
||||
}
|
||||
|
||||
func (s *Service) StoreTransferToList(transfer *Transfer) {
|
||||
s.transferList.Store(transfer.ID, transfer)
|
||||
s.SaveHistory([]*Transfer{transfer})
|
||||
s.transfers.Store(transfer.ID, transfer)
|
||||
s.NotifyTransferListUpdate()
|
||||
}
|
||||
|
||||
@@ -144,22 +146,20 @@ func (s *Service) NotifyTransferListUpdate() {
|
||||
|
||||
// CleanTransferList 清理完成的 transfer
|
||||
func (s *Service) CleanFinishedTransferList() {
|
||||
s.transferList.Range(func(key, value any) bool {
|
||||
s.transfers.Range(func(key, value any) bool {
|
||||
task := value.(*Transfer)
|
||||
if task.Status == TransferStatusCompleted ||
|
||||
task.Status == TransferStatusError ||
|
||||
task.Status == TransferStatusCanceled ||
|
||||
task.Status == TransferStatusRejected {
|
||||
s.transferList.Delete(key)
|
||||
s.transfers.Delete(key)
|
||||
}
|
||||
return true
|
||||
})
|
||||
s.SaveHistory(s.GetTransferList())
|
||||
s.NotifyTransferListUpdate()
|
||||
}
|
||||
|
||||
func (s *Service) DeleteTransfer(transferID string) {
|
||||
s.transferList.Delete(transferID)
|
||||
s.SaveHistory(s.GetTransferList())
|
||||
s.transfers.Delete(transferID)
|
||||
s.NotifyTransferListUpdate()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user