package app import ( "context" "errors" "strings" "golang.org/x/sync/singleflight" sharedcache "github.com/geo-platform/tenant-api/internal/shared/cache" "github.com/geo-platform/tenant-api/internal/shared/objectstorage" "github.com/geo-platform/tenant-api/internal/tenant/repository" ) func loadKolPromptContent( ctx context.Context, cache sharedcache.Cache, group *singleflight.Group, promptRepo repository.KolPromptRepository, asset *KolPromptAsset, prompt *repository.KolPrompt, ) (string, error) { if prompt == nil { return "", nil } loader := func(loadCtx context.Context) (string, error) { return loadKolPromptContentUncached(loadCtx, promptRepo, asset, prompt) } if cache == nil || group == nil { return loader(ctx) } return sharedcache.LoadJSON( ctx, cache, group, kolPromptContentCacheKey(prompt.TenantID, prompt.ID), defaultCacheTTL(), loader, ) } func loadKolPromptContentUncached( ctx context.Context, promptRepo repository.KolPromptRepository, asset *KolPromptAsset, prompt *repository.KolPrompt, ) (string, error) { if prompt == nil { return "", nil } if promptRepo != nil { content, err := promptRepo.GetContentByID(ctx, prompt.TenantID, prompt.ID) if err != nil { return "", err } if content != nil && strings.TrimSpace(*content) != "" { return *content, nil } } if prompt.PromptContent != nil && strings.TrimSpace(*prompt.PromptContent) != "" { return *prompt.PromptContent, nil } if prompt.PromptAssetKey == nil || strings.TrimSpace(*prompt.PromptAssetKey) == "" || asset == nil { return "", nil } content, err := asset.Get(ctx, strings.TrimSpace(*prompt.PromptAssetKey)) if err != nil { if errors.Is(err, objectstorage.ErrObjectNotFound) || errors.Is(err, objectstorage.ErrNotConfigured) { return "", nil } return "", err } return content, nil }