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.
|
|
|
|
|
|
*/
|
2025-09-07 10:34:06 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
// 部署信息
|
2025-11-25 14:24:05 +08:00
|
|
|
|
DeployType string `xorm:"NOT NULL"` // 实际部署类型 (kubernetes/docker)
|
|
|
|
|
|
|
|
|
|
|
|
// Kubernetes 凭据(URL + Token)
|
|
|
|
|
|
K8sURL string `xorm:"TEXT"`
|
|
|
|
|
|
K8sToken string `xorm:"TEXT"`
|
2025-09-07 10:34:06 +08:00
|
|
|
|
|
|
|
|
|
|
// 元数据
|
|
|
|
|
|
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))
|
|
|
|
|
|
}
|