47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package orchestration
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"git.nianxx.cn/wangxuming/NianAIGC/backend/internal/assets"
|
|
"git.nianxx.cn/wangxuming/NianAIGC/backend/internal/jobs"
|
|
)
|
|
|
|
type ScopedAssetDeleter interface {
|
|
Delete(context.Context, assets.Scope, string) (assets.Asset, error)
|
|
}
|
|
|
|
type AssetArtifacts struct{ assets ScopedAssetDeleter }
|
|
|
|
func NewAssetArtifacts(service ScopedAssetDeleter) *AssetArtifacts {
|
|
return &AssetArtifacts{assets: service}
|
|
}
|
|
|
|
// DeleteOutputs is retry-safe: already absent objects are treated as deleted,
|
|
// while persistence/storage failures stop job deletion.
|
|
func (adapter *AssetArtifacts) DeleteOutputs(ctx context.Context, job jobs.Job) ([]string, error) {
|
|
if adapter == nil || adapter.assets == nil || job.OwnerID == "" {
|
|
return nil, errors.New("delete generation output assets")
|
|
}
|
|
seen := make(map[string]bool, len(job.OutputAssetIDs))
|
|
deleted := make([]string, 0, len(job.OutputAssetIDs))
|
|
for _, id := range job.OutputAssetIDs {
|
|
if id == "" || seen[id] {
|
|
continue
|
|
}
|
|
seen[id] = true
|
|
asset, err := adapter.assets.Delete(ctx, assets.PlatformScope(job.OwnerID), id)
|
|
if errors.Is(err, assets.ErrNotFound) {
|
|
continue
|
|
}
|
|
if err != nil {
|
|
return nil, errors.New("delete generation output assets")
|
|
}
|
|
deleted = append(deleted, asset.ID)
|
|
}
|
|
return deleted, nil
|
|
}
|
|
|
|
var _ jobs.ArtifactDeleter = (*AssetArtifacts)(nil)
|