140 lines
4.0 KiB
Go
140 lines
4.0 KiB
Go
/*
|
||
* 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))
|
||
}
|