init push
This commit is contained in:
115
backend/migration/fns/0002_create_bot_auth.go
Normal file
115
backend/migration/fns/0002_create_bot_auth.go
Normal file
@@ -0,0 +1,115 @@
|
||||
package fns
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/chaitin/panda-wiki/domain"
|
||||
"github.com/chaitin/panda-wiki/log"
|
||||
)
|
||||
|
||||
type MigrationCreateBotAuth struct {
|
||||
Name string
|
||||
logger *log.Logger
|
||||
}
|
||||
|
||||
func NewMigrationCreateBotAuth(logger *log.Logger) *MigrationCreateBotAuth {
|
||||
return &MigrationCreateBotAuth{
|
||||
Name: "0002_create_bot_auth",
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MigrationCreateBotAuth) Execute(tx *gorm.DB) error {
|
||||
ctx := context.Background()
|
||||
|
||||
// 获取所有机器人类型的应用
|
||||
var apps []domain.App
|
||||
if err := tx.WithContext(ctx).Where("type IN ?", []domain.AppType{
|
||||
domain.AppTypeWidget,
|
||||
domain.AppTypeDingTalkBot,
|
||||
domain.AppTypeFeishuBot,
|
||||
domain.AppTypeWechatBot,
|
||||
domain.AppTypeWechatServiceBot,
|
||||
domain.AppTypeDisCordBot,
|
||||
domain.AppTypeWechatOfficialAccount,
|
||||
}).Find(&apps).Error; err != nil {
|
||||
return fmt.Errorf("failed to get apps: %w", err)
|
||||
}
|
||||
|
||||
m.logger.Info("found apps for bot auth creation", log.Int("count", len(apps)))
|
||||
|
||||
for _, app := range apps {
|
||||
sourceType := app.Type.ToSourceType()
|
||||
if sourceType == "" {
|
||||
m.logger.Warn("app type has no corresponding source type", log.String("app_id", app.ID), log.Any("app_type", uint8(app.Type)))
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查是否需要创建认证记录(检查应用是否启用)
|
||||
shouldCreateAuth := false
|
||||
|
||||
switch app.Type {
|
||||
case domain.AppTypeWidget:
|
||||
shouldCreateAuth = app.Settings.WidgetBotSettings.IsOpen
|
||||
case domain.AppTypeDingTalkBot:
|
||||
shouldCreateAuth = app.Settings.DingTalkBotIsEnabled != nil && *app.Settings.DingTalkBotIsEnabled
|
||||
case domain.AppTypeFeishuBot:
|
||||
shouldCreateAuth = app.Settings.FeishuBotIsEnabled != nil && *app.Settings.FeishuBotIsEnabled
|
||||
case domain.AppTypeWechatBot:
|
||||
shouldCreateAuth = app.Settings.WeChatAppIsEnabled != nil && *app.Settings.WeChatAppIsEnabled
|
||||
case domain.AppTypeWechatServiceBot:
|
||||
shouldCreateAuth = app.Settings.WeChatServiceIsEnabled != nil && *app.Settings.WeChatServiceIsEnabled
|
||||
case domain.AppTypeDisCordBot:
|
||||
shouldCreateAuth = app.Settings.DiscordBotIsEnabled != nil && *app.Settings.DiscordBotIsEnabled
|
||||
case domain.AppTypeWechatOfficialAccount:
|
||||
shouldCreateAuth = app.Settings.WechatOfficialAccountIsEnabled != nil && *app.Settings.WechatOfficialAccountIsEnabled
|
||||
}
|
||||
|
||||
if !shouldCreateAuth {
|
||||
m.logger.Debug("app is not enabled, skipping auth creation", log.String("app_id", app.ID), log.String("source_type", string(sourceType)))
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查是否已存在该类型的认证记录
|
||||
var existingAuthCount int64
|
||||
if err := tx.WithContext(ctx).Model(&domain.Auth{}).
|
||||
Where("kb_id = ? AND source_type = ?", app.KBID, string(sourceType)).
|
||||
Count(&existingAuthCount).Error; err != nil {
|
||||
return fmt.Errorf("failed to check existing auth for kb_id %s, source_type %s: %w", app.KBID, sourceType, err)
|
||||
}
|
||||
|
||||
if existingAuthCount > 0 {
|
||||
m.logger.Debug("auth already exists, skipping", log.String("kb_id", app.KBID), log.String("source_type", string(sourceType)))
|
||||
continue
|
||||
}
|
||||
|
||||
// 创建新的认证记录
|
||||
auth := &domain.Auth{
|
||||
KBID: app.KBID,
|
||||
UnionID: fmt.Sprintf("bot_%s_%s", app.ID, sourceType),
|
||||
SourceType: sourceType,
|
||||
LastLoginTime: time.Now(),
|
||||
UserInfo: domain.AuthUserInfo{
|
||||
Username: sourceType.Name(),
|
||||
},
|
||||
}
|
||||
|
||||
if err := tx.WithContext(ctx).Create(auth).Error; err != nil {
|
||||
return fmt.Errorf("failed to create auth for kb_id %s, source_type %s: %w", app.KBID, sourceType, err)
|
||||
}
|
||||
|
||||
m.logger.Info("created bot auth",
|
||||
log.String("kb_id", app.KBID),
|
||||
log.String("app_id", app.ID),
|
||||
log.String("source_type", string(sourceType)),
|
||||
log.String("union_id", auth.UnionID),
|
||||
log.Any("auth_id", auth.ID))
|
||||
}
|
||||
|
||||
m.logger.Info("bot auth migration completed successfully")
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user