spark-server/internal/module/favorite/logic/copy.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 19:52:11 +08:00

52 lines
1.2 KiB
Go

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)
}
}