package threads_account import ( "context" "strings" app "haixun-backend/internal/library/errors" "haixun-backend/internal/library/errors/code" "haixun-backend/internal/library/storage" "haixun-backend/internal/svc" "github.com/zeromicro/go-zero/core/logx" ) func resolvePublishImageURLs(svcCtx *svc.ServiceContext, single string, list []string) ([]string, []string, error) { keys := storage.NormalizeImageKeys(single, list) if len(keys) == 0 { return nil, nil, nil } resolver, ok := svcCtx.AvatarStorage.(storage.PublicURLResolver) if !ok || resolver == nil { return nil, nil, app.For(code.ThreadsAccount).SysNotImplemented("image storage is not configured") } urls := make([]string, 0, len(keys)) for _, key := range keys { if err := storage.ValidatePublishAttachmentKey(key); err != nil { return nil, nil, app.For(code.ThreadsAccount).InputInvalidFormat(err.Error()) } url, err := resolver.ResolvePublicURL(key) if err != nil { return nil, nil, app.For(code.ThreadsAccount).InputInvalidFormat(err.Error()) } if err := storage.ValidateThreadsFetchableURL(url); err != nil { return nil, nil, app.For(code.ThreadsAccount).InputInvalidFormat(err.Error()) } urls = append(urls, url) } return urls, keys, nil } func purgePublishAttachments(ctx context.Context, svcCtx *svc.ServiceContext, imageKeys []string) { deleter, ok := svcCtx.AvatarStorage.(storage.ObjectDeleter) if !ok || deleter == nil { return } for _, key := range imageKeys { key = strings.TrimSpace(key) if key == "" { continue } if err := storage.PurgePublishAttachment(ctx, deleter, key); err != nil { logx.WithContext(ctx).Errorf("purge publish attachment %s: %v", key, err) } } }