/* * 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)) }