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>
52 lines
1.2 KiB
Go
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)
|
|
}
|
|
}
|