52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
package generation
|
||
|
||
import (
|
||
"context"
|
||
"time"
|
||
|
||
"infinite-canvas/backend/internal/model"
|
||
"infinite-canvas/backend/internal/protocol"
|
||
)
|
||
|
||
// MediaResolver 水合参考媒体(资源 URL / data URL),由组合根注入,避免 generation → service 回环。
|
||
type MediaResolver interface {
|
||
HydrateGenerationMedia(userID string, input *Input, preferURL bool) error
|
||
}
|
||
|
||
// TaskProgress 写入任务进度/日志。
|
||
type TaskProgress interface {
|
||
SyncProviderTaskProgress(taskID string, responseBody []byte)
|
||
Log(userID, taskID, level, message, payload string) error
|
||
}
|
||
|
||
// BillingHooks 生成路径上的计费终态钩子。
|
||
type BillingHooks interface {
|
||
MarkBillingUncertain(taskID, reason string) error
|
||
Settle(taskID string) error
|
||
Refund(taskID, reason string) error
|
||
RestoreRefunded(taskID, reason string) error
|
||
}
|
||
|
||
// ChannelLimiter 渠道并发槽与熔断结果。
|
||
type ChannelLimiter interface {
|
||
AcquireChannelSlot(ctx context.Context, channelID string) (release func(), err error)
|
||
RecordChannelResult(channelID string, success bool)
|
||
}
|
||
|
||
// MediaPersister 持久化生成结果与资源 URL。
|
||
type MediaPersister interface {
|
||
PersistGeneratedMediaResult(ctx context.Context, userID, taskID string, result map[string]interface{}) (map[string]interface{}, error)
|
||
DirectResourceURL(resource *model.Resource, expiresAt time.Time) (string, error)
|
||
}
|
||
|
||
// Deps 是 Engine 的外部端口集合;禁止持有组合根或回环到 service。
|
||
type Deps struct {
|
||
Media MediaResolver
|
||
Progress TaskProgress
|
||
Billing BillingHooks
|
||
Channel ChannelLimiter
|
||
Persist MediaPersister
|
||
// Registry 可选;为空时 Engine 使用官方插件包回退表。
|
||
Registry *protocol.Registry
|
||
}
|