93 lines
1.8 KiB
Go
93 lines
1.8 KiB
Go
package document_repo
|
|
|
|
import (
|
|
"context"
|
|
|
|
cache_loader "github.com/XingfenD/yoresee_doc/internal/cache"
|
|
"github.com/XingfenD/yoresee_doc/internal/model"
|
|
"github.com/XingfenD/yoresee_doc/pkg/key"
|
|
"github.com/redis/go-redis/v9"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type DocumentRepository struct {
|
|
db *gorm.DB
|
|
redis *redis.Client
|
|
Loader cache_loader.Loader
|
|
}
|
|
|
|
func NewDocumentRepository(db *gorm.DB, redis *redis.Client) *DocumentRepository {
|
|
return &DocumentRepository{
|
|
db: db,
|
|
redis: redis,
|
|
Loader: *cache_loader.NewLoader(redis),
|
|
}
|
|
}
|
|
|
|
type DocumentDeleteOperation struct {
|
|
repo *DocumentRepository
|
|
id int64
|
|
tx *gorm.DB
|
|
ctx context.Context
|
|
}
|
|
|
|
func (r *DocumentRepository) Delete(id int64) *DocumentDeleteOperation {
|
|
return &DocumentDeleteOperation{
|
|
repo: r,
|
|
id: id,
|
|
ctx: context.Background(),
|
|
}
|
|
}
|
|
|
|
func (op *DocumentDeleteOperation) WithTx(tx *gorm.DB) *DocumentDeleteOperation {
|
|
op.tx = tx
|
|
return op
|
|
}
|
|
|
|
func (op *DocumentDeleteOperation) WithContext(ctx context.Context) *DocumentDeleteOperation {
|
|
op.ctx = ctx
|
|
return op
|
|
}
|
|
|
|
func (op *DocumentDeleteOperation) Exec() error {
|
|
var doc model.Document
|
|
var db *gorm.DB
|
|
var err error
|
|
|
|
if op.tx != nil {
|
|
db = op.tx
|
|
} else {
|
|
db = op.repo.db
|
|
}
|
|
|
|
if err := db.First(&doc, op.id).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
if op.tx == nil {
|
|
db = db.Begin()
|
|
defer func() {
|
|
if err != nil {
|
|
db.Rollback()
|
|
} else {
|
|
db.Commit()
|
|
}
|
|
}()
|
|
}
|
|
|
|
if err := db.Delete(&model.Document{}, op.id).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
if op.tx == nil {
|
|
docCacheKey := key.KeyModelByExternalID(key.KeyObjectTypeEnum_Doc, doc.ExternalID)
|
|
if err := op.repo.redis.Del(op.ctx, docCacheKey).Err(); err != nil {
|
|
}
|
|
|
|
if err := op.repo.BumpSubtreeVersionsByPath(op.ctx, doc.Path); err != nil {
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|