package logic import ( "context" "time" msgentity "spark-server/internal/module/message/entity" uploadentity "spark-server/internal/module/upload/entity" "spark-server/internal/pkg/errs" ) func (s *Service) copyMedia(ctx context.Context, userID int64, payload *msgentity.Content) ([]string, error) { keys := payload.ObjectKeys() if len(keys) == 0 { return nil, nil } if s.objects == nil { return nil, errs.ErrAvailable } day := time.Now().UTC().Format("20060102") mapping := make(map[string]string, len(keys)) copied := make([]string, 0, len(keys)) for _, src := range keys { if _, ok := mapping[src]; ok { continue } objectID, err := s.ids.NextID() if err != nil { s.deleteKeys(ctx, copied) return nil, err } dst := uploadentity.BuildFavKey(userID, objectID, day, uploadentity.ExtOfKey(src)) if err := s.objects.Copy(ctx, src, dst); err != nil { s.deleteKeys(ctx, copied) return nil, err } mapping[src] = dst copied = append(copied, dst) } payload.ReplaceObjectKeys(mapping) return copied, nil } func (s *Service) deleteKeys(ctx context.Context, keys []string) { if s.objects == nil { return } for _, key := range keys { _ = s.objects.Delete(ctx, key) } }