diff --git a/internal/biz/database.go b/internal/biz/database.go index 16741c27..c7986559 100644 --- a/internal/biz/database.go +++ b/internal/biz/database.go @@ -1,6 +1,7 @@ package biz import ( + "errors" "time" "github.com/go-rat/utils/crypt" @@ -20,6 +21,8 @@ type Database struct { Remark string `gorm:"not null" json:"remark"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` + + DatabaseItems []*DatabaseItem `json:"-"` } func (r *Database) BeforeSave(tx *gorm.DB) error { @@ -50,3 +53,17 @@ func (r *Database) AfterFind(tx *gorm.DB) error { return nil } + +func (r *Database) BeforeDelete(tx *gorm.DB) error { + if r.Name == "local_mysql" && !app.IsCli { + return errors.New("can't delete local_mysql, if you must delete it, please uninstall mysql") + } + if r.Name == "local_postgresql" && !app.IsCli { + return errors.New("can't delete local_postgresql, if you must delete it, please uninstall postgresql") + } + if r.Name == "local_redis" && !app.IsCli { + return errors.New("can't delete local_redis, if you must delete it, please uninstall redis") + } + + return nil +} diff --git a/internal/biz/database_item.go b/internal/biz/database_item.go new file mode 100644 index 00000000..4d5040af --- /dev/null +++ b/internal/biz/database_item.go @@ -0,0 +1,59 @@ +package biz + +import ( + "time" + + "github.com/go-rat/utils/crypt" + "gorm.io/gorm" + + "github.com/TheTNB/panel/internal/app" +) + +type DatabaseItemStatus string + +const ( + DatabaseItemStatusNormal DatabaseItemStatus = "normal" + DatabaseItemStatusInvalid DatabaseItemStatus = "invalid" +) + +type DatabaseItem struct { + ID uint `gorm:"primaryKey" json:"id"` + DatabaseID uint `gorm:"not null" json:"database_id"` + Name string `gorm:"not null" json:"name"` + Status DatabaseItemStatus `gorm:"not null" json:"status"` + Username string `gorm:"not null" json:"username"` + Password string `gorm:"not null" json:"password"` + Remark string `gorm:"not null" json:"remark"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + + Database *Database `json:"database"` +} + +func (r *DatabaseItem) BeforeSave(tx *gorm.DB) error { + crypter, err := crypt.NewXChacha20Poly1305([]byte(app.Key)) + if err != nil { + return err + } + + r.Password, err = crypter.Encrypt([]byte(r.Password)) + if err != nil { + return err + } + + return nil +} + +func (r *DatabaseItem) AfterFind(tx *gorm.DB) error { + crypter, err := crypt.NewXChacha20Poly1305([]byte(app.Key)) + if err != nil { + return err + } + + password, err := crypter.Decrypt(r.Password) + if err == nil { + r.Password = string(password) + } + + return nil +} diff --git a/internal/migration/v1.go b/internal/migration/v1.go index 8a5d5ad7..f300a5ac 100644 --- a/internal/migration/v1.go +++ b/internal/migration/v1.go @@ -55,4 +55,17 @@ func init() { ) }, }) + Migrations = append(Migrations, &gormigrate.Migration{ + ID: "20241107-database-item", + Migrate: func(tx *gorm.DB) error { + return tx.AutoMigrate( + &biz.DatabaseItem{}, + ) + }, + Rollback: func(tx *gorm.DB) error { + return tx.Migrator().DropTable( + &biz.DatabaseItem{}, + ) + }, + }) }