Files
devstar/models/appstore/user_app_instance.go

140 lines
4.0 KiB
Go
Raw Normal View History

2025-11-19 21:40:10 +08:00
/*
* Copyright (c) Mengning Software. 2025. All rights reserved.
* Authors: DevStar Team, panshuxiao
* Create: 2025-11-19
* Description: Represents user app instances and DB helpers.
*/
package appstore
import (
"context"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/timeutil"
"xorm.io/builder"
)
// UserAppInstance 用户应用实例
type UserAppInstance struct {
ID int64 `xorm:"pk autoincr"`
UserID int64 `xorm:"INDEX NOT NULL"` // 用户ID
AppID string `xorm:"INDEX NOT NULL"` // 应用模板ID
InstanceName string `xorm:"NOT NULL"` // 实例名称(用户自定义)
// 用户配置
UserConfig string `xorm:"TEXT"` // 用户配置JSON
MergedApp string `xorm:"TEXT"` // 合并后的完整应用配置JSON
// 部署信息
DeployType string `xorm:"NOT NULL"` // 实际部署类型 (kubernetes/docker)
// Kubernetes 凭据URL + Token
K8sURL string `xorm:"TEXT"`
K8sToken string `xorm:"TEXT"`
// 元数据
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}
// TableName 设置表名
func (uai *UserAppInstance) TableName() string {
return "user_app_instance"
}
// BeforeInsert 插入前的钩子
func (uai *UserAppInstance) BeforeInsert() {
uai.CreatedUnix = timeutil.TimeStampNow()
uai.UpdatedUnix = timeutil.TimeStampNow()
}
// BeforeUpdate 更新前的钩子
func (uai *UserAppInstance) BeforeUpdate() {
uai.UpdatedUnix = timeutil.TimeStampNow()
}
// GetUserAppInstances 按用户查询应用实例
func GetUserAppInstances(ctx context.Context, userID int64) ([]*UserAppInstance, error) {
return db.Find[UserAppInstance](ctx, FindUserAppInstanceOptions{
UserID: userID,
})
}
// GetUserAppInstance 查询特定应用实例
func GetUserAppInstance(ctx context.Context, userID, instanceID int64) (*UserAppInstance, error) {
instance := new(UserAppInstance)
has, err := db.GetEngine(ctx).Where("id = ? AND user_id = ?", instanceID, userID).Get(instance)
if err != nil {
return nil, err
}
if !has {
return nil, nil
}
return instance, nil
}
// GetUserAppInstanceByAppID 按应用ID查询用户的实例
func GetUserAppInstanceByAppID(ctx context.Context, userID int64, appID string) (*UserAppInstance, error) {
instance := new(UserAppInstance)
has, err := db.GetEngine(ctx).Where("user_id = ? AND app_id = ?", userID, appID).Get(instance)
if err != nil {
return nil, err
}
if !has {
return nil, nil
}
return instance, nil
}
// CreateUserAppInstance 创建用户应用实例
func CreateUserAppInstance(ctx context.Context, instance *UserAppInstance) error {
return db.Insert(ctx, instance)
}
// UpdateUserAppInstance 更新用户应用实例
func UpdateUserAppInstance(ctx context.Context, instance *UserAppInstance) error {
_, err := db.GetEngine(ctx).ID(instance.ID).Update(instance)
return err
}
// DeleteUserAppInstance 删除用户应用实例
func DeleteUserAppInstance(ctx context.Context, userID, instanceID int64) error {
_, err := db.GetEngine(ctx).Where("id = ? AND user_id = ?", instanceID, userID).Delete(&UserAppInstance{})
return err
}
// DeleteUserAppInstanceByAppID 按应用ID删除用户实例
func DeleteUserAppInstanceByAppID(ctx context.Context, userID int64, appID string) error {
_, err := db.GetEngine(ctx).Where("user_id = ? AND app_id = ?", userID, appID).Delete(&UserAppInstance{})
return err
}
// FindUserAppInstanceOptions 查询选项
type FindUserAppInstanceOptions struct {
db.ListOptions
UserID int64 // 用户ID
AppID string // 应用ID可选
}
// ToConds 转换为查询条件
func (opts FindUserAppInstanceOptions) ToConds() builder.Cond {
conds := builder.NewCond()
if opts.UserID != 0 {
conds = conds.And(builder.Eq{"user_id": opts.UserID})
}
if opts.AppID != "" {
conds = conds.And(builder.Eq{"app_id": opts.AppID})
}
return conds
}
// ToOrders 转换为排序条件
func (opts FindUserAppInstanceOptions) ToOrders() string {
return "id DESC"
}
func init() {
db.RegisterModel(new(UserAppInstance))
}