Files
devstar/models/appstore/user_app_instance.go
2025-11-25 14:24:05 +08:00

140 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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))
}