package db import ( "fmt" "time" jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types" "gorm.io/gorm" ) type BucketDB struct { *DB } func (db *DB) Bucket() *BucketDB { return &BucketDB{DB: db} } func (db *BucketDB) GetByID(ctx SQLContext, bucketID jcstypes.BucketID) (jcstypes.Bucket, error) { var ret jcstypes.Bucket err := ctx.Table("Bucket").Where("BucketID = ?", bucketID).First(&ret).Error return ret, err } func (db *BucketDB) GetByName(ctx SQLContext, bucketName string) (jcstypes.Bucket, error) { var ret jcstypes.Bucket err := ctx.Table("Bucket").Where("Name = ?", bucketName).First(&ret).Error return ret, err } func (*BucketDB) GetAll(ctx SQLContext) ([]jcstypes.Bucket, error) { var ret []jcstypes.Bucket err := ctx.Table("Bucket").Find(&ret).Error return ret, err } func (db *BucketDB) Create(ctx SQLContext, bucketName string, createTime time.Time) (jcstypes.Bucket, error) { var bucketID int64 err := ctx.Table("Bucket"). Select("Bucket.BucketID"). Where("Bucket.Name = ?", bucketName). Scan(&bucketID).Error if err != nil { return jcstypes.Bucket{}, err } if bucketID > 0 { return jcstypes.Bucket{}, gorm.ErrDuplicatedKey } newBucket := jcstypes.Bucket{Name: bucketName, CreateTime: createTime} if err := ctx.Table("Bucket").Create(&newBucket).Error; err != nil { return jcstypes.Bucket{}, fmt.Errorf("insert bucket failed, err: %w", err) } return newBucket, nil } func (db *BucketDB) Rename(ctx SQLContext, bucketID jcstypes.BucketID, bucketName string) error { return ctx.Table("Bucket").Where("BucketID = ?", bucketID).Update("Name", bucketName).Error } func (db *BucketDB) Delete(ctx SQLContext, bucketID jcstypes.BucketID) error { return ctx.Delete(&jcstypes.Bucket{}, "BucketID = ?", bucketID).Error } func (db *BucketDB) DeleteComplete(tx SQLContext, bucketID jcstypes.BucketID) error { pkgs, err := db.Package().GetBucketPackages(tx, bucketID) if err != nil { return err } for _, pkg := range pkgs { err := db.Package().DeleteComplete(tx, pkg.PackageID) if err != nil { return err } } return db.Bucket().Delete(tx, bucketID) }