♻️ Refactor synchronization service
This commit is contained in:
61
internal/syncer/resource/adapter.go
Normal file
61
internal/syncer/resource/adapter.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package resource
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sort"
|
||||
"voidraft/internal/syncer/snapshot"
|
||||
)
|
||||
|
||||
// Adapter 描述单类资源的导出与应用能力。
|
||||
type Adapter interface {
|
||||
Kind() string
|
||||
Export(ctx context.Context) ([]snapshot.Record, error)
|
||||
Apply(ctx context.Context, records []snapshot.Record) error
|
||||
}
|
||||
|
||||
// Registry 聚合所有资源适配器,并实现快照导入导出接口。
|
||||
type Registry struct {
|
||||
adapters []Adapter
|
||||
}
|
||||
|
||||
// NewRegistry 创建新的资源注册表。
|
||||
func NewRegistry(adapters ...Adapter) *Registry {
|
||||
return &Registry{adapters: adapters}
|
||||
}
|
||||
|
||||
// Export 导出所有已注册资源的快照。
|
||||
func (r *Registry) Export(ctx context.Context) (*snapshot.Snapshot, error) {
|
||||
snap := snapshot.New()
|
||||
|
||||
for _, adapter := range r.adapters {
|
||||
records, err := adapter.Export(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(records) == 0 {
|
||||
continue
|
||||
}
|
||||
sort.Slice(records, func(i int, j int) bool {
|
||||
return records[i].ID < records[j].ID
|
||||
})
|
||||
snap.Resources[adapter.Kind()] = records
|
||||
}
|
||||
|
||||
return snap, nil
|
||||
}
|
||||
|
||||
// Apply 将快照内容应用到本地资源。
|
||||
func (r *Registry) Apply(ctx context.Context, snap *snapshot.Snapshot) error {
|
||||
if snap == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, adapter := range r.adapters {
|
||||
records := snap.Resources[adapter.Kind()]
|
||||
if err := adapter.Apply(ctx, records); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user